(不定期更新)使用VBA解決 excel web 查詢無法匯入、匯入太慢的股市資料

nijawang wrote:
這次找不到table,不知道該怎麼抓?








Yahoo美股改版的爬蟲問題
感謝snare大的回覆
原來方式跟之前的台股差不多的修改方式。

像這三行都是固定的嗎?
Set Xmlhttp = CreateObject( "msxml2.xmlhttp" )
Set Jsondata = CreateObject( "HtmlFile" )
Jsondata.write ""

這邊就要依實際情況去做切割了,對嗎?
With Xmlhttp
.Open "GET", UrL, False
.send
temp = Split(.responsetext, """body"":""{\""quoteResponse\"":")
temp1 = Replace(Split(temp(1), "}""}")(0), "\", "")

temp = Split(.responsetext, """body"":""{\""quoteSummary\"":")
temp2 = Replace(Split(temp(1), "}""}")(0), "\", "")
End With

不過像這些沒有data-field的項目,要另外用什麼方式取出?
nijawang wrote:
像這三行都是固定的嗎?

1. 固定,但不一定,因有多種版本可用
2+3. callbyname + json ,固定,但3有多種寫法
2+3.也可不用,單純用文字處理函數也行,split、instr、mid…,或其它物件regexp ...


nijawang wrote:
這邊就要依實際情況去做切割了,對嗎?


是,但不同項目的網頁,通常需要更改切割辨識用的字串
另一種方式是直接下載json來源,但需要模擬cookies、key ,比較麻煩
切割是最簡單的


nijawang wrote:
不過像這些沒有data-field的項目,要另外用什麼方式取出?


您只是沒仔細找,全在temp2裡面

BND 本來就沒有 PE Ratio (TTM),2330.tw 就有

bank87012
請問GOODINFO使用GOOGLE帳號登入語法要如何寫
請教版主:
http://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel/
這個網頁要如何抓取?

Dim URL As String, GetXml As Object, Jsondata As Object, DecodeJson, temp, n As Integer, i As Integer
Set GetXml = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Jsondata = CreateObject("HtmlFile")

URL = "http://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel/"

With GetXml

.Open "GET", URL, False
.SetRequestHeader "Cache-Control", "no-cache"
.SetRequestHeader "Pragma", "no-cache"
.SetRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.Send

不知要怎麼寫下去 請指教 謝謝您
請問要如何寫vba登入這個網址https://goodinfo.tw/tw/index.asp,以google帳號登入
snare
可用selenium edge driver處理,請自行google 相關範例。
snare wrote:
您只是沒仔細找,全在 temp2 裡面

BND 本來就沒有 PE Ratio (TTM),2330.tw 就有
感謝snare大的回覆!
終於修改得差不多了。

不過還有幾個小問題想請教snare大:

1、不曉得為何QQQ這個ETF的許多值都抓不進來?
但其它ETF都可以正常抓到資料

感覺好像是這個DecodeJson沒資料,因為底下這個抓不到資料的都是同一個資料源
DecodeJson = CallByName(CallByName(Jsondata.JsonParse(temp2), "result", VbGet), "0", VbGet)

summaryDetail.bid.fmt
summaryDetail.ask.fmt
summaryDetail.averageVolume.raw
summaryDetail.totalAssets.fmt
summaryDetail.navPrice.fmt
summaryDetail.trailingPE.fmt
summaryDetail.yield.fmt
defaultKeyStatistics.ytdReturn.fmt
defaultKeyStatistics.beta3Year.fmt
fundProfile.feesExpensesInvestment.annualReportExpenseRatio.fmt
defaultKeyStatistics.fundInceptionDate.fmt

不過temp1是有資料

https://finance.yahoo.com/quote/QQQ

2、不曉得美股的這個earningsDate要怎麼抓?
因為還有一層"0",如果設earningsDate.0.fmt就會報錯


3、找不到美股的這個1y Target Est
找過temp(1)、temp(2)都沒有,不知道是不是在其它的temp中?
我想找,但又遇到4的問題

temp = Split(.responsetext, """body"":""{\""quoteResponse\"":")
temp1 = Replace(Split(temp(1), "}""}")(0), "\", "")
temp = Split(.responsetext, """body"":""{\""quoteSummary\"":")
temp2 = Replace(Split(temp(1), "}""}")(0), "\", "")

https://finance.yahoo.com/quote/AAPL

4、像temp這種很長的資料,我該如何複製出完整內容?
因為我在監看式用Ctrl+A全複製,但實際上複製出的只有一部份資料而已…
或是說我該想怎麼讀出.responsetext才對?


感謝snare大持續地解答大家的大大小小爬蟲問題!
蔬食抗暖化,減碳救地球!
usbsilence wrote:
http://www.taifex.com.tw/cht/3/optDailyMarketSummaryExcel/
這個網頁要如何抓取?


請參考21樓簡易下載方式,表格0~5,請自行練習





nijawang wrote:

1、不曉得為何QQQ這個ETF的許多值都抓不進來?
但其它ETF都可以正常抓到資料

感覺好像是這個DecodeJson沒資料,因為底下這個抓不到資料的都是同一個資料源
DecodeJson = CallByName(CallByName(Jsondata.JsonParse(temp2), "result", VbGet), "0", VbGet)



因為QQQ有一個字串造成json解碼失敗,請多加一行

temp2 = Replace(temp2, "(the ""securities"")", "(the securities)")
Set decodejson = CallByName(CallByName(Jsondata.JsonParse(temp2), "result", VbGet), 0, VbGet)




nijawang wrote:
2、不曉得美股的這個earningsDate要怎麼抓?
因為還有一層"0",如果設earningsDate.0.fmt就會報錯


3、找不到美股的這個1y Target Est
找過temp(1)、temp(2)都沒有,不知道是不是在其它的temp中?
我想找,但又遇到4的問題



全部在temp2裡面




如果只是那幾個資料,沒必要用json,split()函數就很好用了






nijawang wrote:
4、像temp這種很長的資料,我該如何複製出完整內容?
因為我在監看式用Ctrl+A全複製,但實際上複製出的只有一部份資料而已…
或是說我該想怎麼讀出.responsetext才對?


responsetext 就是瀏覽器開網頁,滑鼠右鍵=>檢視原始碼

或是

丟到儲存格裡(有字數上限,但通常不會超過),再複制出來
range("a1")=.responsetext
range("b1")=temp2
snare wrote:
因為 QQQ 有一個字串造成 json 解碼失敗,請多加一行
感謝snare大!

是因為QQQ這邊的(the "securities"),比其它ETF多出了一對雙引號嗎?
{"result":[{"assetProfile":{"longBusinessSummary":"To maintain the correspondence between the composition and weights of the securities in the trust (the "securities") and the stocks in the NASDAQ-100 Index®, the adviser adjusts the securities from time to time to conform to periodic changes in the identity and/or relative weights of index securities.

snare wrote:
全部在 temp2 裡面
確實都在temp2中,只是我一直在找"1y Target Est"這個名稱…
應該轉個彎的說〜targetMeanPrice

而關於earningsDate,我是想問像這種有"0"(或1、2、3…)的話,就不能用底下的方式取值嗎?

DecodeJson.calendarEvents.earnings.earningsDate.0.fmt
(會報錯)

只能用CallByName取值嗎?
CallByName(CallByName(CallByName(CallByName(DecodeJson2, "calendarEvents", VbGet), "earnings", VbGet), "earningsDate", VbGet), 0, VbGet).fmt

snare wrote:
如果只是那幾個資料,沒必要用 json,split () 函數就很好用了
split()也可以用,只是僅限於網頁上的資料
多學了json,資料集裡頭還有很多沒顯示的資料可以抓

snare wrote:
丟到儲存格裡 (有字數上限,但通常不會超過),再複制出來
range("a1")=.responsetext
range("b1")=temp2
原來還有這個方法可以用來讀資料!
nijawang wrote:
是因為QQQ這邊的(the "securities"),比其它ETF多出了一對雙引號嗎?


是的
以下是我比較常用的線上檢查json格式網站
https://jsonformatter.org/
https://jsonformatter.curiousconcept.com/#


nijawang wrote:

而關於earningsDate,我是想問像這種有"0"(或1、2、3…)的話,就不能用底下的方式取值


0、1、2、3…… 那個不是名稱,是類似索引的存在,有特定功能的,不能直接用

也可用另一種json處理方式,全部轉成普通的物件、文字
請參考1168樓、1171樓、1282樓
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 145)

今日熱門文章 網友點擊推薦!