自定义浏览器指纹:控制网站读取的信号
Specialist in Anti-Bot Strategies
TL;DR:
- 浏览器指纹是网站用来识别您的浏览器的一组信号——用户代理、平台、屏幕、时区、语言、画布和WebGL。当它们相互不一致时,自动化会被标记。
- Scrapeless Scraping Browser允许您显式设置指纹。 传递一个
fingerprint对象,云浏览器报告exactly这些值,内部保持一致。 - 覆盖是真实的,而不是表面化的。 在实时运行中,
navigator.userAgent、navigator.platform(Win32)、解析的时区 (Asia/Hong_Kong) 和navigator.language都如设定的值返回——下面验证。 - 一致性是关键。 一个美国用户代理配合香港时区和数据中心IP是防爬虫系统所寻找的不匹配;设置指纹和出站流量,讲述一个一致的故事。
- 基于标准的Puppeteer连接。 指纹是WebSocket端点上的查询参数;您的导航代码未改变。
- 免费开始。 新的Scrapeless账户包括免费的Scraping Browser运行时——请在app.scrapeless.com注册。
介绍:浏览器在出卖你
您加载的每个页面读取一组信号以决定您是什么样的客户端:用户代理字符串、平台、屏幕尺寸、语言和时区以及更深层的值,如画布和WebGL指纹。真正的浏览器始终如一地报告这些——在Windows上配置为美国的Chrome具有美国时区、匹配的平台和正常的屏幕。自动化往往泄露出不同的故事:这里的无头默认,那里不匹配的时区,一个人类浏览器不设置的 navigator.webdriver 标志。
Scrapeless Scraping Browser让您故意设置这个故事。您在打开会话时传递一个 fingerprint 对象,云浏览器报告exactly这些值——一致,因此信号彼此一致。此指南涵盖指纹字段,如何在标准Puppeteer连接上设置它们,以及一个实时检查覆盖效果是否实际生效。
您可以控制的内容
- 用户代理——浏览器报告的完整UA字符串。
- 平台——
Windows、macOS或Linux,反映在navigator.platform中。 - 屏幕——报告的
宽度和高度。 - 本地化——
时区和语言的有序列表。 - 启动参数——如窗口大小的Chromium标志。
这些值在内部保持一致,因此浏览器不会报告一个Windows平台同时配有macOS用户代理。
为什么选择Scrapeless Scraping Browser
Scrapeless Scraping Browser是一个可定制的反检测云浏览器,专为网络爬虫和AI代理设计。针对指纹控制,它特别提供:
- 显式的指纹字段——用户代理、平台、屏幕、时区和每个会话设置的语言。
- 内部一致性——没有
navigator.webdriver信号,并且您设置的值彼此一致。 - 覆盖195多个国家的住宅代理——将指纹的区域与匹配的出站流量配对,使两个信号保持一致。
- 标准的Puppeteer连接——
puppeteer.connect()返回一个普通的Browser;指纹在端点URL上设置。
在app.scrapeless.com的免费计划中获取您的API密钥。
先决条件
- Node.js 18或更新版本
- 一个Scrapeless账户和API密钥——请在app.scrapeless.com注册
- 对Puppeteer有基本的熟悉程度
安装
bash
npm install puppeteer-core
bash
export SCRAPELESS_API_KEY="your_api_token_here"
设置指纹
构建指纹对象,对其进行URL编码,并作为 fingerprint 查询参数传递到WebSocket端点。其他一切都是正常的Puppeteer会话:
javascript
import puppeteer from 'puppeteer-core';
const fingerprint = {
userAgent:
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36',
platform: 'Windows',
screen: { width: 1280, height: 1024 },
localization: { languages: ['en-US', 'en'], timezone: 'Asia/Hong_Kong' },
args: { '--window-size': '1280,1024' },
};
const params = new URLSearchParams({
token: process.env.SCRAPELESS_API_KEY,
sessionTTL: '180',
proxyCountry: 'ANY',
fingerprint: encodeURIComponent(JSON.stringify(fingerprint)),
});
const browser = await puppeteer.connect({
browserWSEndpoint: `wss://browser.scrapeless.com/api/v2/browser?${params}`,
});
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
await browser.close();
确认覆盖生效
从页面内部读取信号,以确认它们与您设置的值匹配:
javascript
const reported = await page.evaluate(() => ({
userAgent: navigator.userAgent,
platform: navigator.platform,
时区:Intl.DateTimeFormat().resolvedOptions().timeZone,
语言:navigator.language,
}));
console.log(reported);
// {
// 用户代理:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) … Chrome/134.0.0.0 Safari/537.36",
// 平台:"Win32",
// 时区:"Asia/Hong_Kong",
// 语言:"en-US"
// }
在实际运行中,所有四个值都返回作为指纹的值——用户代理逐字,平台为Win32(来自平台:'Windows'),解析的时区为Asia/Hong_Kong,语言为en-US。覆盖将在页面实际读取的JavaScript环境中生效,而不仅仅是在请求头中。
> 在免费计划中获取您的API密钥:[app.scrapeless.com](https://app.scrapeless.com/passport/login/?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=custom-browser-fingerprint)
---
## 使信号一致
指纹只有在其组成部分讲述一个故事时才有帮助。会导致会话被标记的常见不匹配:
- **时区与IP** — 在美国出口后面有香港时区被视为不一致。将`proxyCountry`设置为与时区和语言匹配的区域,或将时区设置为与出口匹配。时区处理遵循由<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/resolvedOptions" rel="nofollow"><strong>Intl.DateTimeFormat API</strong></a>引用的IANA区域。
- **平台与用户代理** — 一个`Windows`平台与macOS用户代理字符串是矛盾的。保持平台字段与用户代理的操作系统标记一致;用户代理语法在<a href="https://datatracker.ietf.org/doc/html/rfc9110#name-user-agent" rel="nofollow"><strong>HTTP语义规范</strong></a>中定义。
- **语言与区域** — 按照该地区用户的方式排列`languages`,将主要语言放在首位。
- **屏幕与窗口** — 保持`screen`尺寸和`--window-size`参数对您正在模拟的设备来说合理。
这些信号正是<a href="https://owasp.org/www-project-automated-threats-to-web-applications/" rel="nofollow"><strong>OWASP自动威胁项目</strong></a>中编纂的自动客户端信号——它们之间的一致性是真实浏览器所具备而不小心的机器人所不具备的。
---
## 高级模式
**在会话之间旋转指纹,而不是在内部。** 在会话生命周期内保持指纹稳定,以便在访问过程中不会改变故事;而是在会话之间进行变化。
**将出口固定在指纹的区域。** 设置`proxyCountry`(在需要时设置`proxyState`/`proxyCity`)以匹配您选择的时区和语言。
**通过配置文件持久化身份。** 当您需要在多个运行中使用相同身份时,将指纹与浏览器配置文件配对,以便cookie和存储可以继续使用。
**保持合理。** 一个没有真实设备会产生的指纹与一个默认的指纹一样可疑——使用描述实际存在的浏览器的值。
---
## 结论:一个一致的身份
自定义指纹并不是单一的技巧——它是在报告一个一致身份的浏览器和一个自相矛盾的浏览器之间的区别。将用户代理、平台、屏幕、时区和语言一起设置,固定位出口以匹配,网站读取的值与真实浏览器的一致。将其与[抓取浏览器](https://www.scrapeless.com/zh/product/scraping-browser?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=custom-browser-fingerprint)的会话控制和居民出口配对,了解[为什么IP声誉很重要](https://www.scrapeless.com/zh/blog/what-is-a-cloud-proxy?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=custom-browser-fingerprint),[文档](https://docs.scrapeless.com)涵盖每个字段。
---
## 准备构建您的AI驱动数据管道了吗?
加入我们的社区以获取免费计划,并与正在构建反检测工作流的开发者联系:[Discord](https://discord.gg/VU2vtbq7Q2) · [Telegram](https://t.me/scrapeless)。
在[app.scrapeless.com](https://app.scrapeless.com/passport/login/?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=custom-browser-fingerprint)注册以获取免费的抓取浏览器运行时,并查看[定价](https://www.scrapeless.com/zh/pricing?utm_source=website&utm_medium=blog&utm_campaign=scrapingbrowser&utm_term=custom-browser-fingerprint)以便于扩展。
---
## 常见问题
**问:什么是浏览器指纹?**
网站读取以识别您的浏览器的一组信号——用户代理、平台、屏幕大小、时区、语言,以及更深入的值,如canvas和WebGL。网站将它们组合成一个标识符,并标记那些看起来不像真实设备的组合。
**问:设置指纹真的会改变页面看到的内容吗?**
是的。在实时运行中,`navigator.userAgent`、`navigator.platform`、解析后的时区和`navigator.language`都返回了会话中设置的值——覆盖达到了JavaScript环境,而不仅仅是请求头。
**问:时区应该与代理国家匹配吗?**
是的,时区与出口IP区域相矛盾是一个常见的标志。将`proxyCountry`设置为与指纹的时区和语言匹配,或将时区设置为与出口IP一致。
**问:我可以轮换指纹吗?**
在会话之间轮换,而不是在一个会话内。会话中途更改的指纹本身就是一个信号;保持每个会话的稳定性,并在会话之间进行变化。
**问:我需要一个AI代理或SDK吗?**
不需要。指纹是标准Puppeteer WebSocket端点上的查询参数——只需简单的`puppeteer.connect()`,不需要代理。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



