023.(实战)定制化Chromedriver编译——彻底规避Selenium指纹检测
1. 为什么需要定制化Chromedriver如果你用过Selenium做爬虫或者自动化测试大概率遇到过被网站识别为机器人的情况。我自己就踩过这个坑——明明代码写得没问题目标网站却总是返回验证码或者直接封禁IP。后来排查发现问题出在Chromedriver这个中间人身上。Chromedriver会在浏览器中注入一些特殊属性比如cdc_adoQpoasnfa76pfcZLmcfl_Array这种一看就不正常的变量名。现代反爬系统通过检测这些特征可以轻松识别出Selenium控制的浏览器。我实测过几个主流检测网站使用原生Chromedriver时检测成功率100%使用Pyppeteer这类无头浏览器时检测率几乎为0但已有大量Selenium代码要迁移成本太高这就是为什么我们需要定制化编译Chromedriver——既保留现有Selenium代码架构又能消除那些暴露身份的指纹特征。下面这张表对比了不同方案的优劣方案代码改动量隐蔽性维护成本原生Chromedriver无极低低Pyppeteer迁移完全重写高中定制Chromedriver少量适配高低2. 指纹检测的核心原理要解决问题先得知道问题出在哪。打开浏览器开发者工具在Console执行这段代码let regex /^([a-z]){3}_.*_(Array|Promise|Symbol|JSON|Object|Proxy)$/; let allProps Object.getOwnPropertyNames(window); let filteredProps allProps.filter(prop regex.test(prop)); console.log(filteredProps);正常浏览器会输出空数组[]而Selenium控制的浏览器会打印6个cdc_开头的属性。这些就是Chromedriver注入的身份证。我逆向分析过Chromium源码发现这些属性定义在devtools_client_impl.cc文件中。Chromedriver通过修改浏览器原生对象的原型链来实现自动化控制。这种修改就像在脸上贴了我是机器人的标签想不被发现都难。3. 编译环境准备开始动手前需要准备好以下环境操作系统推荐使用LinuxUbuntu 20.04或macOSWindows也可以但需要额外配置硬件配置至少16GB内存100GB硬盘空间编译过程很吃资源依赖工具Git用于拉取Chromium源码Python 3.8Chromium构建工具依赖depot_toolsGoogle的代码管理工具集安装depot_tools的步骤git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH$PATH:/path/to/depot_tools然后获取Chromium源码注意这会下载约30GB数据mkdir chromium cd chromium fetch --nohooks chromium ./build/install-build-deps.sh gclient runhooks这个过程可能需要几个小时取决于你的网速。我在AWS c5.2xlarge实例上实测用了2小时13分钟。4. 关键代码修改源码下载完成后找到这个关键文件chrome/test/chromedriver/chrome/devtools_client_impl.cc用文本编辑器打开后搜索cdc_adoQpoasnfa76pfcZLmcfl会找到如下代码块std::string script (function () { window.cdc_adoQpoasnfa76pfcZLmcfl_Array window.Array; window.cdc_adoQpoasnfa76pfcZLmcfl_Object window.Object; // 其他4个类似定义... }) ();;这就是指纹的源头我们需要做的很简单——注释掉这些定义std::string script (function () { // window.cdc_adoQpoasnfa76pfcZLmcfl_Array window.Array; // window.cdc_adoQpoasnfa76pfcZLmcfl_Object window.Object; // 其他4行也注释掉... }) ();;有个细节要注意不同Chromium版本中这个变量名可能略有变化但模式都是cdc_前缀随机字符串对象类型。如果你找不到完全相同的变量名可以搜索cdc_这个固定前缀。5. 编译与打包代码修改完成后执行编译命令gn gen out/Default ninja -C out/Default chromedriver编译时间取决于你的CPU性能。我的MacBook Pro (M1 Pro)上大约需要15分钟。如果遇到编译错误可能是缺少依赖可以尝试./build/install-build-deps.sh gclient runhooks编译成功后会在out/Default目录下生成新的chromedriver可执行文件。这个文件就是我们的隐身版驱动。6. 效果验证用Python写个简单的测试脚本from selenium import webdriver from selenium.webdriver.chrome.service import Service service Service(./chromedriver) # 修改为你的路径 options webdriver.ChromeOptions() options.add_argument(--disable-blink-featuresAutomationControlled) driver webdriver.Chrome(serviceservice, optionsoptions) driver.get(https://bot.sannysoft.com/)访问几个常见的检测网站对比修改前后的结果检测网站修改前结果修改后结果bot.sannysoft.com检测到WebDriver未检测到browserscan.net识别为机器人识别为普通浏览器fingerprintjs.com高风险机器人低风险7. 高级定制技巧除了基本修改还可以进一步强化隐蔽性随机化UserAgentimport fake_useragent ua fake_useragent.UserAgent() options.add_argument(f--user-agent{ua.random})禁用自动化标志options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False)修改navigator属性Object.defineProperty(navigator, webdriver, { get: () undefined })指纹混淆options.add_argument(--fingerprintsrandom)这些技巧配合定制化的Chromedriver可以应对绝大多数检测场景。我在一个电商爬虫项目中实测检测率从100%降到了不足5%。8. 版本维护建议Chromium更新频繁建议建立自己的版本管理策略为每个主要Chrome版本保留一个修改分支使用Git标签标记修改点定期同步上游变更约每2个月一次建立自动化编译流程如GitHub Actions我维护了一个私有仓库用Docker自动构建各版本的无指纹驱动团队开发效率提升明显。虽然初期投入一些时间但长期来看节省了大量解决封禁问题的时间。记住浏览器指纹检测技术也在不断进化这个方案可能不是永久有效的。建议每隔3-6个月重新评估检测效果必要时调整策略。不过就目前来看经过深度定制的Chromedriver仍然是平衡开发成本和隐蔽性的最佳选择之一。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2438173.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!