因为chromedriver启动的浏览器自带可被js读取的指纹特征,如navigator.webdriver恒为true、plugins列表为空、useragent存在偏差等,网站通过这些特征在页面加载初期即可识别自动化行为。

为什么 webdriver.Chrome() 一启动就被识别为自动化?
不是因为你写了 driver = webdriver.Chrome(),而是 ChromeDriver 启动的浏览器实例自带一组可被 JS 读取的指纹特征:比如 navigator.webdriver 始终为 true、chrome.runtime 缺失、plugins 和 languages 列表异常固定、userAgent 与真实浏览器存在细微偏差。反爬网站(如 Cloudflare、Akamai、部分电商登录页)会用这些做第一道过滤。
绕过 navigator.webdriver 检测的最小有效操作
仅靠 options.add_experimental_option("excludeSwitches", ["enable-automation"]) 或禁用 --enable-automation 是不够的——这些只影响启动参数,不修改运行时 JS 环境。必须在页面加载前注入 JS 补丁:
- 用
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...})注入脚本,覆盖navigator.webdriver为undefined - 同时删除
Object.defineProperty(navigator, 'webdriver', {get: () => undefined}),避免被 Object.defineProperty 检测到重写痕迹 - 不要用
driver.execute_script()在页面加载后执行——此时检测脚本可能已跑完
示例关键代码:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
'source': '''
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
});
'''
})
用户代理和屏幕参数不能硬编码
固定 --user-agent 或 --window-size 反而暴露风险。真实用户 UA 随系统、Chrome 版本、地区变化;窗口尺寸也常非整数(如缩放 125% 下 1280×720 实际渲染为 1024×576)。建议:
- 从公开的 UA 池(如
fake-useragent库)随机选一个,但需剔除明显测试 UA(含HeadlessChrome、PhantomJS) - 用
driver.get_window_size()获取当前窗口,再用driver.set_window_size(w, h)微调,避免设成标准分辨率 - 设置
--disable-blink-features=AutomationControlled,否则部分站点会通过 Blink 内部标志识别
鼠标和键盘行为比 User-Agent 更容易翻车
即使指纹伪装成功,鼠标轨迹直线移动、点击间隔精确 100ms、无滚动抖动、send_keys() 输入无错字修正,都会触发行为分析模型。简单补救方式有限但必要:
- 用
ActionChains(driver).move_by_offset(x, y).perform()替代直接click(),哪怕只是微小偏移(±3px) - 输入前先
time.sleep(random.uniform(0.2, 0.8)),再逐字符send_keys(char),中间夹杂 50–200ms 随机停顿 - 避免全屏
driver.maximize_window(),改用driver.set_window_rect()设定带边框的非标准尺寸(如宽高各减 17px)
没有“一劳永逸”的绕过方案。每次目标站点升级检测逻辑,原有补丁就可能失效;真正稳定的方案需要动态模拟真实用户交互节奏,而这已超出 Selenium 基础能力范围。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










