Selenium Chrome --headless模式原理与访问被拦截问题咨询
无头Chrome被adidas拦截问题解答
1. 网站检测无头模式、校验页面渲染的常见逻辑
- 特征字段校验:原生无头Chrome的
navigator.userAgent会携带HeadlessChrome标识,navigator.webdriver属性默认为true(普通用户浏览器该属性为undefined),同时无头模式下浏览器的插件列表、mime类型列表均为空,和普通浏览器差异极大,WAF可以直接通过JS读取这些特征判断是否为爬虫。 - 渲染能力校验:网站会通过JS调用Canvas、WebGL等渲染接口生成指纹,无头模式的渲染结果和普通浏览器存在底层差异,对比哈希值即可识别;部分网站还会校验页面元素的渲染尺寸、位置是否符合正常浏览器的表现,判断是否为虚拟渲染环境。
- 行为特征校验:纯爬虫请求没有鼠标移动、点击、滚动等人类操作轨迹,请求间隔固定、无随机停留,也会被风控系统识别。
- 网络层特征校验:Selenium启动的浏览器请求头顺序、TLS握手指纹和普通用户浏览器存在差异,adidas的WAF可以直接识别Selenium的专属网络特征。
2. 服务端部署规避拦截的解决方案
- 基础参数优化:Chrome 112以上版本优先使用新版无头参数
--headless=new,伪装性远高于旧版--headless;同时补充启动参数:--disable-blink-features=AutomationControlled(抹掉自动化标识)、--window-size=1920,1080(固定视口大小)、--no-sandbox、--disable-dev-shm-usage(服务端运行Chrome必备兼容参数),手动替换userAgent为和普通桌面Chrome一致的UA,去掉无头标识。 - 使用反检测驱动:直接替换原生ChromeDriver为
undetected-chromedriver第三方库,该库对ChromeDriver做了底层修改,默认抹除几乎所有Selenium自动化特征,不需要手动修改大量参数,适配服务端环境成本极低。 - 模拟人类行为:访问页面后增加随机等待时间,用ActionChains模拟鼠标滚动、随机点击非敏感区域等操作,不要访问页面后立刻提取数据。
- 网络层优化:服务端部署优先使用住宅代理IP,不要使用数据中心IP,adidas对数据中心IP拦截率超过90%;保持请求IP属地、UA、Cookie的对应关系,不要频繁切换IP,正常维护Cookie生命周期。
- 备选方案:如果Selenium改造后仍然被拦截,可以换用Playwright框架,其自带的无头模式默认特征远少于原生Selenium,反拦截能力更强。
内容的提问来源于stack exchange,提问作者Denis Polikarpov
相关产品推荐
相关产品推荐

