selenium 4 默认仍会被轻易识别,因其默认注入cdc_变量、navigator.webdriver为true、chrome.runtime缺失、plugins异常、webgl.vendor含“headlesschrome”等硬指标。

单纯升级到 Selenium 4 并不能避免被识别为 WebDriver;真正起作用的是主动隐藏 WebDriver 特征、模拟真实用户行为、配合浏览器指纹管理——Selenium 4 只是提供了更底层的接口支持,比如 undetected-chromedriver 或手动 patch cdc_ 相关属性的能力更强了。
为什么 Selenium 4 默认仍会被轻易识别?
网站主要通过 JavaScript 检测以下特征:navigator.webdriver 值为 true、chrome.runtime 不存在、plugins 数量异常、webgl.vendor 返回空或含 “HeadlessChrome” 字样等。Selenium 4 的 ChromeDriver 默认仍注入 cdc_ 开头的混淆函数,并保留 webdriver 属性,这些是反爬最常查的硬指标。
-
driver.execute_script("return navigator.webdriver")返回true是最直接的暴露点 - 新版 Chrome(110+)开始默认启用
--disable-blink-features=AutomationControlled,但 Selenium 4 不会自动加这个参数 -
user-agent若未覆盖,可能带HeadlessChrome或版本与真实浏览器不匹配
必须做的三项基础 Patch(Selenium 4 + Chrome)
仅靠 options.add_argument("--disable-blink-features=AutomationControlled") 不够,需组合生效:
- 在启动前用
options.add_experimental_option("excludeSwitches", ["enable-automation"])和options.add_experimental_option('useAutomationExtension', False)关闭自动化扩展加载 - 启动后立即执行 JS 覆盖关键属性:
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"}) - 手动伪造
user-agent并禁用--headless(除非你真用 headless):例如options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...")
哪些“增强方案”实际效果有限或已失效?
很多博客推荐的方案在主流检测(如 Cloudflare、Akamai、PerimeterX)面前已基本无效:
- 只改
cdc_变量名(如 patchchromedriver二进制):Chrome 114+ 后该字符串不再固定出现,且服务端已转向多维行为建模 - 用
pyppeteer或playwright替代:同样有navigator.webdriver和启动特征,不 patch 一样被秒杀 - 随机 delay + 模拟鼠标移动:对 DOM 级检测无效,只能绕过极简规则,无法影响
WebGL、canvas、audioContext指纹校验
真正稳定可用的路径只有两条:一是用 undetected-chromedriver v3(基于 Selenium 4 封装,自动处理 CDP 注入和二进制 patch),二是自己维护一套基于 driver.execute_cdp_cmd 的指纹抹除逻辑——后者要求你持续跟进 Chrome 版本变更对 cdc_、remote-debugging-port、metrics 等新注入点的调整。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











