Scarnox · Blog

面向爬虫的浏览器指纹详解

浏览器指纹是一种通过浏览器的各项特征组合来识别访客的做法,而不是依赖 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()

第二步:每个配置文件只保持一种身份

最有用的习惯,是把每个爬虫身份视为一个配置文件,给它一组固定的特征,并在它的整个生命周期内保持不变:

每次请求都改变其中某一项,比保持稳定更可疑。一致性才是让配置文件看起来普通的关键。

第三步:让配置文件的节奏像访客

指纹只是输入之一。网站还会关注单个配置文件在站点中的浏览速度。一个配置文件在一分钟内加载两百个商品页面,无论它的指纹如何,都不像是人类。请分散请求、缓存结果,并在页面提示你应当停止时立即停止。避免被封锁的网页抓取清单 对节奏控制有更详细的说明。

第四步:了解其局限

指纹调整无法让一个自动化配置文件看起来像一个并不存在的人。依赖指纹识别的网站,通常还会结合频率限制、账户检查,有时还会加上验证码。当出现验证码时,你需要的是求解器返回的 token,而不是继续调整指纹。Scarnox 目前实时支持的验证码类型是 PopularCaptcha,PopularCaptcha Python 指南 展示了具体的请求方式。关于现有各类组件的完整介绍,请阅读 验证码类型详解。

更重要的是,规避指纹识别并不意味着可以无视网站的规则。如果网站所有者限制了自动化访问,正确的做法是停止,而不是让你的配置文件更难被察觉。指纹识别也涉及隐私问题。一些网站利用它在多次访问之间追踪用户,这也是只收集项目真正需要的数据的又一个理由。

负责任地抓取

延伸阅读

如果你的目标网站位于浏览器层面的检测之后,请先阅读 无头浏览器检测,其中介绍了自动化浏览器特有的信号。需要 JavaScript 才能显示内容的页面,则在 抓取 JavaScript 网站 中有详细说明。

免费试用额度,无需信用卡:注册账户,然后在你自己拥有的页面上试用 PopularCaptcha 流程。当前费率请查看定价页面。

下一步