Board logo

標題: [原創] Excel VBA 自動抓取期交所 期貨每日交易行情 [打印本頁]

作者: iamaraymond    時間: 2018-5-30 00:51     標題: Excel VBA 自動抓取期交所 期貨每日交易行情

文章來源:https://raymondchiendtrt.blogspot.com/2018/05/excel-vba_29.html

這次的程式是可以依據使用者輸入的日期
來抓到當天的期貨資料

這次結合了幾個技巧
1.設定Requestheader
以我之前觀察到的,如果是用Microsoft.XMLHTTP
即使設定requestheader也是無效的
所以必須改用WinHttp.WinHttpRequest.5.1

2.轉碼
我平常能不用WinHttp就不用
因為使用這個物件常常就會變成亂碼
必須多使用轉碼程式才能取的資料(請見下方的convertraw function)

3.使用clipboard
這個物件很好用,會把在網站上的格式一併下載下來
所以如果你要抓的資料有合併儲存格(像goodinfo),或是有顏色等等的
可以用clipboard看看
但缺點就是createobject很難記XD,每次都要用查的
還有似乎不是每個表格(table)都抓的到,要試試看

4.使用application.wait
通常政府的網站若是抓太快很容易被鎖IP
所以利用此語法降低程式速度
一般來說設3秒就好,如果很怕被鎖可以再設久一點XD

大概是這樣,若有問題也歡迎在下方提出
  1. Sub test()

  2. Dim myXML As Object
  3. Set myXML = CreateObject("WinHttp.WinHttpRequest.5.1")

  4. Dim myHTML As Object
  5. Set myHTML = CreateObject("HTMLFile")

  6. Dim clipboard As Object
  7. Set clipboard = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

  8. ReDim myArr(1 To 10, 1 To 20)

  9. dateLR = Cells(Rows.Count, "A").End(xlUp).Row

  10. With myXML
  11.    
  12.     For dateRow = 6 To dateLR
  13.         Application.Wait Now() + TimeValue("00:00:03")
  14.         myM = Format(Month(Cells(dateRow, "A")), "00")
  15.         myD = Format(Day(Cells(dateRow, "A")), "00")
  16.         
  17.         .Open "POST", "http://www.taifex.com.tw/chinese/3/3_1_1.asp", False
  18.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  19.         .send "qtype=2&commodity_id=TX&commodity_id2=&market_code=0&goday=&dateaddcnt=0&DATA_DATE_Y=2018&DATA_DATE_M=05&DATA_DATE_D=22&syear=2018&smonth=" & myM & "&sday=" & myD & "&datestart=2018%2F05%2F15&MarketCode=0&commodity_idt=TX&commodity_id2t=&commodity_id2t2="
  20.         
  21.         myHTML.body.innerHTML = convertraw(.responseBody)
  22.         'Debug.Assert InStr(1, myText, "10368") <> 0
  23.         
  24.         Set myTables = myHTML.getElementsByTagName("table")
  25.         i = 1
  26.         For Each myTable In myTables
  27.             If myTable.getAttribute("width") = 965 Then
  28.             
  29.                 textLR = Cells(Rows.Count, "D").End(xlUp).Row
  30.                 textLR = IIf(textLR = 1, 5, textLR + 5)
  31.                 Cells(textLR, 4).Select
  32.                 Cells(textLR - 1, 4) = myTable.PreviousSibling.innerText
  33.                 Cells(textLR - 1, 4).WrapText = False
  34.                 With clipboard
  35.                     .SetText myTable.outerHTML
  36.                     .PutInClipboard
  37.                 End With
  38.                 Sheets("工作表1").PasteSpecial NoHTMLFormatting:=False

  39.                 Exit For
  40.             End If
  41.         Next
  42.         
  43.     Next
  44. End With
  45. Set myXML = Nothing

  46. End Sub
  47. Function convertraw(rawdata)

  48. Dim rawstr
  49. Set rawstr = CreateObject("adodb.stream")
  50. With rawstr
  51. .Type = 1
  52. .Mode = 3
  53. .Open
  54. .Write rawdata
  55. .Position = 0
  56. .Type = 2
  57. .Charset = "UTF-8"
  58. convertraw = .ReadText
  59. .Close
  60. End With
  61. Set rawstr = Nothing

  62. End Function
複製代碼
[attach]28780[/attach]

使用方式請參考影片
https://www.youtube.com/watch?v=Eg-2uYxa0q4
作者: netfish777    時間: 2018-6-3 23:31

文章來源:https://raymondchiendtrt.blogspot.com/2018/05/excel-vba_29.html

這次的程式是可以依據使用 ...
iamaraymond 發表於 2018-5-30 00:51



    請問能否自動抓取最近三十個交易日的資料?感謝
作者: iamaraymond    時間: 2018-6-9 13:13

回復 2# netfish777


哈囉抱歉,這幾天太忙,剛剛寫了一個新檔案
請參考
http://forum.twbts.com/thread-20860-1-1.html
作者: netfish777    時間: 2018-7-19 16:27

腓腸感謝無私分享




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)