之前的文
VBA網路爬蟲(網路資料蒐集)--簡述原理
要使用XMLHTTP,首先要先引用XMLHTTP物件
引用是一個甚麼概念呢?
VBA最基本的功能大部分是侷限在Excel的內部操作上
而引用則是把VBA帶出了Excel,來到外面的世界
變得可以操控文件、資料夾、IE瀏覽器等等
就像是請來了一個專家,你用VBA告訴這個專家我要做甚麼
舉大家比較熟的IE為例,其實當大家在使用createObject("InternetExplorer.Application")時
你就像聘請一位專家,當你用VBA寫下 IE.navigate"網址",就是請他把IE瀏覽到某個網頁
那如果我們今天要聘請"Microsoft.XMLHTTP"這位專家時該怎麼做呢?要使用XMLHTTP,首先要先引用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.php?goto=findpost&ptid=20745&pid=103253&fromuid=30076 這裡的回文為例
通常程式會像這樣
Sub test()
Cells.Clear
'stockno = InputBox("輸入股票代號")
Dim t: t = Timer
Dim myArr(1 To 1500, 1 To 6)
'*******************************************
'Part1 使用Late Binding
Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")
'*******************************************
'Part2 抓取資料
With myXML
.Open "GET", "http://jdata.yuanta.com.tw/Z/ZB/ZBH/CZKC0.djbcd?a=EB09999&b=W&c=1440", False
.send
myText = .responseText
End With
'*******************************************
'Part3 整理資料
myText1s = Split(myText, " ")
j = 1
For Each myText1 In myText1s
i = 1
myText2s = Split(myText1, ",")
For Each myText2 In myText2s
If j > 6 Then Exit For
myArr(i, j) = myText2
i = i + 1
Next
j = j + 1
Next
[A2:F2] = Array("日期", "開", "高", "低", "收", "成交量")
[A3].Resize(1500, 6).Value = myArr
Set myXML = Nothing
Debug.Print Format(Timer - t, "0.00秒")
End Sub
此程式可以簡單分成3部分
1.使用Late Binding->也就是Set myXML = CreateObject("Microsoft.XMLHTTP")
2.找出資料來源,並下載下來
3.整理下載下來的資料,存進儲存格中
通常大家卡的都是第2步驟:下載資料,不知道哪一個request包含了資料
或是即使找到資料,卻因為網站各種防護機制而下載不下來
因此下次就來教大家如何去找出藏有資料的request
HI,Raymond
回覆刪除冒昧請教如果使用XMLHTTP方法,再抓網頁的responseText時,回傳不是下載的內容
(跟直接用網頁開檢視原始碼CTRL+U那頁不同),是什麼原因呢?
哈囉,不太確定你的意思,有範例可以參考嗎?
刪除謝謝回應,似乎是對方在資料取得方面做了防護
刪除作者已經移除這則留言。
回覆刪除請問 http://jdata.yuanta.com.tw/ 所提供的資料,起始日是哪年哪天? 謝謝!
回覆刪除歷史股價有1440筆資料,大約就是6年
刪除謝謝回覆,再請教這 "http://jdata.yuanta.com.tw/Z/ZB/ZBH/CZKC0.djbcd?a=EB09999&b=W&c=1440" 中, 對於參數有無完整說明之處? 謝謝!
回覆刪除a指的是商品的編號
回覆刪除b是指頻率,例如D是日K,W是周K
c是資料數
謝謝!
回覆刪除