返回列表 上一主題 發帖

[分享] 使用 XMLHTTP + ADODB.Stream 查詢保戶股權分散表

本帖最後由 stillfish00 於 2015-11-12 11:00 編輯

回復 1# 准提部林
自己也對網頁擷取自行摸索一段時間,以下是個人見解提供參考:
首先,我們要與(網頁)伺服器溝通,是透過對瀏覽器的操作(例如重新整理或網頁上的送出按鈕)
來發出"請求"(request)封包,經由網路傳給伺服器,
伺服器再經由網路返回"響應"(response)給瀏覽器。

這個"請求"封包中包含了 url , method , status , header , body 等等
GET和POST就是請求的方法(method)中最常見的兩種,
最大不同的地方在於:
GET是直接把要傳遞的參數附加在url字串後方
POST是把要傳遞的參數放在body。

假設
    sURL = "http://www.tdcc.com.tw/smWeb/QryStock.jsp"
    sArg = "SCA_DATE=20151106&SqlMethod=StockNo&StockNo=1101&StockName=&sub=查詢"
    sEncodeArg = UrlEncode(sArg)     
    'UrlEncode : 自訂Function,
    '編碼完 sEncodeArg = "SCA_DATE=20151106&SqlMethod=StockNo&StockNo=1101&StockName=&sub=%ACd%B8%DF"

GET附加的文字要經過Url Encode
POST放到body的內容可選擇不同編碼方式,但要在header中說明
所以XML通常會這樣寫:
  1. 'GET
  2. .Open "GET" , sURL & "?" & sEncodeArg
  3. .send
複製代碼
  1. 'POST
  2. .Open "POST" , sURL
  3. .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  4. .setRequestHeader "Content-Length", Len(sEncodeArg)
  5. .send (sEncodeArg)
複製代碼
1. 版主提到的取到舊資料,應是緩存(cache的關係)
    可考慮上述GET的send前加上
        .setRequestHeader "Pragma", "no-cache"
    或
        .setRequestHeader "Cache-Control", "no-cache"
    告訴網路中的節點(如proxy), 不要用你自己的cache資料返回給我
    URL加亂數也是類似道理,因為URL變了不容易有相同URL的cache資料
    (但亂數到同一個值還是有機會取到舊的)

2. URL Encode  Function,網路上找到的一般應該多是 for "utf-8"的,
無法把 "sub=查詢" 轉成 "sub=%ACd%B8%DF"  (所以當初有人問chrome為何無法decode)
http://www.mytju.com/classCode/tools/urlencode_big5.asp
這網站有線上的,可以知道for "big5" url encode 的結果
但不知道編碼邏輯,不好做成自定的 function
1

評分人數

    • 准提部林: 真是菁華出類, 倍增添益, 謝謝!金錢 + 5
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

本帖最後由 stillfish00 於 2015-11-13 18:25 編輯

回復 3# stillfish00
拼拼湊湊推導出來的編碼邏輯,若有發現錯誤請指點下,謝謝。
  1. Function UrlEncode_BIG5(s As String) As String
  2.     Dim c As Integer
  3.     Dim hiByte As Byte, loByte As Byte
  4.     Dim ar
  5.    
  6.     For i = 1 To Len(s)
  7.         c = Asc(Mid(s, i, 1))
  8.         hiByte = (c And &HFF00&) / &H100
  9.         loByte = c And &HFF&
  10.         If hiByte = 0 Then ar = Array(loByte) Else ar = Array(hiByte, loByte)
  11.         
  12.         For Each x In ar
  13.             If (x >= &H30 And x <= &H39) Or _
  14.                 (x >= &H41 And x <= &H5A) Or _
  15.                 (x >= &H61 And x <= &H7A) Then
  16.                 UrlEncode_BIG5 = UrlEncode_BIG5 & Chr(x)
  17.             Else
  18.                 UrlEncode_BIG5 = UrlEncode_BIG5 & "%" & Hex(x)
  19.             End If
  20.         Next
  21.     Next
  22. End Function
複製代碼
UrlEncode_BIG5("台泥") => "%A5x%AAd"
1

評分人數

    • 准提部林: 看來雖簡單, 不容易呀! 收下了, 謝謝!金錢 + 5
表達不清、題意不明確、沒附檔案格式、沒有討論問題的態度~~~~~~以上愛莫能助。

TOP

        靜思自在 : 要批評別人時,先想想自己是否完美無缺。
返回列表 上一主題