Excel 股市資料抓取服務

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

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


2018年5月9日 星期三

解決XMLHTTP緩存問題


http://forum.twbts.com/thread-20749-1-1.html

今天在幫忙解問題時,遇到緩存的問題
在我們使用XMLHTTP第一次發送request時,他除了把資料抓下來以外,還會有個有點像「記憶」的功能,也就是說當你下次發送相同request時,他會直接去用他記憶的內容把結果回傳給你



優點:
短時間內,當我們在發送第二次、第三次一樣的request時,速度會比第一次快許多,因為他已經把結果「記」起來了,所以可以馬上把結果回傳給你


以這個例子來看,第一次要1.2秒左右,但之後都是0.004秒以下就可執行完畢

缺點:
這個記憶的功能對於抓取靜態網站的資料是相當方便的,但若是要抓動態網站的資料就會出錯,以抓yahoo股市資料為例,若你在9:05執行了一次程式,那接下來的一段時間內,你執行的結果就都會是9:05的結果,因為電腦認定你是發送同一個request

解決方式:
1.最簡單的方法:在網址的參數加上時間
一般來說,網址的問號後面都是參數(Querystring),例如上圖的例子,問號後面有個叫做stock的參數,而他的值為1102,所以他會抓1102的資料,這時候若你想讓電腦認定你不是發同一個request,你可以自己添補一個參數,例如t=timer,記得參數間要用"&"連結,由於timer是記錄當下的時間,因此電腦會以為你每次發送的是不同的request

以抓取yahoo股價為例就是

    myXML.Open "GET", "https://tw.stock.yahoo.com/q/q?t=" & Timer & "&s=" & stockNo, False
    myXML.send

要注意的是你自己設的參數不要跟網站原本預設的參數衝突到
例如他原本就有t這個參數,你就不要再使用t來當作你自己的參數

2.加入setRequestHeader "If-Modified-Since", "0"
這樣也可以達到即時更新的效果,但要注意的是Microsoft.XMLHTTP物件是無法設定Header的,要更換成WinHttp.WinHttpRequest.5.1物件

參考資料:
http://tangqi609567707.iteye.com/blog/2108341
https://www.jianshu.com/p/ec1a3a2fddcd

沒有留言:

張貼留言