在上一篇有效利用ScraperAPI打造不被偵測的Python網頁爬蟲文章中,介紹了Python網頁爬蟲串接ScraperAPI爬取網頁資料的方式,透過它隨機輪換Proxy IP、瀏覽器標頭等機制,讓我們不用擔心網頁爬蟲被偵測封鎖。那如果今天遇到了動態網頁,需要使用Selenium套件來操作網頁的話,該如何與ScraperAPI進行串接呢?這篇文章就來分享Selenium串接ScraperAPI的過程。
- 建置Selenium網頁爬蟲專案
- Selenium串接ScraperAPI建置網頁爬蟲
- Selenium爬取網頁資料
- 解決Selenium Wire憑證問題
一、建置Selenium網頁爬蟲專案
但是平常使用Selenium的webdriver,預設是會忽略Proxy Server(伺服器)的帳號和密碼,這時候如果要使用像ScraperAPI需要帳號和密碼驗證的Proxy Server(伺服器),就要使用Selenium Wire模組,它擴充了Selenium的功能,讓開發人員能夠檢查、操作瀏覽器發出的請求。它的安裝方式如下:
$ pip install selenium-wire
from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組
更多Selenium模組的引用時機和介紹,可以參考全面掌握Selenium建置動態網頁爬蟲的步驟與重要模組文章。
二、Selenium結合ScraperAPI建置網頁爬蟲
登入ScraperAPI,前往左側選單的API playground,在Build request(建立請求)的區域選擇Proxy mode,如下圖:
from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組 proxies = { "http": "scraperapi:你的API KEY@proxy-server.scraperapi.com:8001" }
from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組 proxies = { "http": "scraperapi:你的API KEY@proxy-server.scraperapi.com:8001" } driver = webdriver.Chrome( ChromeDriverManager().install(), seleniumwire_options=proxies )
from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組 proxies = { "http": "scraperapi:你的API KEY@proxy-server.scraperapi.com:8001" } driver = webdriver.Chrome( ChromeDriverManager().install(), seleniumwire_options=proxies ) driver.get('https://www.inside.com.tw/tag/ai')
這樣每當啟動Selenium瀏覽器時,就可以透過ScraperAPI的Proxy Server(伺服器),隨機輪換不同的Proxy IP來發送請求,達到降低被網站偵測封鎖的風險。
三、Selenium爬取網頁資料
from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組 proxies = { "http": "scraperapi:你的API KEY@proxy-server.scraperapi.com:8001" } driver = webdriver.Chrome( ChromeDriverManager().install(), seleniumwire_options=proxies ) driver.get('https://www.inside.com.tw/tag/ai') # 爬取網頁上的所有文章標題元素 titles = driver.find_elements(By.CSS_SELECTOR, "h3[class='post_title']")
from seleniumwire import webdriver from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組 proxies = { "http": "scraperapi:你的API KEY@proxy-server.scraperapi.com:8001" } driver = webdriver.Chrome( ChromeDriverManager().install(), seleniumwire_options=proxies ) driver.get('https://www.inside.com.tw/tag/ai') # 爬取網頁上的所有文章標題元素 titles = driver.find_elements(By.CSS_SELECTOR, "h3[class='post_title']") for title in titles: print(title.text) #印出爬取到的文章標題文字
執行結果如下:
世界第一位 AI 軟體工程師「Devin」,能全自動完成複雜工程任務 Google 在台力推 Gemini 學院!第三條海底電纜也將完工啟用 黃仁勳:就算對手免費提供晶片,用 NVIDIA 還是更划算 Oracle 面對 AI 伺服器強勁需求,正在建可容納 8 台波音 747 的資料中心 Palantir 贏得美軍 1.78 億美元合約,打造戰地 AI 情報站「泰坦」 ...
四、解決Selenium Wire憑證問題
在執行結果中,大家會看到很多CA(Certificate Authority)憑證的錯誤訊息,如下:
[19468:16376:0324/183300.283:ERROR:cert_verify_proc_builtin.cc(878)] CertVerifyProcBuiltin for ads.ad2iction.com failed: ----- Certificate i=1 (CN=Selenium Wire CA) ----- ERROR: No matching issuer found
這是因為Selenium Wire使用自己的root certificate(根憑證)解密HTTPS傳輸,而這個憑證瀏覽器並不信任,所以儘管出現錯誤訊息,瀏覽器及網頁爬蟲仍然可以正常運作。
解決的方法非常的簡單,只要把Selenium Wire的憑證加入到瀏覽器的設定中即可。而Selenium Wire的憑證可以利用以下的指令取得:
$ python -m seleniumwire extractcert
執行之後,在專案中就會有一個ca.crt憑證檔案。接下來,開啟Chrome瀏覽器,前往設定頁面,點擊左邊欄的「隱私權和安全性」,選擇「安全性」,如下圖:
五、小結
以上就是Selenium網頁爬蟲串接ScraperAPI的實作方法,真的是非常的簡單,並且保有原來Selenium爬取網頁資料的語法,對於開發人員來說,可以快速上手,除此之外也提升了網頁爬蟲的穩定度,減少被網站偵測封鎖的風險。
留言
張貼留言