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

Dylan67 wrote:
我有付費這個網址https://www.104woo.com.tw/成為會員


爬這個“付費會員”才能看見的資料,可能會讓您被鎖帳號


付費資料少量爬來自己看還好,但給別人就不合法了,說不定還會被判刑
這幾個月的事
https://www.is-law.com/lawsnote-fined-is-web-crawling-or-scraping-legal/


因為這網站要手機號碼註冊,我沒人頭號碼那種東西可測試
我下載範例只做非會員、可透明公開的網頁


登入可用 chromedriver
一、用chrome登入該網站後,不要登出
二、參考 1547樓 範例,如果chrome無回應、卡死,請參考1563樓修改



不登入簡易範例




Dylan67
感謝神,今天花了整天從800多樓瀏覽一遍,發現了好多新知識,有您真好
Snare大神:
今天又從800多樓再溫故知新,發現您在1075樓及1124樓有提到一個國外大神分享的程式,我下載下來了,也讓ChatGpt加上了註釋,可是我看的頭暈目眩,看似很好用,可是也不太知道怎麼用,怎麼貼JSON讓程式拆解,您有空時,能做個範例分享一下嗎?
snare
那個網頁拉到最下面有影片教學Tutorial Video (Red Stapler)。我沒在用那個程式,但是我有用自己的方式寫出類似的功能,可參考(1168、1171、1281、1282)樓。
Dylan67
真佩服,不只是觀察細微,連那層樓那間房都記的一清二楚,我每次回來找資料,只能憑印象一樓一樓慢慢看




https://lvr.land.moi.gov.tw/,不行了,太久沒玩,好像要先取得Token,然後是json格式,拼了一上午找不到真實網址,只能邊爬樓邊摸索,又要麻煩您了


大神:

左邊是1552樓您公開資訊觀測站損益表的代碼,右邊是我用Fiddler嘗試找所有參數的畫面,我的疑問是,我並沒有辦法找到所有您代碼中的setRequestHeader(F12也找不到),然後,我用的不是Firefox,所以我要完整粘貼這個字串嗎?User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36,最後是右下的Content-Type: application/json;charset=UTF-8,我猜;charset=UTF-8應該是可省略的,對嗎?
Dylan67 wrote:
https://lvr.land.moi.gov.tw/,不行了,太久沒玩,好像要先取得Token,然後是json格式,拼了一上午找不到真實網址


這個網頁,原始碼只有25行,資料都是jsp在處理
每次生成動態網址,我也找不到真實網址,能力有限,幫不上忙,vba我沒辦法


但是網頁有提供“完整資料”下載,手動抓一次就解決,似乎不需要寫程式耶
查詢那頁是真的沒辦法,但下載網址命名規則固定,真想用程式也行啦
但寫程式的時間,手動抓完還有剩








Dylan67 wrote:
左邊是1552樓您公開資訊觀測站損益表的代碼,右邊是我用Fiddler嘗試找所有參數的畫面,我的疑問是,我並沒有辦法找到所有您代碼中的setRequestHeader(F12也找不到)


setrequestheader 第2~4行
當網頁資料更新速度很快時,避免程式會一直抓到快取的舊資料
如果網頁資料更新慢,2~4行可省略

setrequestheader 第5行
讓網頁以為你正在用firefox上網,改成chrome、edge也行
沒這行,有些網頁偵測到是用程式碼下載,會直接擋掉

很多header都可省略,可以一行一行測試
Dylan67
謝謝,一路走來我很感激,如果沒有您授業解惑,說不定早就放棄了,就是自己太笨,每次網址跟代碼都是東拼西湊的,想多問一句,原始碼只有25行...jsp在處理...生成動態網址,這是怎麼看出來的嗎
snare
網頁搜尋按鍵旁邊的空白,按右鍵檢視原始碼,可發現網頁的資料都由https://lvr.land.moi.gov.tw/jsp/index.jsp,在處理。jsp裡面就是產生動態網址的程式碼。
今天又爬文了一天,明後天繼續爬,我嘗試複製您1399樓的圖片代碼,可是在這行總是出現陣列索引超出範圍,圖片放大有點模糊,Debug.Print GetXml.responsetext 找到data:[driveweb;,可是找不到"檔案",您可以給代碼,或提點一下嗎?謝謝

FileList = "[""driveweb;" & Split(Split(GetXml.responsetext, "data:[""driveweb;")(2), """檔案""]]")(0) & """檔案""]]]"
snare
你沒打錯字,我測了一下,程式時好時壞,偶爾可以下載,也許google加了什麼阻擋方式。
Dylan67 wrote:
可是找不到"檔案"


試了幾天,程式偶爾可用時,是被導向舊版google drive,內容是json回傳
新版的google drive 是script

修正後程式碼如下:測試用網址同以前回答問題時的範例






Sub Google_Drive_File_Name_ID_20251208()

Dim URL As String, GetXml As Object, Html As Object, Table
Dim i As Integer, j As Integer, Target As String, googlefile As String

On Error GoTo checkid

Set GetXml = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Html = CreateObject("HtmlFile")


Target = "d:\excel\googletest\" '暫存目錄
If Dir(Target, vbDirectory) = "" Then MkDir Target
'注意,暫存目錄下的檔案,會在無任何提示下刪除
If Dir(Target & "*.*") <> "" Then Kill Target & "*.*"

'共用資料夾網址

URL = "https://drive.google.com/drive/folders/19gf7B5C8TjJfLVqddJvmmzA1qD0mec6V?usp=sharing"

Sheets("工作表1").Cells.Clear
Sheets("工作表1").Range("A1:F1") = Array("檔名", "上次修改時間", "檔案大小", "Fileid", "Real link", "存檔位置+測試用新檔名")


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

If InStr(.responsetext, "Error 404") > 0 Then
MsgBox "無檔案 or 網址錯誤", vbOKOnly, "Error"
Exit Sub
End If

Html.body.innerhtml = .responsetext


Set Table = Html.all.tags("table")(0).Rows

With Sheets("工作表1")
For i = 1 To Table.Length - 1
For j = 0 To Table(i).Cells.Length - 1
If j = 3 And .Cells(i + 1, 3) <> "—" Then
.Cells(i + 1, j + 1) = Mid(Split(Table(i).Cells(j).innerhtml, "ssk=")(1), 13, 33)
.Cells(i + 1, j + 2) = "https://drive.usercontent.google.com/download?id=" & .Cells(i + 1, j + 1) & "&export=download"
.Cells(i + 1, j + 3) = Target & Format(Now(), "yyyymmddhhmmss") & "_" & .Cells(i + 1, 1)
Else
.Cells(i + 1, j + 1) = Replace(Table(i).Cells(j).innertext, Chr(13) & Chr(10) & "已共用", "")
End If
Next j

DoEvents

If .Cells(i + 1, 5) <> "" Then

GetXml.Open "GET", .Cells(i + 1, 5), False
GetXml.send

'下載速度,視檔案大小決定,可能要等一下才會出現在下載目錄內

With CreateObject("ADODB.Stream")
.Open
.Type = 1
.Write GetXml.responseBody
.SaveToFile Sheets("工作表1").Cells(i + 1, 6), 2
.Close
End With

End If

Next i

.Cells.Columns.AutoFit

End With


End With

Set GetXml = Nothing
Set Html = Nothing


MsgBox "tesk OK"

checkid:

If Err.Number <> 0 Then
Debug.Print Err.Description
End If

End Sub




1. 謝謝您,我後來採取了一個傻瓜作法,我先下載了Google電腦版,然後手動設定了雙向同步資料夾,這樣只要把文件丟進資料夾,Google雲端硬碟就會自動同步,我的共享資料夾路徑是這個https://drive.google.com/drive/folders/1Z0AopaJ_eaqFCiRZYzI-MYbfG57BhmPK?usp=sharing,永遠不會刪,方便大家做測試

2. 我最近在研究台指,很難,如果有同好願意分享指導交流,也可以加我:4kus.you去點

[點擊下載]
snare樓主您好,
yahoo股利頁面,先前於1417樓-1422樓指導後解決無法解析JSON的問題,如今又產生JsonParse方法失敗,小弟能力不足,無法修正,請您指點一下:

Set GetXml = CreateObject("WinHttp.WinHttpRequest.5.1")
'Set Jsondata = CreateObject("HtmlFile")
URL = "https://tw.stock.yahoo.com/quote/2330.TW/dividend"
'解析json字集函數

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
dtemp = "{""QuoteDividendStore"":{""dividend"":{""data"":[" & Split(Split(.responsetext, """QuoteDividendStore"":{""dividend"":{""data"":[")(1), ",""WaferMarketTimeStore"":")(0) & "}"
datakey = CallByName(CallByName(Jsondata.JsonParse(dtemp), "QuoteDividendStore", VbGet), "dividendDataKey", VbGet)
'Debug.Print datakey
Set DecodeJson = CallByName(CallByName(CallByName(CallByName(Jsondata.JsonParse(dtemp), "QuoteDividendStore", VbGet), datakey, VbGet), "data", VbGet), "dividends", VbGet)



snare
剛抓完圖正要回答,突然多了回文,沒想到您自行解決了。恭喜發財。如果json字串和網頁原始碼混在一起,我都貼到這裡測試https://jsonformatter.curiousconcept.com/
activer
[謝謝]
S大您好
又來請教您,以下這個網站的資料是不是可以匯入EXCEL?
因為測試都一直顯示status:401,此網站是不是如1487樓所言,算是正式上鎖了,感謝您撥空回應。
https://www.wsj.com/market-data/quotes/KO/financials/quarter/income-statement
snare
對,這次工程師沒偷懶隨便交差,有正式上鎖了,需人工驗證,所以vba無解。
alfidpan
感謝回應,那不用VBA,還有機會匯入嗎?
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 159)

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