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 就有
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
不知要怎麼寫下去 請指教 謝謝您
snare wrote:感謝snare大的回覆!
您只是沒仔細找,全在 temp2 裡面
BND 本來就沒有 PE Ratio (TTM),2330.tw 就有
終於修改得差不多了。
不過還有幾個小問題想請教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大持續地解答大家的大大小小爬蟲問題!
蔬食抗暖化,減碳救地球!
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:感謝snare大!
因為 QQQ 有一個字串造成 json 解碼失敗,請多加一行
是因為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中,只是我一直在找"1y Target Est"這個名稱…
全部在 temp2 裡面
應該轉個彎的說〜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:split()也可以用,只是僅限於網頁上的資料
如果只是那幾個資料,沒必要用 json,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樓
關閉廣告