• 156

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

S大您好,
使用附檔下載GOODINFO資料,
出現如下圖的問題,
不過返回原網頁確認,卻沒有該訊息式樣,
不知道是否可以指導一下哪邊出了狀況嗎,
謝謝!~




[點擊下載]
Morten Hsu

Snare大師 您好:#1442成功調用Chrome顯示自動化測試頁面,但執行chrome.FindElementByXPath遇到NoSuchElementError錯誤,請問是環境變數設定出錯嗎?

2024-09-07 10:52
strainny wrote:
不過返回原網頁確認,卻沒有該訊息式樣,
不知道是否可以指導一下哪邊出了狀況嗎,


上保護了,看準xmlhttp 不支援 javascript,一開始就擋住了,雖然方法很簡單,但是有效




目前node.js、python才有辦法處理,vba 只能用Selenium。
速度上還好,因為goodinfo有流量限制,本來就不快

前置作業:
一、裝好 chrome 、SeleniumBasic
二、vba 設定引用項目 Selenium type library 打勾








[點擊下載]
strainny

感謝S大,再好好拜讀[微笑]

2024-05-03 10:33
Soil_heart

請問, 照著做之後執行, 卻出現"cannot find Chrome binary" 的錯誤...該怎麼處理??

2024-08-19 13:01
請問一下大神
同樣也是因為IE沒辦法瀏覽goodinfo
錯誤訊息是 "請使用支援JavaScript的瀏覽器開啟本網站"
想請教用chrome 、SeleniumBasic 的寫法
感謝

[點擊下載]
ifye wrote:
想請教用chrome 、SeleniumBasic 的寫法


只寫重點,其它請自行改寫

前置作業:
一、裝好 chrome 、SeleniumBasic
二、vba 設定引用項目 Selenium type library 打勾








Sub test()

Dim chrome As New Selenium.ChromeDriver, UrL As String, i As Integer, test(1 To 2) As String

test(1) = "https://reurl.cc/2LmpVn"
test(2) = "https://reurl.cc/p6MLGe"


For i = 1 To 2

UrL = test(i)

chrome.Get UrL
'chrome.Window.Maximize

chrome.Wait 5000

Sheets(i).Cells.Clear

chrome.FindElementsByXPath("/html/body/table[2]/tbody/tr/td[3]/div[3]/div/div/table")(1).AsTable.ToExcel Sheets(i).Range("a1")

Next i



'debug
Stop

chrome.Quit
Set chrome = Nothing

End Sub

Snare大,
小弟寫了程式要抓"神秘金字塔"(https://norway.twsthr.info/StockHolders.aspx?stock=2330)的資料, 遇到了兩個問題, 請Snare大幫忙解惑!
1. 小弟所寫的程式抓到的資料全都擠在同一個Cell中, 程式裡Td/Tr的for loop完全起不到作用!
看它網頁的原始碼, 它也是用Td/Tr的呀, 請問是小弟哪寫錯了?
2. 另外, 想抓同一個網頁的另一分頁資料(如箭頭所指), 它的網址完全沒變化, 請問在這種情況下該如何抓取資料?

我所寫的程式:
=======================================
Sub M01_Fetch_Data_From_website()
'
Dim web_addr As String
Dim iCol As Integer
Dim iRow As Integer
Dim htm As Object
Dim Tr As Object
Dim Td As Object
Dim Tab1e As Object
Dim iTable As Integer


Set WS1 = Worksheets("Buffer")

web_addr = "https://norway.twsthr.info/StockHolders.aspx?stock=2330"
WS1.Select
Set HTML_Content = CreateObject("htmlfile")
With CreateObject("msxml2.xmlhttp")
.Open "GET", web_addr, False
.send
HTML_Content.Body.Innerhtml = .responseText
End With

Column_Num_To_Start = 1
iTable = 8
iRow = 2
iCol = Column_Num_To_Start
With HTML_Content.getElementsByTagName("table")(iTable)
For Each Tr In .Rows
For Each Td In Tr.Cells
WS1.Cells(iRow, iCol).Select
WS1.Cells(iRow, iCol) = Td.innerText
iCol = iCol + 1
Next Td
iCol = Column_Num_To_Start
iRow = iRow + 1
Next Tr
End With

End Sub
=========================================================



snare大神

我也遇到了同樣的問題
搞了好久才將Selenium搞定可以跑
雖然跑都有陣列錯誤 但至少有資料出來了

可請大神幫我改一下https://goodinfo.tw/tw/StockDividendPolicy.asp?STOCK_ID=2330
看要如何改嗎?

另外現在HTML原始碼看不到資料
請問大神要如何知道要選哪個table,div,.....??

再請大神解惑了


謝謝
yth0315 wrote:
1. 小弟所寫的程式抓到的資料全都擠在同一個Cell中, 程式裡Td/Tr的for loop完全起不到作用!
看它網頁的原始碼, 它也是用Td/Tr的呀, 請問是小弟哪寫錯了?
2. 另外, 想抓同一個網頁的另一分頁資料(如箭頭所指), 它的網址完全沒變化


1.沒這麼麻煩,只是一般的table,您只是抓錯

2.資料全部在同一頁,所以沒有變化

請參考318樓、1426~1429樓
yth0315

感謝Snare大神指點, 問題已解決! 感謝再感謝!

2024-05-20 23:35
rainbowsperm wrote:
另外現在HTML原始碼看不到資料
請問大神要如何知道要選哪個table,div,.....??


比較簡單的方式,就是用xpath + AsTable.ToExcel

1、chrome打開後,在下拉式清單上=>滑鼠右鍵=>檢查
2、在需改變的選項上=>滑鼠右鍵=>copy=>copy full xpath
(如果不需改變,可略過)










3、在需要下載的表格中=>滑鼠右鍵=>檢查
4、找到正確位置後(可看原網頁上是否正確選取)=>滑鼠右鍵=>copy=>copy full xpath
5、因為要用AsTable.ToExcel的功能,需視情況修正xpath的語法











Sub test()

Dim chrome As New Selenium.ChromeDriver, UrL As String, i As Integer, test(1 To 2) As String

test(1) = "2330"
test(2) = "2412"


For i = 1 To 2

UrL = "https://goodinfo.tw/tw/StockDividendPolicy.asp?STOCK_ID=" & test(i)

chrome.Get UrL
'chrome.Window.Maximize

chrome.Wait 5000


'debug
Stop

'select
chrome.FindElementByXPath("/html/body/table[2]/tbody/tr/td[3]/div[1]/table/tbody/tr/td/table/tbody/tr/td[3]/nobr/select/option[4]").Click



Sheets(i).Cells.Clear

' /html/body/table[2]/tbody/tr/td[3]/div[1]
chrome.FindElementsByXPath("/html/body/table[2]/tbody/tr/td[3]/div[1]/div/div/table[1]")(1).AsTable.ToExcel Sheets(i).Range("a1")

chrome.FindElementsByXPath("/html/body/table[2]/tbody/tr/td[3]/div[2]/div/div/table[1]")(1).AsTable.ToExcel Sheets(i).Range("a15")

Next i


chrome.Quit
Set chrome = Nothing

End Sub

snare wrote:
比較簡單的方式,就是...(恕刪)


謝謝snare大神詳盡的教學
又學了一招~~
感激不盡

請問Snare 大,
一個問題,
為何有時候編輯VBA時,呼叫所有的Sub 出來時,會出現圖片中的 module67 的sub
檔名+ module67 + redownload

謝謝
snare
snare 樓主

您大概是用vba列出所有副程式名稱,沒看到程式碼不清楚原因。

2024-06-06 21:26
  • 156
內文搜尋
X
評分
評分
複製連結
請輸入您要前往的頁數(1 ~ 156)
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?