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

alfidpan
感謝回應,來找找研究研究,十分感謝。




Snare:雖然現在是AI的時代,但您仍是我心中的大神,謝謝你讓小弟學會寫程式,我遇到了2個問題,第1個是台灣集保結算所https://www.tdcc.com.tw/portal/zh/stats/openData,我發現右鍵就可以很容易取得路徑https://opendata.tdcc.com.tw/getOD.ashx?id=1-5,但這是最新的數據,我想請問是不是有機會加入某個時間參數,可以取得歷史的數據,第二個是公開資訊觀測站https://mopsov.twse.com.tw/mops/web/stapap1_all,這個有列出公司名稱,但想看詳細資料,就必須一個一個點擊,有沒有什麼方法可以把所有公司的詳細資料全部抓下來,謝謝
Dylan67 wrote:
第1個是台灣集保結算所https://www.tdcc.com.tw/portal/zh/stats/openData,我發現右鍵就可以很容易取得路徑https://opendata.tdcc.com.tw/getOD.ashx?id=1-5,但這是最新的數據,我想請問是不是有機會加入某個時間參數,可以取得歷史的數據


tdcc只有最新資料能一次下載
歷史數據只能一筆一筆下載,請參考我寫的古董程式,略新版的在 1246、1247、1257 樓
不過,聽說有人收集完整歷史資料來賣錢,有些網站的付費高級會員也可以下載


Dylan67 wrote:
第二個是公開資訊觀測站https://mopsov.twse.com.tw/mops/web/stapap1_all,這個有列出公司名稱,但想看詳細資料,就必須一個一個點擊,有沒有什麼方法可以把所有公司的詳細資料全部抓下來,謝謝


每個詳細資料都是另一個網頁,沒辦法一次抓下來
只能用迴圈把每個按鈕的網址跑一遍



Sub Get_twse_stapap1_all_Link()

Dim HTML As Object, Getxml As Object, table As Object, i As Integer, j As Integer, UrL As String
Dim Ie_Open As Boolean, PostData As String, YM As String, skind As String

'Ie_Open = True '使用超連結,點擊插入註解,打開瀏覽器
Ie_Open = False '使用文字格式網址,點擊插入註解,但不打開瀏覽器

Set HTML = CreateObject("htmlfile")
Set Getxml = CreateObject("msxml2.xmlhttp")

'01 水泥工業 02 食品工業 03 塑膠工業 04 紡織纖維 05 電機機械 06 電器電纜 07 化學生技醫療 08 玻璃陶瓷 09 造紙工業 10 鋼鐵工業
'11 橡膠工業 12 汽車工業 13 電子工業 14 建材營造 15 航運業 16 觀光餐旅 17 金融保險業 18 貿易百貨 19 綜合企業 20 其他
'21 化學工業 22 生技醫療業 23 油電燃氣業 24 半導體業 25 電腦及週邊設備業 26 光電業 27 通信網路業 28 電子零組件業 29 電子通路業 30 資訊服務業
'31 其他電子業 35 綠能環保 36 數位雲端 37 運動休閒 38 居家生活 91 存託憑證


YM = "11503"
skind = "14"
UrL = "https://mopsov.twse.com.tw/mops/web/ajax_stapap1_all"

PostData = "encodeURIComponent=1&sTYPEK=sii&TYPEK=sii&firstin=true&step=1&kind=&id=&skind=" & skind & "&YM=" & YM


Sheets("工作表1").Cells.Clear
Sheets("工作表1").Columns("A:A").NumberFormatLocal = "@"
Application.ScreenUpdating = False


With Getxml

.Open "POST", UrL, False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send (PostData)
HTML.body.innerhtml = .responsetext

End With

Set table = HTML.all.tags("table")(1).Rows


For i = 0 To table.Length - 1
For j = 0 To table(i).Cells.Length - 1

Sheets("工作表1").Cells(i + 1, j + 1) = Trim(table(i).Cells(j).innertext)

If i > 0 And j = 2 Then

PostData = "https://mopsov.twse.com.tw/mops/web/ajax_stapap1?encodeURIComponent=1&firstin=true&colorchg=&year=" & Left(YM, 3) & "&month=" & Right(YM, 2) & "&co_id=" & Sheets("工作表1").Cells(i + 1, 1) & "&TYPEK=sii&step=0"

If Ie_Open = True Then
Sheets("工作表1").Hyperlinks.Add Sheets("工作表1").Cells(i + 1, j + 1), Address:=PostData, TextToDisplay:="詳細資料"
Else
Sheets("工作表1").Cells(i + 1, j + 1) = PostData
End If
End If

Next j
Next i

Sheets("工作表1").Columns.AutoFit
Sheets("工作表1").Rows.AutoFit

Application.ScreenUpdating = True

Set HTML = Nothing
Set Getxml = Nothing
Set table = Nothing

End Sub




'單筆下載範例,多筆請自行取用工作表1的C欄網址,用迴圈改寫



Sub Get_twse_stapap1_Link_Data()

Dim HTML As Object, Getxml As Object, Clipboard As Object, table, UrL As String, ttt As Double

Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
Set HTML = CreateObject("htmlfile")
Set Getxml = CreateObject("msxml2.xmlhttp")

ttt = Timer


If Sheets("工作表1").Range("c2").Hyperlinks.Count > 0 Then
UrL = Sheets("工作表1").Range("c2").Hyperlinks(1).Address
Else
UrL = Sheets("工作表1").Range("c2").Value
End If


Sheets("工作表2").Cells.Clear


With Getxml

.Open "POST", UrL, False
.setRequestHeader "Referer", "https://mops.twse.com.tw/mops/web/t05st01"
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send
HTML.body.innerhtml = .responsetext

End With


If InStr(HTML.body.innertext, "查詢過於頻繁") > 0 Then
Debug.Print HTML.body.innertext
Else
Clipboard.SetText HTML.body.innerhtml
Clipboard.PutInClipboard

Sheets("工作表2").Select
Sheets("工作表2").Cells(1, 1).Select
Sheets("工作表2").PasteSpecial NoHTMLFormatting:=True
End If

Sheets("工作表2").Columns.AutoFit
Sheets("工作表2").Columns("A:A").ColumnWidth = 33

Set HTML = Nothing
Set Getxml = Nothing
Set table = Nothing
Set Clipboard = Nothing

Debug.Print Timer - ttt & "s"

End Sub




Dylan67
十年如一日,感恩您無私的教導,真了不起
S大您好:
又來跟您請教,https://api.investing.com/api/financialdata/assets/equitiesByCountry/default?fields-list=id,name,symbol,last&country-id=29&page=0&page-size=100
以上的網址寫VBA想要匯入JSON,會出現status 403,是否是網站有反爬蟲,還是程式碼寫錯了呢?
alfidpan wrote:
以上的網址寫VBA想要匯入JSON,會出現status 403,是否是網站有反爬蟲,還是程式碼寫錯了呢?


寫錯吧? 不然就是你有極大量查詢被暫時鎖ip了


snare wrote:
寫錯吧? 不然就是你...(恕刪)


S大您好:
因為我是設定成 Set Xmlhttp = CreateObject("Msxml2.XMLHTTP.6.0"),跟您設定CreateObject("WinHttp.WinHttpRequest.5.1"),不知為什麼就有如此大的差異呢?
snare
功能不同啊,一般爬蟲通常msxml2.xmlhttp、WinHttpRequest.5.1,這2個就夠了,詳情請google wininet winhttp xmlhttprequest 版本
Snare大神:

以下這兩個路徑

Url="https://www.twse.com.tw/rwd/zh/marginTrading/TWT93U?date=20260508&response=csv"

Url="https://www.tpex.org.tw/www/zh-tw/margin/sbl?date=2026%2F05%2F08&id=&response=csv"

我使用 URLDownloadToFile 方法可以順利下載

URLDownloadToFile 0, Url, Target & "DownLoad.csv", 0, 0

可是使用 WinHttpRequest51 卻不行,想請教為什麼?

Set WinHttpRequest51 = CreateObject("WinHttp.WinHttpRequest.5.1")

With WinHttpRequest51

.Open "POST", Url, False

.setRequestHeader "User-Agent", "Mozilla/6.0" '
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", Url
.setRequestHeader "Cache-Control", "no-cache"
.setRequestHeader "Pragma", "no-cache"
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send

End With
Dylan67 wrote:
我使用 URLDownloadToFile 方法可以順利下載

URLDownloadToFile 0, Url, Target & "DownLoad.csv", 0, 0

可是使用 WinHttpRequest51 卻不行,想請教為什麼?



1、 .Open "GET", Url, False

2、要轉碼








Dylan67
我突然發現,WinHttpRequest51在國外有時候會被擋...
Dylan67
AI搞不定的事很多,今天我的問題又是靠這裡爬文解開的,真是寶庫
[點擊下載]

Snare大神,我又來請教了,昨天爬文以為自己搞的定,結果還是搞不定,再麻煩您幫我看看,應該是Token抓取錯誤(有抓到但是是錯的Token),https://easymap.moi.gov.tw/Z10Web/Normal
Dylan67 wrote:
應該是Token抓取錯誤(有抓到但是是錯的Token)



我測試不用token時,也能正常抓資料









[點擊下載]
snare
undetected chromedriver 是繞過機器人認證保護用的,查詢頻率跟用什麼方式上網無關。除非您有數百個可用的 Proxy,查幾次就切換 proxy,讓查詢次數分散到大量proxy ip
Dylan67
了解,不過我從昨天被鎖到今天了...這次有點久
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 159)

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