- 项目概述:为什么你的脚本总被"抓包"?
要是你正处于进行自动化测试或者开展数据采集的状况下, 极有可能遭遇过这个令人头疼不已的问题, 脚本原本运行得十分顺畅, 然而突然间就被目标网站鉴定为机器人, 紧接着弹出一个验证码, 又或者干脆直接拒绝给予访问权限。此时你可能会大为疑惑, 我分明用的是真正的浏览器内核, 并且操作也模仿了人类行为, 怎么就被察觉了呢? 在这背后, 实则是一场自动化脚本与网站反爬虫以及反机器人系统之间始终未曾间断的"猫鼠游戏"。
网站所具备的反检测技术, 可不是仅仅只检查你有没有使用无头模式这般容易了的, 它会借助一系列繁杂的"指纹"去认识浏览器环境, 这些指纹涵盖但不限于, 浏览器所暴露的 . 属性, 用户代理字符串里是不是含有""字样, 浏览器支撑的插件列表, WebGL渲染器信息, 字体列表, 屏幕分辨率跟色彩深度, 甚至是你执行之际的细微时间差距。一个原生的浏览器实例, 它未经任何修饰, 这就如同有个穿着标准制服的士兵走进了平民区, 其特征太过明显, 所以很容易被"哨兵"一眼就识破了。
就是为解决这个问题, 才产生了这个库。它的目标并非是要把你变成"隐形人", 而是要更换掉"士兵"你身上的制服, 消除掉那些太过标准的特征, 以让你看上去更宛如一个普通的、由真人操控的浏览器。它借助一连串高超奇异的技术手法的运用, 去调整浏览器在运行之际的各类属性以及行为表现, 进而能够有效地避开当前市面上绝大多数寻常常见的检测办法。简而言之, 它能让你的自动化脚本形象, 从"一眼假"转变成"以假乱真"。
我将会结合自身多年于自动化领域所积累的实战经验, 针对这篇文章, 为你去拆解其的方方面面, 从它核心层面的工作原理开始, 接着是一步步的集成配置, 然后是高级的定制技巧, 以及实战过程中所碰到的"坑", 我都会毫无保留地予以分享, 不管你是刚刚接触的新手, 还是已然饱受检测困扰的老手, 这篇文章都能够助力你搭建起一套更为健壮、更为隐蔽的自动化方案。
- 的核心原理深度剖析
真想切实妥当运用好一个工具, 那就务必得领会其背后所蕴含的原理。它可不是魔法呀, 它乃是一系列具有针对性的防御举措的汇总集合。它的工作运行方式, 能被理解成好似在浏览器页面刚开始加载之际, 便注入一系列脚本, 从而对浏览器的原生环境展开"修补"以及"伪装"。
2.1 指纹修改:从"标准兵"到"便衣"
检测里核心的是浏览器指纹, 主要对具有关键性质的几类指纹做了修改。
- 对象属性, 这是最为基础的检测点, 原生启动的浏览器,其.属性会被设置为true, 以此明确告知网站"我是一个受到自动化工具控制的浏览器", 插件会借助执行代码, 把这个属性予以删除或者设置为, 除此之外, 它还会进行检查以及修正.、.等属性, 保证它们如同一个有头且为真人使用的浏览器那般一致, 而非一个空数组又或者是默认值。

-
用户代理字符串, 当以无头模式启动之时, 其通常会包含, 例如: /5.0 (X11; Linux ) /547.36 (KHTML, like Gecko) /YYY.1.1.1 /547.36 , 这简直是自报家门。插件会从用户代理里移除相关字样, 还会将其替换为普通的标识, 并且要确保整个字符串的格式是似是而非的。
-
WebGL跟指纹, 高级检测会借助WebGL以及API去获取硬件还有渲染方面的信息, 不同的GPU、驱动乃至操作系统, 所渲染出来的图像会存在微妙的差异, 自动化浏览器环境下的渲染结果或许与真实环境不一样, 通过重写t..等方式, 返回经过处理的、更趋近于大众化硬件的信息, 进而干扰这种基于渲染的指纹识别。
-
音频方面存在着与字体相关的指纹, 浏览器能够借助对音频处理当中那些细微差别的剖析来达成某些工作, 同时浏览器还能够凭借.fonts去查验已安装好的字体清单, 在自动化环境里音频处理有可能会被予以简化, 并且字体清单也存在着不完整的状况, 而插件会仿真这些API的返回数值, 进而提供出一个看上去更为"丰富"以及"真实"的指纹。
留意一下: 这儿所需明确的是一个关键要点: 其一, 并非是去"创造"出一个全然崭新的指纹, 而是要去"修补"现有的指纹当中那种过于突出、极易被标记出来的点。其二, 它的目的是使得指纹变得平常、普遍, 进而能够融入到"人群"里去, 并非是要变得独一无二且与众不同的那种状况呢。
2.2 行为模拟:不仅仅是静态伪装
除了静态的属性之外, 动态的行为同样是检测的重点所在, 人类的操作具备着随机性以及不完美性。
-
人类操作时鼠标的移动, 其轨迹呈现为曲线, 带有随机的抖动情况, 并且移动速度并非均匀一致。自动化脚本当中的page.click(), 一般是瞬间完成、直线进行定位。它本身并不直接去模拟鼠标的轨迹, 不过是为更高级的模拟创造了条件。在实际运用其间, 我们常常需要结合page.mouse.move()等方法, 依靠自身去达成带有轨迹的移动。要确保的是, 当你开展如此行为之际, 底层环境不会显露出你是一个自动化程序。
-
定时器和性能 API, 其中有些检测会借助.now() 的精度, 或者通过某些执行偏差来判定环境。原生的浏览器环境以及高精度计时器, 在自动化控制的情况下, 可能会呈现出可预测的模式。通过对这些与时间相关的 API 进行修补, 引入一些微小的、符合人类预期的随机延迟以及精度变化, 从而让基于时间的检测失去效用。
-
插件跟MIME类型列表, 其中的. 以及. 在无头或者自动化环境里常常是处于空的状态或者仅有少数的几项, 一个真实的浏览器通常安装了PDF查看器、Flash(虽说已被淘汰)等插件, 会。