前阵子优化海外工业站点的数据采集项目,对方升级Cloudflare风控之后,原来的Playwright无头架构成功率直接跌到28%,滑块验证通过率不足三成。一开始团队都以为是IP质量或者指纹算法的问题,换了三家住宅代理供应商,改了Canvas和WebGL指纹,折腾一周成功率也才摸到40%。
偶然间切到有头模式跑了两小时测试,结果吓了一跳:完全相同的IP、相同的账号、相同的操作逻辑,成功率直接冲到96%,验证码出现率不到5%。
这才反应过来:我们之前所有的优化都在绕外围,真正的核心问题出在无头模式本身——它的底层特征和真实浏览器差得太远,风控一眼就能识别出来,换多少IP都没用。
为了搞清楚差异到底在哪,我们做了一组严格的对照实验:同一台服务器、同一个固定住宅IP、同版本Chrome 128、完全一致的Cookie与初始环境,分别用旧无头、新无头、有头三种模式跑反爬测试站和真实业务站点,从表层属性到底层运行时,扒出了七层完整的差异点。
第一层:表层标志性属性——新手都知道,但改了也没用
最广为人知的差异,就是navigator.webdriver标志。无头模式下这个值默认是true,有头模式是undefined。网上90%的反检测脚本,核心就是把这个属性改成undefined。
但这也是最没用的一个检测点。现在的主流风控系统,早就不靠这个单一标志判断了。你改了这个属性,其他几十项特征还是异常的,综合评分照样超标。甚至反过来,刻意修改这个属性,本身就是一种可疑特征。
除了webdriver,这一层还有几个非常明显的表层差异:</