tmwcykixe wrote:
https://www.cmoney.tw/finance/f00026.aspx?s=6706,這網頁內的資料應參考那個範例抓取或需使用其他方法呢?(恕刪)
xmlhttp 同274樓的寫法
資料是json格式,由其它2個網址回傳、會檢查金鑰
20200421網頁改版,金鑰需轉編碼,可參考269樓的轉碼副程式
網頁所有的選項、連結,都需要有對應的金鑰(每次連線隨機產生)
'範例只示範下載"基本資料"這一頁,2部份資料各取2筆
Sub GET_cmoney_json()
Dim Xmlhttp As Object, Url As String, Url_a As String, Url_b As String, Url_c As String, cmkey As String, stock As String
Dim Jsondata As Object, Json, temp
Set Jsondata = CreateObject("HtmlFile")
Jsondata.write ”<script>document.JsonParse=function (s) {return eval(’(’ + s + ’)’);}</script>”
'jsondata.write 這行是全形字,請自行改成半形,或直接用檔案中的程式碼
Sheets("工作表1").Cells.Clear
stock = InputBox("股票代號", , "6706")
If stock = "" Then Exit Sub
Url = "https://www.cmoney.tw/finance/f00026.aspx?s=" & stock
Set Xmlhttp = CreateObject("WinHttp.WinHttpRequest.5.1")
With Xmlhttp
.Open "GET", Url, False
.send
cmkey = Split(Split(.responsetext, "title='基本資料' cmkey='")(1), "'>基本資料<")(0)
cmkey = UrlEncode(cmkey)
Url_a = "https://www.cmoney.tw/finance/ashx/mainpage.ashx?action=GetStockListLatestSaleData&stockId=" & stock & "&cmkey=" & cmkey & "&_=" & UNIXTime
.Open "GET", Url_a, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Url
.send
Set Json = Jsondata.JsonParse(.responsetext)
Cells(1, 1) = "股價" & CallByName(CallByName(Json, "commSaleData", VbGet), "SalePr", VbGet)
Cells(2, 1) = "股本(百萬)" & CallByName(CallByName(Json, "companyInfo", VbGet), "Capital", VbGet)
'================
'其它資料請自行用callbyname取出
'================
Url_b = "https://www.cmoney.tw/finance/ashx/mainpage.ashx?action=GetStockBasicInfo&stockId=" & stock & "&cmkey=" & cmkey
.Open "GET", Url_b, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Url
.send
Set Json = Jsondata.JsonParse(Replace(Replace(.responsetext, "[", ""), "]", ""))
Cells(5, 1) = "單月營收年成長率:" & CallByName(Json, "MonthlyRevenueYearGrowth", VbGet)
Cells(6, 1) = "股價淨值比:" & CallByName(Json, "PBR", VbGet)
'================
'其它資料請自行用callbyname取出
'================
End With
Set Xmlhttp = Nothing
Set Json = Nothing
Set temp = Nothing
End Sub
Function UNIXTime()
UNIXTime = Round(((Date - #1/1/1970#) * 86400 + Timer) * 1000, 0)
End Function
'以下function因論譠語法關係,無法正常顯示,改用圖片,或參考附檔
如果嫌json解碼麻煩,請另找資料來源,或改用ie object ,但速度差了10倍以上
(20220505 補充:)
(因網頁改版,取消支援ie,下面ie object 範例失效,需改用上面json方式下載)
Sub Test()
Dim IE As Object, Url As String, table, i As Integer, j As Integer, temp
ActiveSheet.Cells.Clear
Application.ScreenUpdating = False
Set IE = CreateObject("InternetExplorer.Application")
Url = "https://www.cmoney.tw/finance/f00026.aspx?s=6706"
With IE
.Visible = True
.Navigate Url
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop
Application.Wait (Now + TimeValue("0:00:5"))
Set table = .document.getelementsbytagname("table")(0).Rows
For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1
ActiveSheet.Cells(i + 1, j + 1) = table(i).Cells(j).innertext
Next j
Next i
Set table = .document.GetElementByID("HeaderContent")
temp = Split(table.innertext, vbNewLine)
For i = 0 To UBound(temp)
ActiveSheet.Cells(20 + i, 1) = temp(i)
Next i
ActiveSheet.Cells.Columns.AutoFit
End With
IE.Quit
Set IE = Nothing
Set table = Nothing
Application.ScreenUpdating = True
End Sub
(20210925) 網頁改版,需修正一行程式碼,請自行在附件裡面訂正)
(原)未改版前
cmkey = Right(Split(Split(.responsetext, "'>基本資料<")(1), "'>基本資料<")(0), 24)
改成如下
cmkey = Split(Split(.responsetext, "title='基本資料' cmkey='")(1), "'>基本資料<")(0)
(20220505) 網頁改版,需修正一行程式碼,請自行在附件裡面訂正)
(原)未改版前
cmkey = Split(Split(.responsetext, "title='基本資料' cmkey='")(1), "'>基本資料<")(0)
改成如下
cmkey = Split(Split(.responsetext, "基本資料' cmkey='")(1), "' page='")(0)
[點擊下載]