一個業務需求是從一個網站上抓取客戶的評論資訊,評論資料已經渲染好在html上由介面返回的,只能從HTML上一個個扣資料。一開始是使用的HtmlUnit來處理,但期間一直丟擲拒絕訪問提示但是從瀏覽器可以直接訪問,我就換別的網站進行訪問,別的網站能夠正常抓取資料,期間也試過設定請求頭,直到在除錯時偶然丟擲不一樣的錯誤>at script.M(https://challenges.cloudflare.com/turnstile/v0/g/d2a97f6b6ec9/api.js?onload=KHGO2&render=explicit:1)
沒截到圖,搜了才發現該網站使用了cloudflare的人機檢查,猜想HtmlUnit可能不是真正的請求,而是模擬的請求所以被cloudflare攔了下來。所以換了Selenium來處理
Selenium不能單獨使用,需要和不同瀏覽器的Driver來配合使用,我使用的是ChromeDriver
1.下載Chrome和對應版本的ChromeDriver
Chrome版本和ChromeDriver版本要對手不讓回丟擲錯誤
我的chrome是126的版本
chromeDriver就也需要下載126版本 114及114之前的版本可以從這下載
http://chromedriver.storage.googleapis.com/index.html
最新版本需要到這下載
https://googlechromelabs.github.io/chrome-for-testing/
2.新增selenium依賴
3.訪問頁面
相關程式碼
還是丟擲403 禁止訪問
將selenium依賴升級到4.10 訪問成功
可是這裡訪問的頁面不是網站頁面而是cloudflare人機檢查的頁面
看來selenium也繞不過cloudflare人機檢查
只能再換方法了
這次使用undetected_chromedriver解決了cloudflare的人機檢查成功訪問了主頁
undetected_chromedriver是用python編寫的,所以轉型用python實現
1.下載undetected_chromedriver 安裝python就不做贅述了
pip install undetected-chromedriver
檢視undetected-chromedriver
pip show undetected-chromedriver
下載的時候可能會丟擲錯誤
WARNING: Failed to write executable - trying to use .deleteme logic
ERROR: Could not install packages due to an OSError: [WinError 2] 系統找不到指定的檔案。: 'C:\Python312\Scripts\wsdump.exe' -> 'C:\Python312\Scripts\wsdump.exe.deleteme'
這時往前面翻一下會有一個WARNING提示pip版本不夠,用它提示的語句升級pip的版本就可以了
使用undetected_chromedriver連線網站試試 丟擲錯誤
ModuleNotFoundError: No module named 'distutils'
下載module就行
pip install setuptools
相關程式碼
成功訪問主頁
結尾報錯是undetected_chromedriver未正常關閉的原因
從提示的路徑找到__init__.py檔案
修改第 798 行time.sleep(0.1)
為try: time.sleep(0.1) except OSError: pass
錯誤消失
2.下載selenium
pip install selenium
3.使用selenium+undetected_chromedriver+chromedriver.exe測試(chromedriver.exe可以換成webdriver_manager)
程式碼
資料
接下來就是使用selenium定位元素獲取了