Excel 股市資料抓取服務

提供Excel 股市資料抓取服務
可透過下列方式聯絡我
Email: iamaraymond@yahoo.com.tw
(FB請先加我好友再私訊,不然會跑到陌生訊息)

課程:
Excel VBA 金融資料抓取 | 打造股票研究系統 (學生數: 602,學員評價5顆星)
無痛起步-Excel VBA超入門實戰(學生數: 413,學員評價5顆星)


2018年5月9日 星期三

VBA網路爬蟲-XMLHTTP物件


之前的文
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

完整學習VBA自動化抓取網頁資料+資料圖表化,做出自己的股票研究系統

請參考
(學生數: 602,學員評價5顆星)

9 則留言:

  1. HI,Raymond

    冒昧請教如果使用XMLHTTP方法,再抓網頁的responseText時,回傳不是下載的內容
    (跟直接用網頁開檢視原始碼CTRL+U那頁不同),是什麼原因呢?

    回覆刪除
    回覆
    1. 哈囉,不太確定你的意思,有範例可以參考嗎?

      刪除
    2. 謝謝回應,似乎是對方在資料取得方面做了防護

      刪除
  2. 作者已經移除這則留言。

    回覆刪除
  3. 請問 http://jdata.yuanta.com.tw/ 所提供的資料,起始日是哪年哪天? 謝謝!

    回覆刪除
    回覆
    1. 歷史股價有1440筆資料,大約就是6年

      刪除
  4. 謝謝回覆,再請教這 "http://jdata.yuanta.com.tw/Z/ZB/ZBH/CZKC0.djbcd?a=EB09999&b=W&c=1440" 中, 對於參數有無完整說明之處? 謝謝!

    回覆刪除
  5. a指的是商品的編號
    b是指頻率,例如D是日K,W是周K
    c是資料數

    回覆刪除