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

snare wrote:
方法一因為網頁上的空(恕刪)


謝謝樓主!

真是條條大路通羅馬,好幾種方式都可達成相同效果.

個人測試結果:
屬方法1最經濟實惠:

1.只需1個查詢,加上樓主提示的Clipboard
Set Table = HTMLsourcecode.all.tags("table")(0)
With Clipboard
.SetText "< table>" & Table.innerhtml & "< / table >"
.PutInClipboard
End With
2.可獲得與網頁結果最相同的效果連表頭格子都幫你合併了.




另外想再請教一下樓主大哥:
之前看到樓主有寫一個匯率的比較程式(811樓),我剛好也在試兩家(中信及第一)銀行,,第一的比較單純沒問題,但中信似乎沒那麼容易,不知這個網頁的寫法是沒法爬,還是要用另外的方式.

url="https://www.ctbcbank.com/twrbo/zh_tw/dep_index/dep_ratequery/dep_foreign_rates.html"

屬[POST]方法:但好像也找不到像 825樓那樣 有 FROM DATA 可看到他的抓程式的參數部份


不知這種網站要如何判斷他要用那種方式來爬呢?
joehuang wrote:
url="https://www.ctbcbank.com/twrbo/zh_tw/dep_index/dep_ratequery/dep_foreign_rates.html"
屬[POST]方法:但好像也找不到像 825樓那樣 有 FROM DATA 可看到他的抓程式的參數部份
不知這種網站要如何判斷他要用那種方式來爬呢?


剛剛大概看了一下
因為這個網站所有的參數都是用json回傳的,所以看不到參數
網頁上的表格,也全部都不是表格,是json
而且更麻煩的是,同一個網址(網頁),等個幾分鐘後,再重新整理,還會跳到別的網頁

Header 還要特別設定為 json格式才行
.setRequestHeader "Content-type", "application/json"
.setRequestHeader "Accept", "application/json"

有點像(751樓+756樓+758樓)範例的更複雜版網頁
下載資料用的key(IIhfvu),這個key還會變來變去的,滑鼠一點網頁就變
程式碼還要加上很多的防呆、除錯
只要一改版,程式碼沒辦法只改少少幾行
建議找看看是否有ctbcbank,csv檔下載的網址?
或是另找有提供ctbcbank資料的網站?,不要自找麻煩



如果一定要用ctbcbank,這是慢速版範例,請參考
xml版改天太閒再寫





Sub test()

Dim IE As Object, Url As String

ActiveSheet.Cells.Clear
Application.ScreenUpdating = False

Set IE = CreateObject("InternetExplorer.Application")
Url = "https://www.ctbcbank.com/twrbo/zh_tw/dep_index/dep_ratequery/dep_foreign_rates.html"

With IE
.Visible = True
.Navigate Url
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop

Application.Wait (Now + TimeValue("0:00:10"))

IE.ExecWB 17, 0
IE.ExecWB 12, 2

ActiveSheet.Cells(1, 1).Select
ActiveSheet.PasteSpecial Format:="HTML", Link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True
ActiveSheet.Rows("1:583").Delete Shift:=xlUp
ActiveSheet.Rows("52:350").Delete Shift:=xlUp
ActiveSheet.Cells(1, 1).Select

End With

IE.Quit
Set IE = Nothing
Application.ScreenUpdating = True

End Sub
snare大神:
您的提示小弟研究了2天,加上85F另位同學的提問,總算是做了個七七八八,感恩感謝
結果有跑出來,不過遇到了3個問題(附件"不成熟"程式碼,哈哈)
1. 如果點擊"只下載1次",通常第1次數據剖析不會成功(.TextToColumns DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, Comma:=True, TrailingMinusNumbers:=True),要點擊清除後再點擊下載1次(第2次)才能剖析成功(我設了延遲)
2. 若以"迴圈方式",則第2次迴圈會出現"陣列索引超出範圍"(這個問題比較頭大,我試了.setRequestHeader的許多參數及延遲方法,都不能成功)
3. .send()可以接受Range指定及For...To迴圈變量,可是好像不能接受For Each的迴圈變量(模組注釋:我的問題)
4. 我總共用了CreateObject("htmlfile")、CreateObject("msxml2.xmlhttp")、CreateObject("Microsoft.XMLHTTP")這樣合理嗎?



[點擊下載]
更正:是參考839樓同學提問...
Dylan67 wrote:
1.(恕刪) (我設了延遲)
2. 若以"迴圈方式",則第2次迴圈會出現"陣列索引超出範圍"(恕刪)
4. 我總共用了CreateObject("htmlfile")、CreateObject("msxml2.xmlhttp")、CreateObject("Microsoft.XMLHTTP")這樣合理嗎?


1+2+4、
不管下載的內容對不對、網站維修、擋ip,結果就只有成功、出錯,2種
跟延遲無關,請自行比對程式碼找錯誤
另外全域變數非必要,儘量少用


以下是去掉多餘程式碼的單次範例…



Sub Post_Rs()

Dim GetXml As Object, Clipboard As Object, RsEndRow As Integer, Url As String

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

Url = "https://mops.twse.com.tw/mops/web/ajax_t100sb02_1"

With GetXml
.Open "POST", Url, False
.send (Sheets("Rs").Range("AH90").Value)
Clipboard.SetText .responsetext
Clipboard.PutInClipboard
End With

With Sheets("Rs")
.Select
RsEndRow = .Cells(Rows.Count, 27).End(xlUp).Row
.Range("AA" & RsEndRow + 1).Select
.PasteSpecial NoHTMLFormatting:=True
.Cells(1, 1).Select
End With

Set GetXml = Nothing
Set Clipboard = Nothing

End Sub
Dylan67 wrote:
snare大神:您的(恕刪)


同學早:
針對你上面的問題第2點, 迴圈不行跑的部份,我看了一下是因為你的URL 變數2段POST程式都用這個變數,所以當第1次跑完時,URL 已經變成有加上 CSV檔案的那串URL, 結果你再跑第2次的 URL 就會傳錯.

把你迴圈外的URL 拉進來,或著2段POST 中改用不同變數名稱一樣可解這問題.

snare wrote:
剛剛大概看了一下因為(恕刪)


感謝樓主大大,
中信的那個匯率還是不要拿石頭砸自己的脚,速度慢點一樣能達標(又多學了[IE的方式]來爬複雜網站)而且可以自行取用其中部分段落的資料,這個真的除了比較慢外程式還真是簡潔.

另外有找到一個網站有各銀行比較的下了,相對單純多了,用樓主的XML標準程式就能下載了.有匯率需求的朋友們可以參考一下:
https://www.bestxrate.com/

要抓用樓主的XML標準寫法調整一下就可處理了.
[單次下載]按鈕(第1次點擊格式不正確情況)

[迴圈方式]按鈕(直接點擊格式不正確情況)

點擊完[單次下載]按鈕,再點擊[迴圈方式]按鈕(格式正常了!!!)


感謝846F joehuang高手的回應,更感謝版主的指教,
845F是最簡單的方式,當我看到版主838F的首次回覆後,我就知道輸入選項[查詢]後,[CSV下載]是不必要的操作,自己問了不成熟的問題,
不過看到版主的截圖詳細解說,我還是覺得自己有責任搞懂,
附件:單筆及多筆方式下載已能使用,不過還是有點問題,
1、點擊[單次下載]第1次會出現不正確的格式,要第2次點擊才會正常
2、[迴圈方式]需要先點擊[單次下載]後,才能順利下載成正確格式
不理解為什麼?再煩請各位先進不吝指點,感謝

[點擊下載]
Dylan67 wrote:
1、點擊[單次下載]第1次會出現不正確的格式,要第2次點擊才會正常
2、[迴圈方式]需要先點擊[單次下載]後,才能順利下載成正確格式
不理解為什麼?


a、您提供的程式還是用了大量全域變數的舊寫法
b、不下載csv,不需要用到資料剖析來整理,845樓的程式碼,還沒試?

1+2、整理csv在您的問題中是不需要存在的程式碼,這麼想知道還是回答一下好了
因為全域變數的問題,rsendrow保留到舊資料,影響到整個模組中所有的副程式


最後一列位置是變動的,不能一直用舊資料,需一直更新
請在整理csv前,先用 debug.Print "AA99:AA" & RsEndRow 測試了解一下數值變化後
再加一行重新測試一次
snare wrote:
a、您提供的程式還是(恕刪)


再請教樓主大大:
我試了用自己的EXCEL 模擬用迴圈的方式,發現一件不解的事,
我的程式部份在 .PasteSpecial NoHTMLFormatting:=True 這行執行過後貼在EXCEL上的值就不會有像樓上的 [" "]的值就已經是正常的文字,在開檔後第1次執行也是如此,所以也無需再進行轉碼.程式中我Mark起來轉碼那行也可正常跑出結果如下圖:.



這是什麼原因會造成這樣的不同,用樓上的程式,開檔第1次跑到[.PasteSpecial NoHTMLFormatting:=True]時也是會有[" "]的符號.

附上我測試的程式:

[點擊下載]
關閉廣告
文章分享
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 144)

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