开源免费爬虫浏览器、反检测指纹浏览器之过webdriver特征和过无头模式检测
1. WebDriver 检测的核心原理
Chromium 浏览器在自动化测试时(通过 WebDriver、Selenium 或 Puppeteer)会暴露特定的特征,网站可以通过这些特征检测是否处于自动化环境。以下是主要的检测机制:
1.1 navigator.webdriver 属性
- 检测原理:
当浏览器被 WebDriver 控制时,Chromium 会自动设置 navigator.webdriver = true,而普通浏览器中该值为 undefined 或 false。
- 检测代码示例:
if (navigator.webdriver) { console.log("检测到自动化脚本!"); }
1.2 命令行参数检测
- 检测原理:
WebDriver 启动浏览器时会添加特定参数(如 --enable-automation、--headless),这些参数可能被 JavaScript 检测。
- 检测代码示例:
const userAgent = navigator.userAgent.toLowerCase(); if (userAgent.includes('headless') || userAgent.includes('enable-automation')) { console.log("检测到无头模式或自动化环境!"); }
2. 绕过 WebDriver 检测的方法
2.1 修改 navigator.webdriver 属性
方法 1:使用 Chrome DevTools Protocol (CDP) 覆盖属性
在启动浏览器时,通过 CDP 注入脚本,删除或覆盖 navigator.webdriver:
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") driver = webdriver.Chrome(options=options) driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": """ delete navigator.__proto__.webdriver; Object.defineProperty(navigator, 'webdriver', { get: () => false }); """ })
方法 2:直接修改 Chromium 源码(高级)
- 文件路径:third_party/blink/renderer/core/frame/navigator.cc
- 修改方式:强制返回 false,使 navigator.webdriver 始终为假。
bool Navigator::webdriver() const { return false; // 直接返回 false,绕过检测 /* if (RuntimeEnabledFeatures::AutomationControlledEnabled()) return true; bool automation_enabled = false; probe::ApplyAutomationOverride(GetExecutionContext(), automation_enabled); return automation_enabled; */ }
编译生效:修改后需重新编译 Chromium 才能生效。
2.2 绕过无头模式(Headless)检测
方法 1:修改 userAgent 和启动参数
options = webdriver.ChromeOptions() options.add_argument("--headless=new") # 新版 Chrome 推荐方式 options.add_argument("--disable-blink-features=AutomationControlled") options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=options)
方法 2:修改 Chromium 源码(彻底绕过)
- 文件路径:src/headless/lib/browser/headless_browser_impl.cc
- 修改方式:将 HeadlessChrome 改为 Chrome,避免被检测到无头模式。
// 原代码:const char kHeadlessProductName[] = "HeadlessChrome"; const char kHeadlessProductName[] = "Chrome"; // 修改后
编译生效:修改后需重新编译 Chromium。
4. 总结
检测方式 绕过方法 navigator.webdriver CDP 注入脚本 / 修改 Chromium 源码 命令行参数 (--enable-automation) 移除参数 / 修改 userAgent 无头模式 (HeadlessChrome) 修改源码 / 使用 --headless=new 自动化扩展检测 禁用 enable-automation 最佳实践:
- 优先使用 CDP 注入脚本(无需修改源码)。
- 如需长期稳定绕过,可编译修改版 Chromium。
通过本文,你可以彻底理解 WebDriver 检测机制,并掌握多种绕过方法,适用于爬虫、自动化测试等场景。
本专题系列教程源码将放在 github 上开源指纹浏览器供大家学习,大家可以关注我,或者star github项目来收到更新通知。
(图片来源网络,侵删)(图片来源网络,侵删)(图片来源网络,侵删)
- 检测原理:
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。