undetected-chromedriver 通过启动流程改造、二进制注入和JS环境补丁三层面绕过检测,如重写启动参数、屏蔽navigator.webdriver、替换cdc_指纹字符串;v3(undetected-chromedriver2)为当前主流,需禁用headless或使用--headless=new并配置--disable-blink-features=AutomationControlled;须动态UA、CDP覆盖屏幕信息、注入canvas干扰脚本以对抗指纹识别。

undetected-chromedriver 为什么比普通 chromedriver 更难被识别
它不是简单地隐藏 User-Agent 或禁用 webdriver 属性,而是从启动流程、二进制注入、JS 环境补丁三个层面绕过检测逻辑。比如自动重写 Chrome 启动参数、打 patch 阻止 navigator.webdriver 返回 true、替换 cdc_ 开头的浏览器指纹字符串——这些动作在进程启动早期就完成,普通 Selenium 脚本做不到。
但要注意:新版 undetected-chromedriver v2 已停止维护,v3(即 undetected-chromedriver2)才是当前主流,安装命令是:pip install undetected-chromedriver2。别装错包名,否则导入会报 ModuleNotFoundError。
初始化时必须关闭 headless 模式才能稳定运行
很多用户一上来就加 headless=True,结果页面白屏或直接崩溃。这是因为部分反爬 JS 依赖真实渲染上下文(如 canvas 测绘、webgl 查询),而无头模式下这些 API 行为异常,触发风控。
实操建议:
- 开发阶段一律用
headless=False,肉眼确认页面能正常加载和交互 - 上线前若真需无头,改用
options.add_argument("--headless=new")(Chromium 109+),并额外加--no-sandbox和--disable-gpu - 必须配合
options.add_argument("--disable-blink-features=AutomationControlled"),否则navigator.permissions.query({name:'notifications'})等调用可能暴露自动化痕迹
每次启动都要换 User-Agent 和窗口尺寸
固定 UA + 固定分辨率是典型机器人特征。即使用了 undetected-chromedriver,服务端仍可通过 navigator.userAgent、window.screen.width/height、screen.availWidth/availHeight 组合判断一致性。
推荐做法:
- 用
fake_useragent动态生成 UA:from fake_useragent import UserAgent; ua = UserAgent(); options.add_argument(f"--user-agent={ua.random}") - 启动后立即执行 JS 修改屏幕信息:
driver.execute_cdp_cmd("Emulation.setDeviceMetricsOverride", {"width": 1920, "height": 1080, "deviceScaleFactor": 1, "mobile": False}) - 避免使用
driver.set_window_size(),它不修改 JS 中的screen对象,只改浏览器窗口框
绕过 canvas 指纹检测要手动注入 canvas 噪声补丁
不少站点(如 Cloudflare Turnstile、hCaptcha)会调用 canvas.toDataURL() 提取绘图哈希值,同一台机器多次返回相同 hash 就判定为脚本。而 undetected-chromedriver 默认不处理这个。
解决方式是在页面加载完成后注入一段 canvas 干扰 JS:
canvas.toDataURL()
固定返回一个假 PNG base64,既避开哈希比对,又不破坏页面功能。注意必须在目标页面 document.readyState === 'complete' 后执行,太早会找不到 HTMLCanvasElement。
真正麻烦的是 WebGL 指纹,它更难伪造,目前没通用补丁。如果目标站依赖 WebGL 检测,就得考虑换真人验证方案,或者接受一定失败率。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











