nickchu wrote:
請教各位大大,小弟在抓取這個網址中的20年財報:
https://invest.cnyes.com/usstock/detail/DIS/financial/financials20yr
... 恕刪…
問題是在request url帶了token。我找遍了F12裡network所有的XHR,也沒看出那裡生出的token (似乎是隨機的,每次開browser都不同)。
cnyes?? token ?? 印像中,我寫過好幾個範例了…
271、272、274、631、751、1064……有些忘了
其中yahoo financial現在改版後不需要key也可以
只是程式碼中未刪掉,雖然是多餘的,但可參考寫法
這一頁的資料是先在這個網址,方式是POST
https://app.quotemedia.com/auth/g/authenticate/dataTool/v0/91386/d54dae6c8cf2bda0196be3a59647fcc4ee56671e9187d4388275abc155ea137c
正確請求到 token後,再套用到您找到的那ajax 網址,返回json
(要注意,如果您點了網頁中其它選項、頁面,請求token的網址,有可能會不同)
(點我看大圖)
json雖然很快(約0.6秒),但這個您確定要用json整理
表格,是要一格一格排的,參數超多的喔……
而且有些股票代號,表格會改用不同的排列方式…
整理請加油,字太多了,我實在不想打,希望您能整理出來分享
Sub Get_cnyes_Jsondata()
Dim Xmlhttp As Object, Jsondata As Object, Url As String, Url_a As String, token As String, DecodeJson, ttt As Double, Stock As String
Set Jsondata = CreateObject("HtmlFile")
Set Xmlhttp = CreateObject("msxml2.xmlhttp")
Sheets("工作表1").Cells.Clear
Stock = "DIS" 'test
'Stock = "AAPL" 'test
Url = "https://app.quotemedia.com/auth/g/authenticate/dataTool/v0/91386/d54dae6c8cf2bda0196be3a59647fcc4ee56671e9187d4388275abc155ea137c"
Url_a = "https://invest.cnyes.com/usstock/detail/" & Stock & "/financial/financials20yr"
With Xmlhttp
.Open "POST", Url, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
.setRequestHeader "origin", "https://invest.cnyes.com"
.send
token = Split(Split(.responsetext, """token"" : """)(1), """")(0)
Url = "https://app.quotemedia.com/datatool/getFinancialsEnhancedBySymbol.json?symbol=" & Stock & "&numberOfReports=20&latestfiscaldate=true?cy=true&reportType=A&token=" & token
.Open "GET", Url, False
.setRequestHeader "origin", "https://invest.cnyes.com"
.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
.setRequestHeader "Referer", Url_a
.send
Set DecodeJson = CallByName(CallByName(Jsondata.JsonParse(.responsetext), "results", VbGet), "Company", VbGet)
'===================================
'整理 json 用的程式碼放這裡
'===================================
End With
Set Xmlhttp = Nothing
Set DecodeJson = Nothing
Set Jsondata = Nothing
End Sub
另外,要注意,多筆查詢時,要有適當延遲,會擋ip的