淺淺淺談 Selenium
什麼是 Selenium?
Selenium 網頁爬蟲是一種透過程式模仿人類操作瀏覽器的方式,例如點擊連結、填入文字框等等,以便取得網頁中的資料
如何安裝使用 Selenium
以下程式範例使用 Python 3.8,環境設定的部分暫不贅述
安裝 Selenium
pip install selenium
安裝瀏覽器驅動(Web driver)
要讓 Selenium 操作瀏覽器時,需要安裝對應的瀏覽器驅動,下列為幾種常用的瀏覽器驅動,可以依照個人喜好挑選
- Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
- Firefox: https://github.com/mozilla/geckodriver/releases
- Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
- Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/
後續範例皆使用 Chrome 瀏覽器
Selenium 示範
下面為一段簡單的範例程式碼
- 在這個範例中,我們使用了 Selenium 驅動了 Chrome 瀏覽器,執行時會自動開啟一個瀏覽器畫面。
- 接著我們開啟 https://www.example.com,並且使用 CSS 選擇器選定一個按鈕點擊它。
- 再來繼續使用 CSS 選擇器找到文字框,輸入
Hello, World!
,找到送出按鈕送出表單。 - 接下來再取得網頁中標題
h1
以及文字段落p
,並且印出所有文字段落內的文字。 - 最後在結束前,別忘了使用
quit()
關閉瀏覽器。
以上範例只是個參考,讓大家能夠大略上理解,如何透過 Selenium 操控瀏覽器將瀏覽網頁行為自動化。
接著會再介紹如何應用 Selenium 的其他功能,以便應付更複雜的情境。
如何等待特定條件滿足後接續執行
如果我們需要等待網頁DOM元件產生之後再爬取資料的話,與其直接用time.sleep()
的方式,更應該善用Selenium自帶的WebDriverWait
類別及expected_conditions
模組,來幫助我們寫出更有效率的爬蟲
WebDriverWait
是一個能夠等待特定條件達成後,才接著繼續執行後續程式的類別。 expected_conditions
模組中有各種條件功能,能夠結合上面的類別,以便完成整個等待的過程。
下面是個簡單的範例程式碼,讓爬蟲等待網頁中特定DOM元件完成顯示之後,再點擊此元件:
- 首先爬蟲開啟一個Chrome並且連到 https://www.example.com
- 接著建立一個
WebDriverWait
物件,並且設定最大等待時間10秒 - 再來使用
expected_conditions
模組中的visibility_of_element_located
去偵測指定DOM元件是否已經顯示在網頁中。這個函式需要一個參數去指定要偵測的DOM元件,這邊使用的是DOM的IDmy_element
WebDriverWait
的until
會等到條件滿足,或者是超過最大等待時間。若是條件滿足的話,則會回傳visibility_of_element_located
中指定的元件,好讓我們能對此元件做互動
擷取網頁回傳資料
有時候我們如果在爬取網頁時,需要擷取特定Http Request回傳的資料時,這時候我們就可以利用 Selenium 的 get_log
方法來達成目的
下面為簡單的程式範例
在上述程式碼中,我們依序做了下面幾件事:
- 設定Chrome記錄所有log並開啟瀏覽器
- 開啟我們想要抓取資料的網址
- 使用
get_log()
並且傳入參數'performance'
,讀取所有類型為performance的瀏覽器記錄 - 記錄的
message
中帶有Network.response
的留下,剩餘的濾掉
透過以上過程,我們可以取得網頁的Http response記錄
下一段我們使用 execute_cdp_command
方法來取得資料
接續前面取得的 network_logs
,我們接著後續步驟取得回傳資料
- 記錄的
message
欄位,其中資料為JSON string,因此使用json.loads()
解析成dict
格式並且留下message
存到變數msg
- 檢查
msg['method']
是否為Network.responseReceived
- 使用
execute_cdp_cmd()
透過 Chrome DevTools Protocol 的 Network.getResponseBody 指令,取得回傳資料
以上範例簡單演練了如何取得網頁Http Response的資料,好讓我們能使用回傳資料做後續處理
(Optional) 使用套件管理瀏覽器驅動
由於Selenium的瀏覽器驅動需要依照使用者安裝的瀏覽器,去選擇下載對應版本的驅動,因此可以額外使用 python 套件 Web Driver Manager
去自動下載新的瀏覽器驅動。適合在本機開發時若是瀏覽器時常更新版本的話,就不需要手動去下載新的驅動
pip3 install webdriver-manager
作者: Janus Lin
原始文章連結: https://blog.januslin.info/2023/03/21/selenium-intro/
版權聲明: 本網誌所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處