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

lpviva wrote:
但不知如何刪除下拉選單框。
(恕刪)




lpviva wrote:
修改程式URL位置指向goodinfo融資餘額處,執行程式後結果畫面,無資料載入。
(恕刪)


網址不對,xmlhttp的寫法需找出真實下載位置
通常不是您在網頁上看到的那個(例如:702樓)
不像 ie object 寫法,只要等網頁開完就行(例如:705樓)

Url = "https://goodinfo.tw/StockInfo/StockList.asp?SEARCH_WORD=&SHEET=融資融券&SHEET2=資券增減統計&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資餘額&STOCK_CODE=&RPT_TIME=最新資料&STEP=DATA&RANK=0"


lpviva wrote:
goodinfo融資餘額下載畫面,下載時選單中的"排名範圍選擇"希望由原來的指定300檔,自動修改為"全部顯示"
(恕刪)


全部顯示的選項,需先登入會員



goodinfo會員需使用google帳號 或 facebook帳號
google、facebook 搜集資料又是出了名的強
而且大量下載太誇張的話,goodinfo會暫時擋ip
誰知道google、facebook、googinfo,在後台會互傳什麼資料

加上我不喜歡寫只有會員才能正常使用的範例,所以請分6次下載,再整理成一個表格
時間沒差多少,程式也比較易學




一次下載,只有快一點點



'(多次下載,請自行練習改寫)

Sub get_goodinfo()

Dim HTMLsourcecode, table, Clipboard As Object, Url As String, URL_a As String
Set HTMLsourcecode = CreateObject("htmlfile")
Set Clipboard = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")

Url = "https://goodinfo.tw/StockInfo/StockList.asp?SEARCH_WORD=&SHEET=融資融券&SHEET2=資券增減統計&MARKET_CAT=熱門排行&INDUSTRY_CAT=融資餘額&STOCK_CODE=&RPT_TIME=最新資料&STEP=DATA&RANK="

'RANK=0 1~300
'RANK=1 301~600
'RANK=2 601~900
'RANK=3 901~1200
'RANK=4 1201~1500
'RANK=5 1501~1575

URL_a = "https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=熱門排行&INDUSTRY_CAT=融資餘額&SHEET=融資融券&SHEET2=資券增減統計&RPT_TIME="

With CreateObject("WinHttp.WinHttpRequest.5.1")
'for i=0 to 5 ......迴圈開始位置
.Open "POST", Url & "0", False
.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
.setRequestHeader "Referer", URL_a
.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
.send

HTMLsourcecode.body.innerhtml = convertraw(.ResponseBody)
Set table = HTMLsourcecode.getElementById("divStockList") ' 剪貼薄方式
'Set table = HTMLsourcecode.all.tags("table")(1).Rows '逐格寫入方式

'整理用程式碼,請參考其它範例自行補上

'next i ...….迴圈結束位置
End With


Set HTMLsourcecode = Nothing
Set table = Nothing
Set Clipboard = Nothing


End Sub
Function convertraw(rawdata)

Dim rawstr
Set rawstr = CreateObject("adodb.stream")

With rawstr
.Type = 1
.Mode = 3
.Open
.Write rawdata
.Position = 0
.Type = 2
.Charset = "utf-8"
convertraw = .ReadText
.Close
End With

Set rawstr = Nothing

End Function








如果您不介意速度很慢,又想要一次下載,請改用 ie object


'ie object goodinfo+facebook登入 慢速版
Sub Test()

Dim IE As Object, DOM_event As Object, Url As String, table, i As Integer, j As Integer

ActiveSheet.Cells.Clear
Application.ScreenUpdating = False
On Error Resume Next

Set IE = CreateObject("InternetExplorer.Application")

With IE
.Visible = True
.Navigate "https://goodinfo.tw/StockInfo/index.asp"
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop

.document.all.Item("linkLoginFacebook").Click
Application.Wait (Now + TimeValue("0:00:10")) '等待facebook登入畫面,視電腦效能、網路狀態,修改適合時間

.document.all.Item("email").Value = "facebook 使用者名稱"
.document.all.Item("pass").Value = "facebook 使用者密碼"
.document.all.Item("loginbutton").Click
Application.Wait (Now + TimeValue("0:00:10")) '等待網頁跳轉,視電腦效能、網路狀態,修改適合時間


Url = "https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=%E7%86%B1%E9%96%80%E6%8E%92%E8%A1%8C&INDUSTRY_CAT=%E8%9E%8D%E8%B3%87%E9%A4%98%E9%A1%8D&SHEET=%E8%9E%8D%E8%B3%87%E8%9E%8D%E5%88%B8&SHEET2=%E8%B3%87%E5%88%B8%E5%A2%9E%E6%B8%9B%E7%B5%B1%E8%A8%88&RPT_TIME="
'"https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=熱門排行&INDUSTRY_CAT=融資餘額&SHEET=融資融券&SHEET2=資券增減統計&RPT_TIME="

.Navigate Url
Do While .Busy Or .ReadyState <> 4: DoEvents: Loop

Set DOM_event = .document.createEvent("HTMLEvents")
DOM_event.initEvent "change", True, False

.document.all.Item("selRANK").selectedindex = 6
.document.all.Item("selRANK").dispatchEvent DOM_event

Application.Wait (Now + TimeValue("0:00:40")) '等待查詢結果,視電腦效能、網路狀態,修改適合時間

Set table = .document.getelementsbytagname("table")(96).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.Cells.Columns.AutoFit

End With

IE.Quit
Set IE = Nothing
Set table = Nothing

Application.ScreenUpdating = True

End Sub


請問snare大大

我Sub getpost常會卡在
Set HTMLsourcecode = CreateObject("htmlfile")
只要一卡住就不能work
有時重開機就可以跑過, 有時就會卡住
google了一下還是沒法解決, 請問你知道是什麼問題嗎??


謝謝
rainbowsperm wrote:
我Sub getpost常會卡在
Set HTMLsourcecode = CreateObject("htmlfile")
只要一卡住就不能work
有時重開機就可以跑過, 有時就會卡住...(恕刪)


set 只是指派物件而己,基本語法
htmlfile,又是很基本的物件

您確定是停在 Set HTMLsourcecode = CreateObject("htmlfile") 這一行??
這時程式根本還沒開始真正執行

雖說set 物件很基本,但是在物件建立時,還是會用到硬碟裡面的檔案
(通常放在system32內,像是mshtml.tlb msxml5.dll msxml6.dll mshtml.dll)

不好意思,我不知道為什麼會卡住,加上您重開機偶爾正常,猜測可能原因
一、temporary internet files 暫存空間是 0,環境變數中的temp 不見了
二、硬碟壞軌
三、中毒


您可以把程式碼po上來,我看看是不是在set之前,寫了其它很奇怪的程式碼
或是您拿到別台電腦試看看

或是改用另一種物件建立方式試看看
需先設定引用項目,Microsoft HTML Object Library =>打勾



再把程式碼
Set htmlsourcecode = CreateObject("htmlfile")
改成這樣
Set HTMLsourcecode = New HTMLDocument

不然跑個1000次建立物件看看,電腦正常的情況下,是不可能有問題的

Sub test()

Dim htmlsourcecode As Object

For i = 1 To 1000
Set htmlsourcecode = CreateObject("htmlfile")
Cells(1, 1) = i
Set htmlsourcecode = Nothing
Next i

End Sub

snare wrote:
set 只是指派物件(恕刪)


感謝snare大大快速地回覆
試了新的建立方法還是遇到一樣的問題


我想是我自己電腦的關係
我再試試看, 謝謝大大的幫忙
snare wrote:
網址不對,xmlhttp...(恕刪)


實在太感謝snare兄,我想按照snare兄的免註冊分幾次下載,看來是比較好的做法。我想先不管資料格式,先下載下來再來撰寫程式控制格式。

按照snare兄的程式我做了很少很少的修改,執行時很快也很順利並無錯誤訊息顯示。經過一陣子電腦的計算在沒有在EXCEL工作表中出現與snare兄示範一樣的有資料結果,而是空白一片,我想可能有幾個原因。

1. 有關於Rank的變數設定每300筆資料下載一次, snare已將其標註,我沒改,不知Rank實際上是否是URL變數中引數的一部分?
2.迴圈這樣設定是否正確?

執行的結果看起來資料沒有下載到工作表內

再次謝謝snare兄指導修改。
lpviva wrote:
1. 有關於Rank的變數設定每300筆資料下載一次, snare已將其標註,我沒改,不知Rank實際上是否是URL變數中引數的一部分?
(恕刪)

vba 中顯示“綠色”,是註解、說明,或不想要執行的程式碼

是url中變數的一部份

lpviva wrote:
2.迴圈這樣設定是否正確?
(恕刪)


當然是對的,因為是我放上去的,您只是把註解刪掉而已,並沒有應用到url的變數中
所以跑6次,都是RANK=0的網址
.Open "POST", Url & "0", False

lpviva wrote:
經過一陣子電腦的計算在沒有在EXCEL工作表中出現與snare兄示範一樣的有資料結果,而是空白一片
(恕刪)


因為我把資料放入儲存格的程式碼刪掉了
您必需參考其它範例把程式碼補上
(放在程式碼中,藍色說明的位置)


程式碼中,有加上註解,2種方式選一個
剪貼薄方式,用下面這一行,請回頭看參考其它範例
只要程式碼中出現,dim Clipboard as .... 就是用剪貼薄
Set table = HTMLsourcecode.getElementById("divStockList")
debug.print table.innertext '可用debug.print 在即時運算視窗檢查
'
'這裡要補上程式碼
'


逐格寫入方式,用下面這一行,請回頭重新看一次21樓範例
Set table = HTMLsourcecode.all.tags("table")(1).Rows
debug.print table(1).cells(2).innertext '可用debug.print 在即時運算視窗檢查
'
'這裡要補上程式碼
'

至於為什麼要刪掉部份程式碼,因為從您720樓的發問、修改後的程式碼
發現您的vba基礎不夠好,所以希望您自己練習補上不足的程式碼

我只刪2部份
一、資料整理用程式碼(放入表格)
只要回頭去找其它範例,複製貼上就行,希望您能多少看一些文章

二、url + 變數
for... next、變數,是vba 基礎中的基礎,所以我不想直接給答案
請想辦法把變數代入url中,讓url 變這樣
"https://goodinfo.tw/StockInfo/Sto…中間略…&RANK=0"
"https://goodinfo.tw/StockInfo/Sto…中間略…&RANK=1"
"https://goodinfo.tw/StockInfo/Sto…中間略…&RANK=2"
"https://goodinfo.tw/StockInfo/Sto…中間略…&RANK=3"
"https://goodinfo.tw/StockInfo/Sto…中間略…&RANK=4"
"https://goodinfo.tw/StockInfo/Sto…中間略…&RANK=5"
另外需注意分次下載時,資料是分工作表放,還是接著最後一筆資料放
基礎只能靠自己
snare wrote:
vba 中顯示“綠色(恕刪)


師傅
我覺得您近期的文章比以前佛心很多...
解說得很詳細..

大家實在太幸福惹!!
請問以下這類的網站 要用什麼方式擷取資料 會比較快呢? 該參考哪一樓層的說明
謝謝
http://financials.morningstar.com/income-statement/is.html?t=AAPL&region=usa&culture=zh-TW&platform=sal
rainbowsperm wrote:
請問以下這類的網站 要用什麼方式擷取資料 會比較快呢? 該參考哪一樓層的說明
謝謝
http://financials.morningstar.com/income-statement/is.html?t=AAPL&region=usa&culture=zh-TW&platform=sal (恕刪)


寫法同223樓,csv 下載方式,但不需轉編碼、send不需參數



提示一、CreateObject("WinHttp.WinHttpRequest.5.1")
提示二、GET
提示三、(點下可看大圖)



排版請自行修改程式碼調整
snare wrote:
寫法同223樓,csv(恕刪)


謝謝樓主大大, 找時間來研究看看

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

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