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

rainbowsperm wrote:
不過當貼到excel黨裡卻變成亂碼了


我試沒問題(200樓範例)
https://www.tpex.org.tw/web/bond/publish/convertible_bond_search/memo_download.php?d=issue.txt

snare wrote:
我試沒問題(200樓(恕刪)


不好意思沒說明清楚, 我是用200樓的方式下載了下面的檔案
t86.csv
但該檔案好像是UTF-8
filesystemobject好像不支援UTF-8?
有試著用大大之前的convertraw但卻失敗了~~~XD
再請大神指點
rainbowsperm wrote:
但該檔案好像是UTF-8


一、錄製巨集
二、開啟硬碟的csv檔
三、停止錄製
四、看看錄了什麼程式碼



google "open file for input vba"







Sub test()

Dim ADODBStream As Object, utf8_file As String

Set ADODBStream = CreateObject("ADODB.Stream")

Sheets("工作表1").Cells.Clear
Application.ScreenUpdating = False

With ADODBStream
.Charset = "utf-8"
.Open
.LoadFromFile ("C:\excel\t86.csv") '完整路徑+檔名
utf8_file = .ReadText()
.Close
End With

Application.ScreenUpdating = True

MsgBox utf8_file 'debug

Set Clipboard = Nothing
Set ADODBStream = Nothing

End Sub

snare wrote:
一、錄製巨集二、開啟(恕刪)


snare大大, U save my ass again!!!
一開始也是用錄巨集的方式
但想說有沒有更聰明的方式
但試了其他方法都不成功 找google是都往編碼的方向去找~~也沒試出結果
最終還是靠大大~~真是汗顏XD

再次謝謝大大
請問大大 超級新手要學會VBA爬蟲有沒有 教學書籍推薦 完全沒底子但非常想學
clothk73713 wrote:
請問大大 超級新手要學會VBA爬蟲有沒有 教學書籍推薦 完全沒底子但非常想學


這篇範例,我因為太無聊、打發時間,從2016年開始寫
而市面上的"繁體"書籍,最早好像是2018年才有,所以我沒辦法推薦
您可以去金石堂、博客來,找看看
如果看簡體字沒問題的話,您可以買大陸出版的,我認為技術層面上高很多

如果您有一點點vba基礎,看得懂我21樓的範例在寫什麼
基本上大部份的網站抓的到

如果您不介意速度,您可以google CreateObject("InternetExplorer.Application")
(或參考此樓少數的ie範例)
程式碼簡單,只要能正常看到網頁的網站,都可以抓下來
近日在twbts那邊看到這篇用ie下載pchome 股市的文章
http://forum.twbts.com/thread-22543-1-1.html

本以為pchome和yahoo一樣,用21樓的範例就可簡單下載

看了一下原始碼,才發現pchome用了redirect、隨機產生Referer的方式來開啟網頁
這種方式也是我沒寫過的,所以寫了這篇範例給各位參考

這次要下載的網頁是
https://pchome.megatime.com.tw/rank/
裡面的
https://pchome.megatime.com.tw/rank/sto0/ock03.html
(上市漲幅排行)








但是為了取得redirect後的location,需使用WinHttp.WinHttpRequest.5.1
可是有個問題pchome 是tls1.2,而WinHttpRequest.5.1預設值不支援
所以需要先安裝微軟官方的修補程式
雖然說是修補程式,但其實只有改了登錄檔(regedit)中的2個參數而已


詳細可參考微軟官方網頁,看是要手動修改,還是按下download,執行修補程式
(或是匯入我附檔中的2個reg)
https://support.microsoft.com/zh-tw/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi


可用以下程式碼檢查WinHttpRequest.5.1是否支援tls1.2

'修正前執行


'修正後執行(需重開excel或重開機)





Sub tls_check()

Dim Getxml As Object
Set Getxml = CreateObject("WinHttp.WinHttpRequest.5.1")

On Error Resume Next

With Getxml
'check 1

.Open "GET", "https://howsmyssl.com/a/check", False
.send
MsgBox Split(Split(.responsetext, "tls_version"":")(1), ",")(0)

'check 2
.Open "GET", "https://tlscheck.wubook.net", False
.send
MsgBox .responsetext

End With

Set Getxml = Nothing

End Sub




tls修正後,就可正常執行pchome 股市下載範例


Sub Get_Pchome_stock()

'需先使用微軟tls修補程式
'https://support.microsoft.com/zh-tw/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

'如果要下載https://pchome.megatime.com.tw/ 裡面的其它連結
'只需改url網址,.tags("table")位置,其它程式碼不變,有需要請自行練習


Dim HTMLsourcecode As Object, Getxml As Object, table As Object, i As Integer, j As Integer, Url As String, Url_a As String, ttt As Double
Set HTMLsourcecode = CreateObject("htmlfile")
Set Getxml = CreateObject("WinHttp.WinHttpRequest.5.1")


Url = "https://pchome.megatime.com.tw/rank/sto0/ock03.html" 'first page
'Url = "https://pchome.megatime.com.tw/rank/sto0/ock03_2.html"
'Url = "https://pchome.megatime.com.tw/rank/sto0/ock03_3.html"
'Url = "https://pchome.megatime.com.tw/rank/sto0/ock03_4.html"
'Url = "https://pchome.megatime.com.tw/rank/sto0/ock03_5.html" 'last page

ActiveSheet.Cells.Clear
Application.ScreenUpdating = False

ttt = Timer

With Getxml

.Open "GET", Url, False
.option(6) = False
.send

Url_a = .getResponseHeader("Location")

.Open "POST", Url, False
.setRequestHeader "Referer", Url_a
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Content-Length", LenB("is_check=1")
'.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 ("is_check=1")

HTMLsourcecode.body.innerhtml = .responsetext

End With

Set table = HTMLsourcecode.All.tags("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

ActiveSheet.Columns.AutoFit
Application.ScreenUpdating = True

Set HTMLsourcecode = Nothing
Set Getxml = Nothing
Set table = Nothing

Debug.Print "xml:" & Timer - ttt

End Sub



xml每次下載時間大約0.3秒
ie大約4秒



在下載pchome股市來說
使用ie會比較簡單,好處就是,看的到就抓的到,什麼redirect、location都不用管
可惜慢了一些,連續下載需注意ie釋放的問題,如果系統來不及釋放
那就會出現下面圖片中這個錯誤



xml相對之下就複雜多了,但速度大約快10倍,也可以連續下載

[點擊下載]
S大,你好:
下面是程式碼,大多COPY版主,請見諒.
我遇到問題:
是滙入網面,占太多記憶體,滙入資料很慢,幾乎快30分鐘,我快昏了.
請問:如何修改程式加快滙入,謝謝你.
Sub 撿股讚指檟區()
Sheets("撿股讚指檟區").Select '指定工作表
Sheets("撿股讚指檟區").Range("a1:zz3000").Clear '清除工作表內容

'----------------------------------------------------------------

Dim URL, HTMLsourcecode, GetXml
Set HTMLsourcecode = CreateObject("htmlfile")
Set GetXml = CreateObject("msxml2.xmlhttp")
URL = "https://stock.wespai.com/p/57932" 'https://stock.wespai.com/p/57932 撿股讚指檟區
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

HTMLsourcecode.body.innerhtml = .responsetext
Set Table = HTMLsourcecode.all.tags("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
End With
Set HTMLsourcecode = Nothing
Set GetXml = Nothing

'----------------------------------------------------------------

Range("A1").Select
ActiveWorkbook.Save '儲存
End Sub
g80860 wrote:
是滙入網面,占太多記憶體,滙入資料很慢,幾乎快30分鐘,我快昏了.
請問:如何修改程式加快滙入,謝謝你.(恕刪)


您好像是用某個大量下載要30分鐘程式碼,不知道是那個副程式在慢
所以抽出其中一個副程式發問,結果剛好拿到一個沒問題的問我

測試下載5次,每次約6秒左右,和您說的1800秒(30分鐘),似乎有很大的不同


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

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