https://github.com/ultrafunkamsterdam/unDetected-chromedriver
優化的 Selenium Chromedriver 修補程式不會觸發 Distill Network / Imperva / DataDome / Botprotect.io 等反機器人服務會自動下載驅動程式二進位檔案並對其進行修補。
pip install undetected-chromedriver
或者,如果您喜歡冒險,可以直接透過 github 安裝
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
我將對問題追蹤器進行限制。它已經被濫用太久了。
有什麼好消息嗎?
是的,我已經打開了未檢測到的討論,我認為從長遠來看這將幫助我們更好。
這個包不會,我再說一遍,不會隱藏您的 IP 位址,因此當從資料中心(甚至更小的資料中心)運行時,您很有可能無法通過!還有,如果你在國內的ip信譽低的話,你就不會通過!
從家裡和資料中心運行以下程式碼。
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
大更新!請小心,因為它可能會破壞您的程式碼。
重寫了反檢測機制,而不是刪除和重命名變量,我們只是保留它們,但首先防止它們被注入。這將使我們至少在不久的將來不會被發現。
重寫檔案命名,以防止最終出現 1000 個 {randomstring}_chromedriver.exe ,而只是稱為 unDetected_chromedriver.exe
cleanup 刪除了 compat、v2 檔案和測試資料夾
新增了 WebElement.click_safe() 方法,您可以嘗試該方法,以防單擊連結後被偵測到。這不能保證有效。
新增了 WebElement.children(self, tag=None, recursive=False) 以輕鬆取得/尋找子節點。例子:
body = driver.find_element('tag name', 'body')
# get the 6th child (any tag) of body, and grab all img's within (recursive).
images = body.children()[6].children('img', True)
srcs = list(map(lambda _:_.attrs.get('src'), images))
添加了 example.py ,我可以在提出愚蠢問題時指出人們(不,它實際上很酷,每個人都應該看到它)
增加了對 lambda 平台的支持
新增了對 x86_32 的支持
新增了對報告為 linux2 的系統的支持
一些重構
use_subprocess 現在預設為 True。太多人不理解 multiprocessing 和name == ' main ,經過測試,在 chrome 104+ 中似乎不再有什麼區別
新增了 no_sandbox,預設為 True,並且沒有煩人的「您正在使用不安全的命令列...」欄。
更新 Docker 映像。現在您可以透過 vnc 或 rdp 進入容器來查看實際的瀏覽器窗口
當然,「常規」模式也可以
此版本might
破壞您的程式碼,請在更新之前進行測試!
新增了新的反檢測邏輯!
v2 已成為主模組,因此不再需要引用 v2。這意味著您現在可以簡單地使用:
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
為了向後相容,v2 沒有被刪除,而是主模組的別名。
修正了非 Windows 作業系統上「歡迎畫面」的煩人問題。對於那些喜歡歡迎畫面並向Google提供更多數據的戀物癖者,請使用 Chrome(suppress_welcome=False)。
在建構子中替換了executable_path
,以支援browser_executable_path
,除非您是邊緣情況(是的,您是),無法將自訂chrome安裝資料夾新增至PATH環境變量,或擁有大量不同的瀏覽器/版本,否則不應使用該路徑並且自動尋找傳回錯誤的瀏覽器
「v1」(?)暫時移至 _compat。
固定依賴版本
ChromeOptions 自訂處理已刪除,因此它與webdriver.chromium.options.ChromiumOptions
相容。
刪除 Chrome.get() fu 並恢復到「幾乎」原始狀態:
with
語句,儘管為了向後相容它仍然可以工作。迄今為止測試成功率:100%
只是再提一下,因為有些人很難閱讀: headless 仍然是 WIP。提出問題是沒有必要的
將流程建立行為改為完全分離
更改 .get(url) 方法以始終使用 contextmanager
更改了 .get(url) 方法以在背景使用 cdp。
... with
語句不再需要了..
todo:致力於非同步化和 selenium 4
每當你遇到驚慌失措的時候
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
解決方案很簡單:
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
2021 年 7 月:目前正忙於為 unDetected-chromedriver 實作 selenium 4
新聞快報:#255
為了避免不必要的麻煩和引發問題,請注意本文檔末尾的重要說明。
從字面上看,這就是您所要做的。設定已包含在內,並且會自動找到您的瀏覽器執行檔。這也是我建議您在遇到問題時使用的程式碼片段。
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
從字面上看,這就是您所要做的。如果指定的資料夾不存在,則會建立新的設定檔。像這樣指定的資料目錄在退出時不會自動刪除。
import undetected_chromedriver as uc
options = uc . ChromeOptions ()
# setting profile
options . user_data_dir = "c: \ temp \ profile"
# use specific (older) version
driver = uc . Chrome (
options = options , version_main = 94
) # version_main allows to specify your chrome version instead of following chrome global version
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
從字面上看,這就是您所要做的。您現在可以收聽並訂閱低階 devtools 協議。我最近才發現,官方 chromedriver 的未來版本也在計畫中。不過我現在實現了自己的。因為我自己需要它來進行調查。