Excel 股市資料抓取服務

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

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


2019年9月10日 星期二

躲進JavaScript裡的資料

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


程式碼: 
  1. Sub XMLHTTP()
  2.  
  3. Dim t: t = Timer
  4.  
  5. Dim myXML As Object
  6. Set myXML = CreateObject("Microsoft.XMLHTTP")
  7.  
  8. Dim myHTML As Object
  9. Set myHTML = CreateObject("HTMLFile")
  10.  
  11. With myXML
  12. .Open "GET", "https://jdata.yuanta.com.tw/z/zg/zgb/zgb0.djhtm?a=9800&b=9800&c=E&d=1", False
  13. .send
  14. myHTML.body.innerHTML = .responseText
  15. Dim myTable As Object
  16. Set myTable = myHTML.getElementsByTagName("Table")(3)
  17. Dim oRow, oCell
  18. Dim i As Integer, j As Integer
  19. Dim oCellText As String
  20. i = 1
  21. For Each oRow In myTable.Rows
  22. j = 1
  23. For Each oCell In oRow.Cells
  24. oCellText = oCell.innerText
  25. Cells(i, j).Value = oCellText
  26. j = j + 1
  27. Next oCell
  28. i = i + 1
  29. Next oRow
  30. End With
  31.  
  32. Set myXML = Nothing
  33.  
  34. Debug.Print Format(Timer - t, "0.00秒")
  35.  
  36. End Sub

成果圖

這是一個很好的問題

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

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

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

網頁部分原始碼:




完整程式碼:
  1. Sub XMLHTTP()
  2.  
  3. Dim t: t = Timer
  4.  
  5. Dim myXML As Object
  6. Set myXML = CreateObject("Microsoft.XMLHTTP")
  7.  
  8. Dim myHTML As Object
  9. Set myHTML = CreateObject("HTMLFile")
  10.  
  11. With myXML
  12. .Open "GET", "https://jdata.yuanta.com.tw/z/zg/zgb/zgb0.djhtm?a=9800&b=9800&c=E&d=1", False
  13. .send
  14. myHTML.body.innerHTML = .responseText
  15. Dim myTable As Object
  16. Set myTable = myHTML.getElementsByTagName("Table")(3)
  17. Dim oRow, oCell
  18. Dim i As Integer, j As Integer
  19. Dim oCellText As String
  20. i = 1
  21. For Each oRow In myTable.Rows
  22. j = 1
  23. For Each oCell In oRow.Cells
  24. oCellText = oCell.innerText
  25. If oCellText = "" Then
  26. Cells(i, j).Value = Split(Split(oRow.getElementsByTagName("script")(0).innerHTML, ",'")(1), "')")(0)
  27. Else
  28. Cells(i, j).Value = oCellText
  29. End If
  30. j = j + 1
  31. Next oCell
  32. i = i + 1
  33. Next oRow
  34. End With
  35.  
  36. Set myXML = Nothing
  37.  
  38. Debug.Print Format(Timer - t, "0.00秒")
  39.  
  40. End Sub

1 則留言:

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

    再次感謝老師

    回覆刪除