開發者工具selenium+vba用於網頁抓取資料的問題
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
開發者工具selenium+vba用於網頁抓取資料的問題
目前程式可以正常運行
想問幾個部分問題
1.如果我不用sendkey的方式,可否正常的將網頁當前頁面的所有資料全部複製到工作表上?
如果不行,可否直接抓取網頁上整個表格資料?而不用迴圈一個一個匯入,會很慢
2.網路上有查詢到可以不用開啟網頁,就能背景運行抓資料的方式,不知道是否能成功?
由於史萊姆selenium改版至今,好像寫法也有變化
網路上許多舊的開啟方式已經無法正常運行
小弟要抓的檔案是公司內部的chrome網頁,所以得靠這個方法
範例使用yahoo水泥股票的資料來測試
有的電腦可能會抓不到資料
建議在卡住的地方加上drive.waite 3000 '3000就是三秒
實際上我會用元素生成作為加載完成的判斷,以免網頁尚未加載完成就在複製- Dim driver As Selenium.ChromeDriver
- Sub yahoo()
- Application.ScreenUpdating = False '停止螢幕更新
- Application.DisplayAlerts = False '執行刪除前先暫時停止警告訊息,執行完須恢復警告訊息。
- On Error Resume Next
- Sheets("月表下載區").Select
- Sheets("月表下載區").Range("A:P").Select
- Selection.ClearContents
- Set driver = CreateObject("Selenium.ChromeDriver") '啟動selenium
- URL = "https://tw.stock.yahoo.com/s/list.php?c=%A4%F4%AAd&rr=0.76405700%201556514294"
- driver.Get URL
- driver.Wait 1000
- SendKeys "^{a}" '全選
- driver.Wait 500
- SendKeys "^{c}" 'copy
- driver.Wait 1000
- Sheets("月表下載區").Select
- Sheets("月表下載區").Range("a1").Select
- ActiveSheet.PasteSpecial Format:="HTML", link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True '用純格式貼上
- driver.Wait 1000
- driver.Quit '結束selenium
- Application.DisplayAlerts = True '執行刪除前先暫時停止警告訊息,執行完須恢復警告訊息。
- Application.ScreenUpdating = True
- End Sub
複製代碼 |
|
|
|
|
|
|
- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
2#
發表於 2019-4-30 13:17
| 只看該作者
https://stackoverflow.com/questions/38613307/using-selenium-vba-bringing-the-cell-values-from-a-dynamic-web-page-table-to-exc
如果只是單一元素或者單一值的部分我能夠處理
但是當資料為表格狀況時,資料量太多,一個一個處理或者去抓有點太累
我可以先全部丟到excel內我在慢慢處理,也比較好寫...
大部分都用類似這種的雙迴圈抓表格
只是有點慢...
想說利用剪貼簿的方式直接全部貼上
因為我有的表格幾萬列....
For Each posts In driver.FindElementsByXPath("//table[contains(@class,'daen-report')]")
For Each post In posts.FindElementsByXPath(".//tr")
For Each t_data In post.FindElementsByXPath(".//td[@class='row-odd']|.//td")
y = y + 1
Cells(x, y) = t_data.Text
Next t_data
x = x + 1
y = 0
Next post
Next posts
而我原先用的就是類似這種的
https://stackoverflow.com/questions/23992826/vba-ctrla-to-select-all-content-in-a-page-by-selenium-webdriver
但因為在程式執行中
如果點擊了瀏覽器或者任何檔案資料夾
網頁跟excel的啟用狀態會消失
會導致鍵盤操控去複製到錯誤的地方
像excel vba本身好像有
ie.ExecWB 17,1'// SelectAll
ie.ExecWB 12,2'//複製選擇
的方式....
關於後臺開啟
https://stackoverflow.com/questions/16180428/can-selenium-webdriver-open-browser-windows-silently-in-background
https://stackoverflow.com/questions/48597592/how-to-make-selenium-chromedriver-run-headlessly-in-vba
https://stackoverflow.com/questions/42801833/how-to-run-chrome-driver-in-headless-mode-or-in-background
https://stackoverflow.com/questions/44028584/run-selenium-without-wrapper-installed |
|
|
|
|
|
|
暱稱: joey0415
中學生
- 帖子
- 361
- 主題
- 57
- 精華
- 0
- 積分
- 426
- 點名
- 0
- 作業系統
- win7
- 軟體版本
- 2003,2010
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2010-5-13
- 最後登錄
- 2022-12-8
|
3#
發表於 2019-4-30 18:42
| 只看該作者
本帖最後由 joey0415 於 2019-4-30 18:44 編輯
https://www.udemy.com/complete-web-automation-with-excel-vba/
這課程只要360元
你考慮一下
我自己有買
應該是你要的答案
如果你要快一點
基本上只能用xmlhttp方式才能解決
|
|
|
|
|
|
|