最近回復了許多帖子都是關於如何用VBA做網路爬蟲,抓取如股票資料等資訊,所以想說直接寫成一篇教學文,讓對此有興趣的朋友有個入門的管道,只是因為這些都是自學而來,若有錯誤或建議還請版主以及版上的各位高手不吝指教。
小弟學習使用VBA做網路爬蟲有一陣子了,抓過不少資料,也累積了一些心得
小弟比較熟悉的爬蟲方式有三種:
1.QueryTable(也有人稱QT法)
2.操控IE
3.XMLHTTP(這物件的兄弟蠻多的,如MSXML、WinHttp等等的)
其中1、2的方法在論壇中已經使用過許多次,建議大家如果有需要的話可以自行搜尋一下相關的帖子(或是之後我在寫教學文)
XMLHTTP似乎較少人運用,但就速度上來說,其實是比QT法和IE法快上好幾倍,簡單講一下原因,不知道各位有沒有想過,當我們在網路上按下某個連結時,到底發生了甚麼事呢?
在網路上有分Client端跟Server端,當按下連結時,Client端會發送許多Request到Server端,Server接收到Request後會回傳相對應的Response回來
用一個簡單的例子比喻,就像是你(Client)今天寄了一封信給你朋友A(Server),說你想要2330的股價資料,於是朋友A就把資料找出來寄回給你
所以說我們看到的網站就是,由你剛剛發出去的一大堆Request拿到的response組合起來的成果,就像拼拼圖一樣,有request拿回來「拼圖的框架」,有request拿回來「圖片」的拼圖,有request拿回來「數據」的拼圖等等的,最後把這些拼圖放在該放的地方,就變成了我們看到的網站
那為什麼XMLHTTP法會這麼快?
因為XMLHTTP是模擬發送一個會拿到「數據的拼圖」的request,換句話說,相較於前面所說的發送一大堆request,XMLHTTP只發送了一個request,而這個request能拿到數據的資料,所以時間上當然差異許多
但當然IE法也是有其優點,例如有些網站可能要登入後才會顯示資料,那這時理論上XMLHTTP應該也可以做到,但十分麻煩,這時我就會選擇用IE來抓資料。
先寫到這邊吧,小弟最近被各種deadline摧殘 QAQ
[本文視被deadline摧殘的程度更新]
請問我那錯了 , myTables 中沒有資料 ?? 但 myHTML 則有
回覆刪除Sub Test()
Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")
Dim myHTML As Object
Set myHTML = CreateObject("HTMLfile")
With myXML
.Open "GET", "https://mops.twse.com.tw/server-java/t164sb01?step=1&CO_ID=1723&SYEAR=2019&SSEASON=1&REPORT_ID=C", False
.send
myHTML.body.innerHTML = .responseText
t = 0
'Call delay(3)
Set myTables = myHTML.getElementsByTagName("table")(2)
For Each myTable In myTables
For Each myRow In myTable.Rows
For Each myCell In myRow.Cells
Debug.Print myCell.innerText & "---" & t
Next
Next
t = t + 1
Next
End With
Set myXML = Nothing
Set myHTML = Nothing
End Sub