undetected-chromedriver 通过底层干扰检测链(如禁用 webdriver 属性、重写 navigator.webdriver、注入随机指纹行为、替换调试端口逻辑)规避识别,且默认避开 cdp 的 cdc_ 字符串检测;v3 是唯一活跃分支,需配合匹配版本 chromium 使用,安装须用 pip install undetected-chromedriver2,并注意环境配置与行为模拟。

undetected-chromedriver 为什么比普通 chromedriver 更难被识别
它不是简单地换了个启动参数,而是从底层干扰检测链:自动禁用 webdriver 属性、重写 navigator.webdriver、注入随机 canvas/fingerprint 行为、替换 Chrome 二进制的调试端口逻辑。关键在于它默认不走 Selenium 原生的 CDP 连接路径,避免触发 cdc_ 字符串检测(这是 Cloudflare、PerimeterX 等最常查的硬伤)。
但注意:undetected-chromedriver v2 已停止维护,v3 是当前唯一活跃分支,且必须配合 chromium 或特定版本 Chrome 使用,直接 pip install 的旧版大概率被秒封。
安装与基础启动必须避开的三个坑
常见失败不是代码问题,而是环境错配:
-
pip install undetected-chromedriver默认装的是 v2 —— 改用pip install undetected-chromedriver2(注意末尾是2)才是 v3 - Chrome 版本必须和
undetected-chromedriver2内置的 Chromium 版本对齐,否则启动报chrome not reachable;推荐直接让库自动下载:uc.Chrome(headless=False, use_subprocess=True) - Linux/macOS 下若提示
no DISPLAY或Failed to move to new namespace,不是缺 Xvfb,而是没加--no-sandbox和--disable-dev-shm-usage——uc默认不加这些,得手动传options
绕过常见 Bot 检测点的关键配置项
光靠默认启动远远不够,多数站点会检查 navigator.plugins、webgl.vendor、userAgent 一致性。以下配置能显著降低触发率:
- 用
uc.ChromeOptions()手动设置--user-agent,且要和requests请求头里的 UA 一致(否则fetch()时 UA 突变会被标记) - 禁用自动化特征:加
--disable-blink-features=AutomationControlled,并运行 JS 覆盖Object.defineProperty(navigator, 'webdriver', {get: () => undefined}) - 避免使用
driver.execute_cdp_cmd()—— v3 对 CDP 封装较弱,调用不当会暴露cdp连接痕迹;改用driver.execute_script()注入行为更安全
示例片段:
import undetected_chromedriver2 as uc
from selenium.webdriver.common.by import By
options = uc.ChromeOptions()
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
options.add_argument('--disable-blink-features=AutomationControlled')
driver = uc.Chrome(options=options)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
为什么页面能打开却卡在“正在验证”或无限刷新
这不是网络问题,而是检测逻辑升级了:有些站点(如 Ticketmaster、Cloudflare Turnstile)会监听 document.visibilityState、mouse movements、甚至 canvas.readData() 返回值是否过于“干净”。此时单纯隐藏 webdriver 不够,必须模拟真实交互节奏:
- 加载后等至少 2 秒再操作,用
time.sleep(2),别信WebDriverWait的“元素可见”判断 - 鼠标移动必须带贝塞尔曲线偏移,
ActionChains的直线移动太假;可用pyautogui模拟(需提前授权),或用driver.execute_script()注入带噪声的 mousemove 事件 - 如果目标页含 reCAPTCHA v3,它会在后台打分——哪怕你没点 checkbox,
grecaptcha.execute()返回的 token 分数过低也会被拒;这种场景建议直接放弃自动化,换人工打码或 API 接口
真实对抗中,指纹伪造只是第一层,行为建模才是持续失效的主因。别指望一套参数跑通所有站,每次遇到新反爬都得重新抓包看它验什么。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











