返回列表 上一主題 發帖

[發問] VBA自動抓取finance.yahoo

回復 1# DanielWONG

試試看~
  1. Sub test()

  2. Cells.Clear

  3. Dim myXML As Object
  4. Set myXML = CreateObject("Winhttp.WinhttpRequest.5.1")

  5. With myXML
  6.     .Open "POST", "https://rbwm-api.hsbc.com.hk/pws-hk-hase-mpfunitprice-papi-prod-proxy/v1/mpf/getSuperTrustPlus", False
  7.     .setRequestHeader "content-type", "application/json;charset=UTF-8"
  8.     body = "{""locale"":""en""}"
  9.     .send body
  10.    
  11.     myText1 = .responseText
  12.     myText2 = Split(myText1, """trustPlusList"":[{""")(1)
  13.     j = 1
  14.     myStrArr = Array("FUND_NAME", "UNIT_PRICE_DATE", "FUND_CURRENCY", "ASK_PRICE", "BID_PRICE")
  15.     For Each myStr In myStrArr
  16.         myText3 = Split(myText2, myStr)
  17.         For i = 1 To UBound(myText3)
  18.             Cells(i + 1, j) = Replace(Replace(Split(myText3(i), ",")(0), ":", ""), Chr(34), "")
  19.         Next
  20.         j = j + 1
  21.     Next
  22.     Range("A1").Resize(1, UBound(myStrArr) + 1).Value = myStrArr
  23.     'Debug.Print .responseText
  24. End With
  25. Set myXML = Nothing
  26. End Sub
複製代碼
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 1# DanielWONG

執行結果應該如下圖


我看他還有蠻多資料可以用的

(但我不知道那些資料的用途,所以就沒加了XD)
如果需要的話可自行加在myStrArr裡
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 6# DanielWONG

如果不需要日期的話,只要改一下myStrArr就好
myStrArr = Array("FUND_NAME", "FUND_CURRENCY", "ASK_PRICE", "BID_PRICE")

至於只取那三檔基金的資料
我覺得比較有彈性的作法是在旁邊直接用vlookup函數
保持資料的完整性
以免日後若想要取其他基金的資料又要改一次程式
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 5# f3202

不好意思不是很了解你的意思
可以多說明一下嗎?
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 9# f3202

這應該可以使用您在另外一個帖子回的
http://forum.twbts.com/redirect. ... 3&fromuid=30076
xmlhttp+htmlfile來抓到
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 11# f3202

試試看
  1. Sub test()

  2. Dim t: t = Timer

  3. Cells.Clear

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

  6. Dim myHTML As Object
  7. Set myHTML = CreateObject("HTMLFile")

  8. With myXML
  9.     .Open "GET", "https://djinfo.cathaysec.com.tw/z/ze/zef/zef.djhtm", False
  10.     .send
  11.    
  12.     myHTML.body.innerHTML = convertraw(.responseBody)
  13.     Set myTrs = myHTML.getElementsByTagName("table")(2).getElementsByTagName("tbody")(0).getElementsByTagName("tr")
  14.     ReDim myArr(1 To myTrs.Length + 1, 1 To 4)
  15.     i = 1
  16.     For Each myTr In myTrs
  17.         Set myTds = myTr.getElementsByTagName("td")
  18.         j = 1
  19.         For Each myTd In myTds
  20.             myArr(i, j) = myTd.innerText
  21.             If myTd.innerText = "" Then
  22.                 myArr(i, j) = Right(Split(Split(Split(myTd.innerHTML, "GenLink2stk(")(1), "')")(0), "'")(1), 4) & Split(Split(Split(myTd.innerHTML, "GenLink2stk(")(1), "')")(0), "'")(3)
  23.             End If
  24.             j = j + 1
  25.         Next
  26.         i = i + 1
  27.     Next
  28.    
  29. End With
  30. Range("A1").Resize(UBound(myArr, 1), 4).Value = myArr
  31. Range("A1").WrapText = False
  32. Set myXML = Nothing
  33. Application.StatusBar = "抓取完畢,共花費" & Format(Timer - t, "0.00秒")

  34. End Sub
  35. Function convertraw(rawdata)

  36. Dim rawstr
  37. Set rawstr = CreateObject("adodb.stream")
  38. With rawstr
  39. .Type = 1
  40. .Mode = 3
  41. .Open
  42. .Write rawdata
  43. .Position = 0
  44. .Type = 2
  45. '繁體通常轉成big5就可以了,簡體通常是gb2312
  46. .Charset = "big5"
  47. convertraw = .ReadText
  48. .Close
  49. End With
  50. Set rawstr = Nothing

  51. End Function
複製代碼
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

回復 13# f3202

OK,你可以先研究一下程式碼
看如何改成抓第二個網址的資料
這樣比較容易進步
若有問題都可以問喔~
Excel VBA網頁資料收集教學:
http://forum.twbts.com/thread-20848-1-1.html

TOP

        靜思自在 : 犯錯出懺悔心,才能清淨無煩惱。
返回列表 上一主題