面向爬虫的浏览器指纹详解
浏览器指纹是一种通过浏览器的各项特征组合来识别访客的做法,而不是依赖 cookie 或账户。网站用它来识别回访的访客、检测欺诈以及发现自动化程序。如果你做网页抓取,一定会遇到它。本指南解释了哪些特征会被测量、为什么单个不一致就会带来麻烦,以及如何为公开数据采集保持一个一致且规范的配置文件。文章也说明了指纹调整的边界,以及它应当做什么、不应做什么。
指纹由什么组成
没有哪一个值能单独识别一个浏览器,但许多细小的值组合起来往往就能做到。常见的输入包括:
- User Agent 与客户端提示。 浏览器上报的浏览器名称、版本和操作系统。
- 屏幕与窗口几何信息。 屏幕尺寸、色深、设备像素比以及视口大小。
- 语言与时区。
Accept-Language请求头、navigator.languages,以及浏览器上报的时区。 - 已安装的字体。 页面能够检测到的字体,不同操作系统和已安装软件之间各不相同。
- Canvas、WebGL 和音频输出。 图形或音频栈在绘制测试图像或处理声音时的细微差异。
- 网络层特征。 TLS 握手、HTTP/2 设置以及请求头的顺序。在任何 JavaScript 运行之前,服务器就能看到这些信息。
指纹脚本会把这些信息合并为一个哈希值或分数。越多稳定且不寻常的信号,识别能力就越强。
为什么不一致会很显眼
真实的浏览器内部是自洽的。它的操作系统与字体相匹配,时区与语言设置相匹配,屏幕尺寸也与其所在设备相符。爬虫常常在无意中打破这种一致性:
- 从桌面浏览器复制来的 User Agent,却由一台没有安装任何字体的服务器发出。
- IP 地址位于另一个国家,却带着德语的
Accept-Language请求头,而时区与两者都不匹配。 - 无头环境上报了一个真实显示器不会使用的窗口尺寸。
- 每次运行都使用全新的配置文件,因此 cookie 和历史记录看起来从不像回访的访客。
每一处不一致都只是一个微小的信号。叠加起来,就可能让一个请求从“普通访客”变成“需要进一步审查”。
第一步:测量你自己的环境
你可以通过加载一个由你控制的指纹测试页面,或者在本地运行的诊断页面,来查看页面能够获取到你的客户端的哪些信息。查看这些值,并判断它们是否描述的是同一台连贯的机器。下面是一个最小化的 Playwright 示例,会打印其中的几项值:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
context = browser.new_context(locale="en-GB", timezone_id="Europe/London")
page = context.new_page()
page.goto("https://example.com") # 替换为你自己拥有的页面
print(page.evaluate("""() => ({
language: navigator.language,
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
platform: navigator.platform,
viewport: [innerWidth, innerHeight]
})"""))
browser.close()
第二步:每个配置文件只保持一种身份
最有用的习惯,是把每个爬虫身份视为一个配置文件,给它一组固定的特征,并在它的整个生命周期内保持不变:
- 一种浏览器版本、一个 User Agent 和一个操作系统。
- 与流量来源地区相匹配的区域设置、语言和时区。
- 与真实屏幕相符的视口和设备缩放比例。
- 持久化的 cookie 存储,使配置文件的行为像一个回访的访客。
每次请求都改变其中某一项,比保持稳定更可疑。一致性才是让配置文件看起来普通的关键。
第三步:让配置文件的节奏像访客
指纹只是输入之一。网站还会关注单个配置文件在站点中的浏览速度。一个配置文件在一分钟内加载两百个商品页面,无论它的指纹如何,都不像是人类。请分散请求、缓存结果,并在页面提示你应当停止时立即停止。避免被封锁的网页抓取清单 对节奏控制有更详细的说明。
第四步:了解其局限
指纹调整无法让一个自动化配置文件看起来像一个并不存在的人。依赖指纹识别的网站,通常还会结合频率限制、账户检查,有时还会加上验证码。当出现验证码时,你需要的是求解器返回的 token,而不是继续调整指纹。Scarnox 目前实时支持的验证码类型是 PopularCaptcha,PopularCaptcha Python 指南 展示了具体的请求方式。关于现有各类组件的完整介绍,请阅读 验证码类型详解。
更重要的是,规避指纹识别并不意味着可以无视网站的规则。如果网站所有者限制了自动化访问,正确的做法是停止,而不是让你的配置文件更难被察觉。指纹识别也涉及隐私问题。一些网站利用它在多次访问之间追踪用户,这也是只收集项目真正需要的数据的又一个理由。
负责任地抓取
- 在抓取任何网站之前,阅读其
robots.txt和服务条款。 - 使用更少、更慢的请求,并缓存已经采集到的内容。
- 不要为了冒充真实用户或绕过封锁而建立配置文件。
- 不要保存你不需要的个人数据,对于确实保存的数据,应谨慎处理。
延伸阅读
如果你的目标网站位于浏览器层面的检测之后,请先阅读 无头浏览器检测,其中介绍了自动化浏览器特有的信号。需要 JavaScript 才能显示内容的页面,则在 抓取 JavaScript 网站 中有详细说明。
免费试用额度,无需信用卡:注册账户,然后在你自己拥有的页面上试用 PopularCaptcha 流程。当前费率请查看定价页面。