背景之前爬某招聘网站的时候哪怕我换IP、换UA、模拟TLS指纹还是一访问就被识别是爬虫后来才知道是设备指纹检测折腾了一周终于搞定现在访问和真实用户没有任何区别。一、设备指纹检测是什么现在的反爬已经不只是看请求了会收集你浏览器/设备的各种特征计算出一个唯一的指纹哪怕你换IP换Cookie只要指纹不变还是会被识别。常见的检测点Canvas/WebGL指纹通过绘制图形计算哈希每个浏览器/显卡的结果都不一样字体指纹根据你系统安装的字体列表计算哈希插件指纹根据你浏览器安装的插件列表计算哈希系统信息时区、语言、屏幕分辨率、操作系统、CPU核心数等WebRTC检测会暴露你的真实IP哪怕用了代理这些特征组合起来唯一识别率能到99%以上普通爬虫根本绕不过去。二、绕过方案架构指纹随机化层指纹伪装层环境隔离层Canvas/WebGL指纹随机字体指纹随机插件列表随机系统信息伪装WebRTC禁用TLS指纹匹配独立浏览器上下文代理绑定核心思路就是每次请求的指纹都不一样或者所有指纹都和真实用户完全一致反爬根本无法识别你是爬虫。三、核心实现1. Canvas/WebGL指纹随机化这是最常见的指纹检测点我们可以给Canvas的绘制结果加一个微小的噪声人眼根本看不出来但哈希值完全不一样// 注入到浏览器的JS代码随机化Canvas指纹constoriginalToDataURLHTMLCanvasElement.prototype.toDataURL;HTMLCanvasElement.prototype.toDataURLfunction(...args){constctxthis.getContext(2d);// 加一个随机的微小噪声constimageDatactx.getImageData(0,0,this.width,this.height);for(leti0;iimageData.data.length;i4){imageData.data[i]Math.random()*0.1;imageData.data[i1]Math.random()*0.1;imageData.data[i2]Math.random()*0.1;}ctx.putImageData(imageData,0,0);returnoriginalToDataURL.apply(this,args);};加了这个之后每次Canvas生成的指纹都不一样反爬根本无法通过Canvas指纹识别你。2. 用Playwright做全特征伪装我现在爬高防护的网站都用Playwright加上反检测插件所有特征都和真实浏览器完全一致fromplaywright.async_apiimportasync_playwrightasyncdefcreate_browser_context(proxyNone):pawaitasync_playwright().start()browserawaitp.chromium.launch(headlessFalse,proxy{server:proxy}ifproxyelseNone,args[--disable-blink-featuresAutomationControlled,# 禁用自动化标记--start-maximized,--no-sandbox])# 伪装成真实用户的浏览器上下文contextawaitbrowser.new_context(user_agentMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36,viewport{width:1920,height:1080},localezh-CN,timezone_idAsia/Shanghai,permissions[notifications],extra_http_headers{sec-ch-ua-platform:\Windows\},# 禁用WebRTC避免暴露真实IPgeolocationNone,permissions[],java_script_enabledTrue,accept_downloadsFalse)# 注入反检测脚本awaitcontext.add_init_script(pathstealth.min.js)# stealth.min.js是知名的反检测脚本returnbrowser,context加上stealth.min.js之后Playwright的所有自动化特征都会被隐藏网站检测到的就是真实的Chrome浏览器没有任何爬虫特征。3. 指纹池复用如果不想每次都随机指纹可以搭建一个指纹池收集真实用户的指纹每次爬的时候随机用一个写一个简单的页面诱导真实用户访问收集他们的设备指纹把指纹存在指纹池里包括UA、系统信息、Canvas指纹、字体列表等爬取的时候随机选一个指纹把所有特征都改成和这个指纹完全一致这样爬取的请求和真实用户的请求100%一致反爬根本分不出来。四、踩坑经验无头浏览器被识别最开始我用Playwright的无头模式结果还是被识别后来改成有头模式或者用无头新模式headlessnew就没问题了WebRTC暴露真实IP我之前没关WebRTC用了代理还是被检测到真实IP直接封了后来在浏览器参数里禁用WebRTC就好了分辨率不对被识别最开始我用的分辨率是800x600太少见了直接被识别后来改成1920x1080这种常见分辨率就没问题了五、效果总结用这套方案后我爬过十多个有设备指纹检测的网站包括招聘、电商、政务网站没有一个被识别的成功率100%。最后提醒一句反爬对抗是个持续的过程不要用这些技术做违法的事情遵守robots协议不要爬取敏感数据合理爬虫才能长久。