Excel 股市資料抓取服務

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

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


2019年9月10日 星期二

躲進JavaScript裡的資料

今天一位同學在抓券商資料時,使用XMLHTTP法,抓完發現有些個股名稱抓不到,但之前用IE法明明可以完整抓下來


程式碼: 
Sub XMLHTTP()

Dim t: t = Timer

Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")

Dim myHTML As Object
Set myHTML = CreateObject("HTMLFile")

With myXML
    .Open "GET", "https://jdata.yuanta.com.tw/z/zg/zgb/zgb0.djhtm?a=9800&b=9800&c=E&d=1", False
    .send
    
    myHTML.body.innerHTML = .responseText
    
    Dim myTable As Object
    Set myTable = myHTML.getElementsByTagName("Table")(3)
    
    Dim oRow, oCell
    Dim i As Integer, j As Integer
    Dim oCellText As String
    
    i = 1
    For Each oRow In myTable.Rows
        j = 1
        For Each oCell In oRow.Cells
            oCellText = oCell.innerText
            Cells(i, j).Value = oCellText
            j = j + 1
        Next oCell
        i = i + 1
    Next oRow
        
        
End With

Set myXML = Nothing

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

End Sub

成果圖

這是一個很好的問題

通常這種情況很有可能是因為JavaScript的關係,使用IE法時,我們是等網頁Loading完成之後再去抓資料,因此當然所有資料都抓的到

但在使用XMLHTTP法時,我們只從其中一個Request抓取資料,若碰上JavaScript就有可能會遺漏資料

不過幸運的是,遺漏的資料其實就藏在原本的Request裡
我們不用另外到JS類別的Request去尋找
由於資料是被放在Script這個標籤裡面,所以我們要用getElementsByTagName(“Script”)和innerHTML
再搭配Split來把資料取出來

網頁部分原始碼:




完整程式碼:
Sub XMLHTTP()

Dim t: t = Timer

Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")

Dim myHTML As Object
Set myHTML = CreateObject("HTMLFile")

With myXML
    .Open "GET", "https://jdata.yuanta.com.tw/z/zg/zgb/zgb0.djhtm?a=9800&b=9800&c=E&d=1", False
    .send
    
    myHTML.body.innerHTML = .responseText
    
    Dim myTable As Object
    Set myTable = myHTML.getElementsByTagName("Table")(3)
    
    Dim oRow, oCell
    Dim i As Integer, j As Integer
    Dim oCellText As String
    
    i = 1
    For Each oRow In myTable.Rows
        j = 1
        For Each oCell In oRow.Cells
            oCellText = oCell.innerText
            If oCellText = "" Then
                Cells(i, j).Value = Split(Split(oRow.getElementsByTagName("script")(0).innerHTML, ",'")(1), "')")(0)
            Else
                Cells(i, j).Value = oCellText
            End If
            
            j = j + 1
        Next oCell
        i = i + 1
    Next oRow
        
        
End With

Set myXML = Nothing

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

End Sub

1 則留言:

  1. 感謝老師的回覆
    想了很久,找了資料都沒找到如何編寫,經老師提點,終於可以完成了

    再次感謝老師

    回覆刪除