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


BAK658 wrote:
櫃買中心 今天改版了...(恕刪)


請把問題打出來吧!

15151515151515
snare大大你好,請問一下何謂同步與非同步方式提交XMLHTTP,這二種應用方式應如何使用?可否請大大說明,謝謝。

leelee1leelee1 wrote:
同步與非同步方式提交XMLHTTP...(恕刪)


.open "GET"(post),url,false ==> 同步

.open "GET"(post),url,true ==> 非同步(異步)

一、同步,發送send請求之後,一直等到網站傳回要求的全部資料,再執行下一行程式碼

如果網路不穩,資料無法完整回傳,同步方式,會一直等到資料完整
.responsetext 有資料時,再執行下一行程式碼

如果網站掛掉,同步方式,會一直等到嚴重超時(程式卡住),才執行下一行程式碼
但這時 .responsetext 沒有資料,所以程式會出錯,要特別處理


二、非同步,發送send請求之後,不等網站回傳資料,立刻執行下一行程式碼

這時.responsetext ,不會有任何資料
所以要用 .readyState .status (其它),加上迴圈(do .... loop),來確定網站是不是回傳資料

但因為非同步,有不等網站回應,立刻執行下一行程式碼,的特性

所以可以利用這一特性,加上計時程式碼
例如超過1秒就取消下載,或是超過1秒就換網址下載


我的範例,基本上都是用同步,因為本來就是要下載資料,而且網站一定正常(網頁改版造成程式錯誤的不算)

非同步的範例,可參考175樓範例
謝謝snare大大解說,再次感謝。
請教Snare大
之前我想練習抓取ptt八卦版的資料


但遇到如圖的問題
可以請教Snare大如何應付這種錯誤嗎?
我已經研究好久但都不知道該怎麼處理...
小弟感激不盡

iamaraymond wrote:
但遇到如圖的問題...(恕刪)







師傅,不好意思
能請你幫我看一下哪邊出問題嗎?
之前照您的寫法改寫的
不知為何這禮拜忽然出現錯誤
可否請師父給點提示,謝謝~!


Sub 暫存檔2()


Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual

Cells.Clear
Dim HTMLsourcecode, Url, TempArray()
Set HTMLsourcecode = CreateObject("htmlfile")
Url = "https://goodinfo.tw/StockInfo/StockList.asp?SHEET=現股當沖&MARKET_CAT=熱門排行&INDUSTRY_CAT=現股當沖張數"
With CreateObject("WinHttp.WinHttpRequest.5.1")
.Open "POST", Url, False
'.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
'.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)"
DoEvents
.send
HTMLsourcecode.body.innerhtml = convertraw(.ResponseBody)

Set Table = HTMLsourcecode.all.tags("table")(56).Rows
ReDim TempArray(Table.Length - 1, Table(1).Cells.Length - 1)
For i = 0 To Table.Length - 1
For j = 0 To Table(i).Cells.Length - 1
TempArray(i, j) = Table(i).Cells(j).innertext
Next j
Next i
Range(Cells(1, 1), Cells(Table.Length, Table(1).Cells.Length)) = TempArray()
End With
End Sub
感謝snare大
但小弟還是在.send那邊會出現相同的錯,感覺不是設定Header的緣故,剛剛又爬了一下文
似乎是和這個有關
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn786418(v=ws.11)
但這個文章對小弟實在是太難了,不知道snare大看不看得懂?
幫忙snare大回答,順便玩玩看最近學到的clipboard,但不是很確定您要的是不是這個資料,若是我誤會了再請您傳一下截圖讓我知道您想要抓的是甚麼

Sub test()

Dim t: t = Timer

Dim myXML As Object
Set myXML = CreateObject("Microsoft.XMLHTTP")

Dim myHTML As Object
Set myHTML = CreateObject("HTMLFile")

Dim clipboard As Object
Set clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

With myXML
.Open "GET", "https://goodinfo.tw/StockInfo/StockList.asp?SHEET=%E7%8F%BE%E8%82%A1%E7%95%B6%E6%B2%96&MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E7%8F%BE%E8%82%A1%E7%95%B6%E6%B2%96%E5%BC%B5%E6%95%B8", False
.send

myHTML.body[removed] = .responseText
End With

Set myTable = myHTML.getElementsByTagName("table")(57)

Cells.Clear
With clipboard
.setText myTable.outerHTML
.putInClipboard
End With

[F3].Select
Sheets("工作表1").PasteSpecial noHTMLFormatting:=False

Set clipboard = Nothing
Set myXML = Nothing
Set myHTML = Nothing

Debug.Print Format(Timer - t, "0.00秒")

End Sub
iamaraymond wrote:
但小弟還是在.send那邊會出現相同的錯,感覺不是設定Header的緣故...(恕刪)


.send 會出現憑證錯誤
一、通常tls/ssl有關
二、電腦設定了錯誤時區、時間
三、xp 系統
四、其它

在正常情況下,電腦不可能會出現憑證錯誤,也許您裝了什麼奇怪的軟體
不好意思,我的電腦無法重現您的錯誤,所以無法解答

您可以試著把object換成其它版本試看看
例如:
CreateObject("Msxml2.ServerXMLHTTP")

至於 header 這一行,一定要設
.setrequestheader "Cookie", "over18=1"
如果沒有,只會抓到是不是滿18歲那一頁的資料,沒辦法進入bbs,您可以自己試看看


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

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