Board logo

標題: [原創] VBA網路爬蟲-XMLHTTP物件 [打印本頁]

作者: iamaraymond    時間: 2018-5-9 13:59     標題: VBA網路爬蟲-XMLHTTP物件

本帖最後由 iamaraymond 於 2018-5-9 14:11 編輯

之前的文:
http://forum.twbts.com/viewthread.php?tid=20748&fromuid=30076

要使用XMLHTTP,首先要先引用XMLHTTP物件
引用是一個甚麼概念呢?
VBA最基本的功能大部分是侷限在Excel的內部操作上
而引用則是把VBA帶出了Excel,來到外面的世界
變得可以操控文件、資料夾、IE瀏覽器等等
就像是請來了一個專家,你用VBA告訴這個專家我要做甚麼
舉大家比較熟的IE為例,其實當大家在使用createObject("InternetExplorer.Application")時
你就像聘請一位專家,當你用VBA寫下 IE.navigate"網址",就是請他把IE瀏覽到某個網頁

那如果我們今天要聘請"Microsoft.XMLHTTP"這位專家時該怎麼做呢?
引用有2種方法:Early Binding 和 Late Binding

Early Binding就是在工具->設定引用項目->勾選「Microsoft XML,v6.0」
優點是程式執行會比較快(但我沒實測過),編寫程式時會跑出預設字
但缺點是當你把程式分享給別人時,若對方沒勾選就會出錯
大家一般看到的「使用者自訂型態尚未定義」,這個錯誤就是代表你沒有勾選你要用的項目

因此個人比較喜歡用Late Binding,也就是 CreateObject("Microsoft.XMLHTTP")
比較沒有相容性的問題,而且預設字其實也沒有很多,打久了就會記得
一般常用的:
1. open "發送方法","網址",false
在網路上發送request的方式有好幾種,例如GET、POST、PUT、Delete
但若只是要爬蟲的話,只會使用GET和POST方法,大部分網站通常都是用GET方法在傳送資料,POST比較少

2. send "Request Body"
在GET方法下,不需要Request Body,Request Body是在POST才比較會用到

3. responseText
可得到下載的內容

4. responseBody
當responseText出現亂碼時才使用

以我在 http://forum.twbts.com/redirect. ... 3&fromuid=30076 這裡的回文為例
通常程式會像這樣
  1. Sub test()

  2. Cells.Clear

  3. 'stockno = InputBox("輸入股票代號")

  4. Dim t: t = Timer
  5. Dim myArr(1 To 1500, 1 To 6)

  6. '*******************************************
  7. 'Part1 使用Late Binding

  8. Dim myXML As Object
  9. Set myXML = CreateObject("Microsoft.XMLHTTP")
  10. '*******************************************
  11. 'Part2 抓取資料
  12. With myXML
  13.     .Open "GET", "http://jdata.yuanta.com.tw/Z/ZB/ZBH/CZKC0.djbcd?a=EB09999&b=W&c=1440", False
  14.     .send
  15.     myText = .responseText
  16. End With
  17. '*******************************************
  18. 'Part3 整理資料
  19.     myText1s = Split(myText, " ")
  20.     j = 1
  21.     For Each myText1 In myText1s
  22.         i = 1
  23.         myText2s = Split(myText1, ",")
  24.         For Each myText2 In myText2s
  25.             If j > 6 Then Exit For
  26.             myArr(i, j) = myText2
  27.             i = i + 1
  28.         Next
  29.         j = j + 1
  30.     Next

  31. [A2:F2] = Array("日期", "開", "高", "低", "收", "成交量")
  32. [A3].Resize(1500, 6).Value = myArr

  33. Set myXML = Nothing

  34. Debug.Print Format(Timer - t, "0.00秒")

  35. End Sub
複製代碼
此程式可以簡單分成3部分

1.使用Late Binding->也就是Set myXML = CreateObject("Microsoft.XMLHTTP")
2.找出資料來源,並下載下來
3.整理下載下來的資料,存進儲存格中

通常大家卡的都是第2步驟:下載資料,不知道哪一個request包含了資料
或是即使找到資料,卻因為網站各種防護機制而下載不下來
因此下次就來教大家如何去找出藏有資料的request

本系列帖子也會在我的Blog更新
https://raymondchiendtrt.blogspot.tw/
作者: Scott090    時間: 2018-5-9 22:20

回復 1# iamaraymond


    拜讀了

期待下一課的到來

感恩
作者: f3202    時間: 2018-5-13 08:26

感謝教學
期待新課程
作者: iamaraymond    時間: 2018-5-13 10:05

感謝2位,原本想發一個怎麼找到別人資料庫位置的文,只是最近一位也是寫爬蟲的前輩提醒我,其實在論壇公開別人資料庫的位置就不是很好了,更何況是在公開的論壇發Step By Step破解的文。。。,
好吧,所以小弟在思考一下要如何寫比較好,也感謝2位耐心等候
作者: nolookyou    時間: 2018-5-13 12:08

感謝版大熱心發教學文
小弟對資料庫也有興趣
期待版大的找資料庫教程




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)