Board logo

標題: 開發者工具selenium+vba用於網頁抓取資料的問題 [打印本頁]

作者: singo1232001    時間: 2019-4-30 12:58     標題: 開發者工具selenium+vba用於網頁抓取資料的問題

目前程式可以正常運行
想問幾個部分問題
1.如果我不用sendkey的方式,可否正常的將網頁當前頁面的所有資料全部複製到工作表上?
如果不行,可否直接抓取網頁上整個表格資料?而不用迴圈一個一個匯入,會很慢

2.網路上有查詢到可以不用開啟網頁,就能背景運行抓資料的方式,不知道是否能成功?


由於史萊姆selenium改版至今,好像寫法也有變化
網路上許多舊的開啟方式已經無法正常運行
小弟要抓的檔案是公司內部的chrome網頁,所以得靠這個方法
範例使用yahoo水泥股票的資料來測試
有的電腦可能會抓不到資料
建議在卡住的地方加上drive.waite 3000   '3000就是三秒
實際上我會用元素生成作為加載完成的判斷,以免網頁尚未加載完成就在複製
  1.     Dim driver As Selenium.ChromeDriver


  2. Sub yahoo()
  3. Application.ScreenUpdating = False  '停止螢幕更新
  4. Application.DisplayAlerts = False  '執行刪除前先暫時停止警告訊息,執行完須恢復警告訊息。
  5. On Error Resume Next


  6. Sheets("月表下載區").Select
  7. Sheets("月表下載區").Range("A:P").Select
  8. Selection.ClearContents


  9. Set driver = CreateObject("Selenium.ChromeDriver")  '啟動selenium

  10. URL = "https://tw.stock.yahoo.com/s/list.php?c=%A4%F4%AAd&rr=0.76405700%201556514294"
  11. driver.Get URL

  12. driver.Wait 1000
  13. SendKeys "^{a}"    '全選
  14. driver.Wait 500
  15. SendKeys "^{c}"     'copy
  16. driver.Wait 1000

  17. Sheets("月表下載區").Select
  18. Sheets("月表下載區").Range("a1").Select
  19. ActiveSheet.PasteSpecial Format:="HTML", link:=False, DisplayAsIcon:=False, NoHTMLFormatting:=True  '用純格式貼上
  20. driver.Wait 1000
  21. driver.Quit '結束selenium
  22. Application.DisplayAlerts = True '執行刪除前先暫時停止警告訊息,執行完須恢復警告訊息。
  23. Application.ScreenUpdating = True
  24.     End Sub
複製代碼

作者: singo1232001    時間: 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    時間: 2019-4-30 18:42

本帖最後由 joey0415 於 2019-4-30 18:44 編輯

https://www.udemy.com/complete-web-automation-with-excel-vba/

這課程只要360元
你考慮一下
我自己有買
應該是你要的答案
如果你要快一點
基本上只能用xmlhttp方式才能解決
[attach]30486[/attach]




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)