返回知识中心
部署

网页数据采集的浏览器指纹保护

网页数据采集需要的不只是代理和请求头。指纹保护让经授权的采集在 canvas、WebGL、字体、时间和配置文件信号上保持一致。

文档中心

想直接进入 部署 文档吗?

这篇文章属于博客内容库。若你要步骤化配置、参考说明和持续更新,请直接进入对应 docs 分区。

为什么代理和请求头不能描述整个浏览器

经授权采集公开网页数据的团队,通常从同一份清单开始:用于网络路由的代理、合理的 User-Agent 请求头,以及能运行 JavaScript 的浏览器。这份清单解决了真实问题,但没有描述页面实际看到的浏览器。页面能读取完整的运行环境:文字在 canvas 上如何绘制、报告了哪些图形能力、安装了哪些字体、常见操作耗时多久、浏览器声明了哪些语言和时区,以及这些值是否与网络路由一致。

这些值不一致时,后果通常并不戏剧化。页面可能显示意料之外的语言,要求额外确认,返回分析人员无法复现的区域版本,或者在作业日志中看似相同的两次运行里表现不同。原因往往是环境不一致,而不是某个请求头出错。代理在一个国家、浏览器却报告另一个国家的时区,是最常见的例子,但图形、字体和屏幕数值也可能以同样方式出现分歧。

浏览器指纹保护作用于这一层。在 BotBrowser 文档中,配置文件描述一个具体的浏览器与设备环境,浏览器会在页面、Worker 和新上下文中一致地报告该环境。目标是为经授权的工作提供隐私和可重复性,并不承诺能访问任何特定网站,下文也会明确指出哪些责任仍属于运行工作流的团队。

示意图:一个浏览器配置让渲染、字体、屏幕和区域设置与采集会话中代理出口所在区域保持一致

要点:

  • 渲染、字体和时间应与所选浏览器配置文件一致。
  • 代理区域、时区、区域设置和语言应在同一会话中彼此一致。
  • 只改动少数 JavaScript 属性会留下缺口,完整的配置文件可以避免。
  • 请求节奏、交互式验证、账号政策和站点条款仍由运行工作流的团队负责。

采集浏览器报告的信号族

先列出页面能读取的几类值,因为一致性审查必须覆盖全部。无需把它们当作属性清单来背,关键是每一类都描述同一台设备。

  • Canvas 渲染。 页面可以绘制文字和图形,并读回浏览器的渲染结果。Canvas API 是标准接口,结果会随操作系统、图形栈和字体而变化。
  • WebGL 与图形。 WebGL API 暴露图形能力和渲染器信息。与声明的操作系统不相称的图形描述,是常见的不一致来源。
  • 音频处理。 Web Audio API 的输出在不同平台和版本之间略有差异。
  • Navigator 与屏幕值。 平台、语言偏好、设备特征和屏幕尺寸描述所声明的设备。
  • 字体。 已安装的字体和文本度量方式在很大程度上取决于操作系统。声明为 Windows 设备、却用另一套字体渲染的 Linux 服务器,在内部是不一致的。
  • Client Hints 与请求头。 随请求发送的浏览器品牌、平台和架构提示,应与脚本在页面中看到的值一致。
  • 时间与能力。 性能计时、报告的处理器数量和内存级别,说明设备看起来有多强。
  • 区域设置。 时区、区域设置和语言说明浏览器声称自己在哪里,以及使用者偏好哪种语言。

对采集工作流的要求不难表述:所有信号族都应描述同一台设备、同一个地点。难点在于其中大多数值产生于浏览器内部,只改动最容易改的几项,结果就是一幅混杂的画面。

为什么只改 JavaScript 属性会留下缺口

许多采集配置从页面加载时覆盖少数浏览器属性的脚本开始。这很容易理解:尝试起来快,对被改动的那个属性也有效。但不一致正是从这里进入的。

在页面内运行的脚本,是在页面已经存在之后才改动数值。在某些上下文中,页面代码和嵌入的框架可能先于改动执行。专用 Worker、共享 Worker 和 Service Worker 都有自己的全局作用域,因此主页面上改过的值,在 Worker 内可能不同。新的 iframe 或新的浏览器上下文会重新从原始值开始,除非在那里重复同样的改动。每一种情况都是团队需要追踪的缺口。

第二个问题是覆盖范围。修改 User-Agent 字符串,并不会改变浏览器渲染 canvas 的方式、报告的字体、音频输出的表现或图形描述。被覆盖的单个属性通常会与未改动的其他属性冲突。例如,平台字符串指向一种操作系统,字体列表却属于另一种,这两类信号描述的就是不同的设备。

第三个问题是维护。浏览器版本会改变内部实现,依赖这些实现的每个补丁都需要重新检查。无头运行还多一层:无头模式与有窗口模式之间的差异,例如窗口尺寸、插件列表或渲染细节,往往被逐项处理。团队最终维护的是一份不断增长的例外清单,而不是对环境的统一描述。

基于配置文件的方式反转了这一模型。浏览器不再逐个修补数值,而是用定义完整环境的配置文件启动,并从一开始就在页面、Worker 和新上下文中报告该环境。BotBrowser 文档逐个表面进行了说明,包括 navigator 值和音频在 Worker 中的一致性。本文依赖的正是这个有限的表述:所报告环境的一致性,而不是对网站反应的保证。

同一会话中的代理区域、时区、区域设置与语言

在所有信号族中,区域设置最容易审查,也最容易配错,值得单独说明。

代理决定网络路由和网站看到的公网地址。它不决定浏览器报告哪个时区、哪个区域设置来格式化数字和日期,也不决定浏览器偏好中列出哪些语言。这些值来自浏览器。如果保持宿主机的默认值,位于某个区域的采集服务器会报告该区域的时区,即使代理指向另一个区域。

默认情况下,BotBrowser 根据代理 IP 推导时区、区域设置和语言,文档称之为 auto 模式。这三个值与代理区域以及彼此保持一致,因此从德国出口的会话无需额外参数,就会报告德国时区、匹配的区域设置和匹配的语言列表。每个值都可以手动覆盖,这是需要相应许可等级的选项。手动值对其所定义的设置优先,而保持 auto 的设置仍跟随代理。

文档中有三个实用细节值得记住:

  1. 让浏览器自己处理代理。 当代理通过浏览器自身的启动代理选项设置时,自动检测才能生效。改用框架级的代理选项,可能让时区仍显示宿主机的值。
  2. 代理的位置数据决定结果。 auto 模式跟随代理 IP 所对应的位置。如果代理服务商的位置数据有误,或出口地址对应的区域与预期不同,推导出的值就会沿用该对应关系。这是需要核对的理由,而不是靠猜测的理由。
  3. 已知出口地址时告诉浏览器。 文档描述了 --proxy-ip 选项(ENT Tier1),用于声明代理的公网出口 IP,可以省去每个页面的 IP 查询,并在出口地址已知时让结果可预期。

依赖 auto 模式的最小启动只需要一个配置文件和一个代理:

chromium-browser \
  --bot-profile="path/to/profile.enc" \
  --proxy-server=socks5://user:pass@de-proxy.example.com:1080

完整选项及其所需的许可等级,请阅读 BotBrowser 关于时区、区域设置与语言的文档。要了解代理出口如何解析,可参阅我们的代理配置指南。

DNS 和 WebRTC 需要同样明确的检查。请有意识地决定名称在哪里解析(--bot-local-dns 选项,ENT Tier1,在本地解析;--bot-local-dns=false 则交给代理解析),并确认 WebRTC 不会暴露代理路由之外的地址;BotBrowser 默认提供 WebRTC 保护,完整保护建议配合代理使用。代理、DNS 与 WebRTC 一致性指南介绍了这项检查。

采集数据前如何验证一致性

不要假定一致,而要对每种代理路由与配置文件的组合,在大规模运行前确认一次。下面的检查只使用普通浏览器窗口中人就能看到的内容,每一项都有预期结果。

  1. 确认代理区域。 使用代理服务商的工具或可信的地址查询,记下出口地址对应的区域。其他所有值都与它对照。
  2. 读取页面报告的时区。 在会话中打开浏览器开发者控制台,执行 Intl.DateTimeFormat().resolvedOptions().timeZone,参见 MDN 的 resolvedOptions 参考。结果应是属于代理区域的时区。
  3. 读取语言列表。 Navigator.languages 参考描述了按优先级排序的语言列表。执行 navigator.languages,确认第一项对应预期区域,且顺序像正常的偏好列表。
  4. 对比格式。 打开一个同时显示日期、带小数点的数字和货币的页面,格式应符合预期的区域设置。
  5. 在新上下文中重复。 打开第二个上下文和一个使用 Worker 的页面,重复前四项检查。结果应与第一个上下文一致,说明设置并非只作用于单个页面。
  6. 记录结果。 保存代理路由标签、配置文件名称、时区和第一语言。简短的记录便于日后解释差异。

检查失败时,一次只改一件事。确认代理在浏览器层配置,核对代理 IP 对应的位置,并将所用配置文件与预期设备比较。通常,新建一个干净的上下文比修改已带有错误配置产生的 cookie 和存储的上下文更清晰。

审查渲染、字体与设备值

同样的做法适用于区域设置之外的内容,只是没有与地区绑定的标准答案。问题在于各信号族之间以及与配置文件是否一致。

一张简短的审查表可以让讨论更具体:

范围需要确认的内容
渲染Canvas 和 WebGL 的表现与配置文件所描述的操作系统和图形级别相符
字体可用字体和文本度量与所声明的操作系统相符
设备与屏幕平台、屏幕尺寸和报告的能力描述的是同一台设备
请求头与脚本随请求发送的 Client Hints 与脚本在页面中读取的值一致
时间报告的处理器和内存级别与配置文件及宿主机的真实能力相符
区域设置代理区域、时区、区域设置和语言在每个上下文中一致
会话边界cookie 和存储属于同一个配置文件和同一条路由

对计划使用的每个操作系统系列,用一个配置文件完成审查,并把结果作为基准。如果之后的运行得到与基准不同的页面,就可以比较配置,而不是猜测。

有两点需要注意。第一,一致的配置文件不会隐藏宿主机的真实能力:描述普通笔记本的配置文件如果运行在非常大的服务器上,计时仍会反映宿主机,因此应保持适度预期并使用现实的配置文件。第二,无头运行和有窗口运行应分别审查,因为一种模式下的结果并不能证明另一种。

采集任务中的会话、配置文件与差异化

采集任务很少只是一个页面,而是一系列会话,每个会话都应有清晰的身份。BotBrowser 文档把配置文件描述为完整的环境,更高许可等级还提供确定性噪声种子,以及为不同浏览器上下文使用不同指纹等控制。

两个想法让这件事易于管理。

一个会话,一个环境。 在会话的整个生命周期内,把 cookie、存储、配置文件和代理路由放在一起。如果路由变化,就把它当作新会话,而不是在现有 cookie 之下替换路由。混杂的历史事后很难解释,也是页面行为令人困惑的常见原因。

差异要有目的。 当工作流需要代表它有权代表的不同设备类别或区域时,不同的配置文件才有用。为了差异而差异,只会增加需要验证的环境数量。团队用种子重复某个结果时,文档说明相同的种子产生相同的输出,这有助于复现问题和比较运行。把种子视为已记录配置的一部分,之后的运行就能使用同一个值。

每增加一个配置文件或路由,都会增加验证成本。从覆盖授权工作的最小集合开始,验证之后,只在出现有文档依据的需求时再扩大。

请求节奏、重试与账号政策

浏览器一致性只是决定网站如何响应的因素之一。其他因素掌握在团队手中,任何浏览器设置都无法改变它们。

  • 请求节奏。 按网站公布的限制来安排请求间隔,是经授权采集的一部分。页面加载之间加入停顿,避免突发,并在网站返回错误或限速响应时放慢。
  • 重试。 不加停顿地重复同一请求的循环只会让情况更糟。使用逐步增加的等待时间并限制尝试次数,网站持续拒绝时就停止。
  • 交互式验证。 BotBrowser 不解决交互式验证。如果工作流经常遇到验证,正确的做法是核查采集是否获得授权,是否存在官方数据源或 API,以及网站所有者能否授予访问。
  • 账号政策。 登录后的采集受账号条款约束。浏览器配置文件不会改变账号协议所允许的内容。
  • 代理质量。 出口地址质量、位置数据和可用性由代理服务商控制。对齐良好的浏览器如果使用位置不佳的代理,仍会报告该代理所对应的区域。

这些并非边缘情况,而是两个团队使用相同浏览器配置却得到截然不同结果的主要原因。

不靠猜测来规划容量

团队经常问一台机器能运行多少会话。诚实的回答是:取决于硬件和所采集的页面。纯文本页面与包含大量脚本、视频或大图的页面,占用的内存和处理器时间差别很大。任何没有说明硬件和页面类型的数字,最多只能当作粗略的规划估计。

更好的方法是测量自己的负载。在有代表性的页面上运行少量会话,观察内存和处理器使用,逐步增加,同时确认页面加载仍能在合理时间内完成。BotBrowser 的性能文档描述了影响吞吐量的若干因素,包括启动时的查询、配置文件加载、图形后端选择,以及在同一个浏览器实例内使用多个浏览器上下文而不是启动许多独立实例。把它作为起点,并把自己的测量结果与配置放在一起保存。

在容器中运行时也采用同样的方法:根据测量结果而不是公开数字确定容器大小,并把配置文件放在快速的本地存储上。我们的 Docker 部署指南更详细地介绍了容器配置。

团队常问的问题

指纹保护能保证访问某个网站吗?

不能。它让浏览器环境保持一致。网站是否接受会话,取决于它自己的政策、你的请求节奏、代理质量,以及适用于数据的条款。应当预期会被拒绝,并在存在官方渠道时通过它申请访问。

为什么不直接设置 User-Agent 和几个属性?

因为这些值只是页面能读取内容的一部分。User-Agent 改了,而渲染、字体和区域设置没变,就会有几个信号族讲述不同的内容。完整的配置文件把它们放在一起描述,浏览器在页面、Worker 和新上下文中报告同一环境。

需要手动设置时区、区域设置和语言吗?

通常不需要。代理在浏览器层配置后,auto 模式会从代理 IP 推导这三个值。当已知代理的位置数据有误,或工作流需要特定区域时,可以使用手动值,这是需要相应许可等级的选项。无论哪种情况,都应按上面的步骤验证结果。

可以使用现有的 Playwright 或 Puppeteer 代码吗?

通常可以。文档描述了如何从这两种框架中用配置文件和代理启动 BotBrowser 可执行文件。请通过浏览器启动参数设置代理,而不是框架自带的代理选项,这样区域对齐才能按文档所述工作。

每个会话都需要不同的配置文件吗?

不一定。使用授权工作所需的最少配置文件,逐个验证,并在会话生命周期内让配置文件、路由和存储保持在一起。当工作流必须代表另一类设备或另一个区域时,才需要新的配置文件。

使用指纹保护采集数据合法吗?

合法性取决于司法辖区、数据类型、网站的服务条款,以及 GDPR 或 CCPA 等法规。BotBrowser 是隐私工具,用户需自行确保其采集获得授权并符合适用规则。

BotBrowser 的适用位置

在经授权的数据采集会话中,BotBrowser 默认(auto 模式)能够根据代理 IP 推导时区、区域设置和语言,使它们与代理所在地区以及彼此保持一致,会话呈现统一的地理身份。这有助于避免代理在一个国家、浏览器却按另一个国家配置的常见错位。BotBrowser 不能保证目标网站接受该会话,不能解决交互式验证,也不控制代理质量与地理定位数据、请求节奏、账号政策或网站条款。

把上面的检查当作运行前的例行步骤,把已记录的配置与每个任务放在一起,只有在检查失败时才做更大的调整。要从配置文件开始,请下载 BotBrowser,或联系企业团队获取更大规模部署的规划帮助。

延伸阅读:关于跨操作系统规划配置文件,请参阅跨平台浏览器配置。

来源

#网页抓取#数据采集#指纹保护#自动化#代理

让 BotBrowser 从研究走向生产

先用这些指南理解模型,再进入跨平台验证、隔离上下文和面向规模化的浏览器部署。