Excel 股市資料抓取服務

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

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


2018年5月29日 星期二

Excel VBA 自動抓取期交所 期貨每日交易行情

Excel VBA 網路資料蒐集 完整教學:

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





Sub test()

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

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

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

ReDim myArr(1 To 10, 1 To 20)

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

With myXML
 
    For dateRow = 6 To dateLR
        Application.Wait Now() + TimeValue("00:00:03")
        myM = Format(Month(Cells(dateRow, "A")), "00")
        myD = Format(Day(Cells(dateRow, "A")), "00")
     
        .Open "POST", "http://www.taifex.com.tw/chinese/3/3_1_1.asp", False
        .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
        .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="
     
        myHTML.body.innerHTML = convertraw(.responseBody)
        'Debug.Assert InStr(1, myText, "10368") <> 0
     
        Set myTables = myHTML.getElementsByTagName("table")
        i = 1
        For Each myTable In myTables
            If myTable.getAttribute("width") = 965 Then
         
                textLR = Cells(Rows.Count, "D").End(xlUp).Row
                textLR = IIf(textLR = 1, 5, textLR + 5)
                Cells(textLR, 4).Select
                Cells(textLR - 1, 4) = myTable.PreviousSibling.innerText
                Cells(textLR - 1, 4).WrapText = False
                With clipboard
                    .SetText myTable.outerHTML
                    .PutInClipboard
                End With
                Sheets("工作表1").PasteSpecial NoHTMLFormatting:=False

                Exit For
            End If
        Next
     
    Next
End With
Set myXML = Nothing

End Sub
Function convertraw(rawdata)

Dim rawstr
Set rawstr = CreateObject("adodb.stream")
With rawstr
.Type = 1
.Mode = 3
.Open
.Write rawdata
.Position = 0
.Type = 2
.Charset = "UTF-8"
convertraw = .ReadText
.Close
End With
Set rawstr = Nothing

End Function



10 則留言:

  1. 請問我想要抓取選擇權每日交易行情http://www.taifex.com.tw/chinese/3/3_2_2.asp 要改什麼?謝謝回答

    回覆刪除
    回覆
    1. 1.網址
      2.資料整理的部分,這就要觀察網站的HTML格式

      刪除
  2. 謝謝版大的分享,獲益良多
    請教一下,我試著用您的方法借花獻佛,捉下列網址資料時
    測試如下
    (1)將if先註解掉,好像只捉到第一個選單的table
    (2)將If myTable.getAttribute("class") = table_f ,結果沒有東西
    能幫我解惑嗎?謝謝
    http://www.taifex.com.tw/chinese/3/7_8.asp?pFlag=&yytemp=2018&mmtemp=9&ddtemp=14&chooseitemtemp=ALL&goday=&choose_yy=2018&choose_mm=9&choose_dd=14&datestart=2018%2F9%2F14&choose_item=TX+++++

    回覆刪除
    回覆
    1. 版大,我知原因了
      If myTable.getAttribute("classname") = "table_f"
      謝謝

      刪除
    2. 哈囉~您的留言也讓我學到許多,自己之前使用getElementsByClassName發現會出錯,因此一直以為無法利用class屬性,今天看到您的留言回去查了一下,的確有這個classname屬性,十分感謝,以後要抓資料會更方便!

      刪除
  3. 版大,再請教另一問題,下面這網址,我是不是無法用此方法取得table
    結果中會出現下面這串文字
    目前顯示項目: 智慧選股 – 季線向下走跌 (共計1345筆)
    我想取得1345這個數字
    謝謝
    網址如下:
    https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=%E6%99%BA%E6%85%A7%E9%81%B8%E8%82%A1&INDUSTRY_CAT=%E5%AD%A3%E7%B7%9A%E5%90%91%E4%B8%8B%E8%B5%B0%E8%B7%8C%40%40%E5%9D%87%E5%83%B9%E7%B7%9A%E5%90%91%E4%B8%8B%E8%B5%B0%E8%B7%8C%40%40%E5%AD%A3%E7%B7%9A&SHEET=%E7%A7%BB%E5%8B%95%E5%9D%87%E7%B7%9A&SHEET2=%E7%9B%AE%E5%89%8D%E4%BD%8D%E7%BD%AE%28%E5%85%83%29&RPT_TIME=

    回覆刪除
    回覆
    1. 哈囉~由於這個網站table數量蠻多的,因此如果是我來處理的話,我會先抓id為"txtStockListData"的div tag,接著再去抓這個元素底下的第一個table資料

      刪除
  4. 最近期交所查詢好像改版 還能使用嗎

    回覆刪除
    回覆
    1. 目前尚未測試,但看起來應該需要修改

      刪除
    2. http://www.taifex.com.tw/cht/3/futDailyMarketReport
      麻煩您了

      刪除