如何让 Playwright 通过浏览器指纹检测
1. 为什么传统的爬虫方式失效了?
反爬虫的进化: 以前靠 UA 检查和 IP 频率限制;现在是“多维特征识别”。
什么是浏览器指纹: 即使你换了 IP、清了 Cookie,网站依然能识别出“你还是你”。因为它收集了你浏览器的硬件、软件、系统设置等数百个细微特征,合成了一个唯一的 ID。
现状: 像 Cloudflare 或 Akamai 这种巨头,能通过指纹在毫秒内判定你是一个 Playwright 自动化脚本,而非真实用户。
2. 浏览器指纹(Browser Fingerprinting)是什么?
静态指纹:
User-Agent, Platform, Languages.
Screen Resolution, Color Depth.
Hardware: CPU cores, Device Memory.
动态/硬件特征指纹:
Canvas Fingerprinting: 利用渲染差异识别显卡驱动和系统。
WebGL: 显卡具体型号及渲染参数。
AudioContext: 声卡处理音频信号的细微差异。
Web API 特征:
navigator.webdriver 标志位。
Permissions API 状态。
Fonts(系统安装字体列表)。
网络层指纹:
TLS/JA3 指纹(握手阶段的特征)。
HTTP/2 头部顺序。
一些指纹/bot 检测网站
3. 简单介绍 Playwright(以 Selenium 为背景板)
| 特性 | Selenium | Playwright |
| 发布年份 | 2004 (老牌标准) | 2020 (现代新星) |
| 架构 | WebDriver (HTTP JSON 协议) | WebSocket (长连接) |
| 速度 | 较慢 (需等待 HTTP 往返) | 极快 (更少的通信开销 + 并行上下文) |
| 稳定性 | 易产生 Flaky Tests (需要手动写等待) | 极高 (内置自动等待 Auto-wait) |
| 浏览器支持 | 所有主流浏览器 + IE | Chromium, Firefox, WebKit (Safari) (不支持 IE) |
| 移动端 | 通过 Appium 支持真机 | 仅支持移动端浏览器模拟 |
| 安装配置 | 需配置 Driver (虽有改进但仍较繁琐) | 一键安装 (自动下载对应的浏览器二进制文件) |
| 功能特性 | 基础自动化 | 内置录制、Trace Viewer、网络拦截、API 测试 |
4. 增强 Playwright
无头模式的陷阱: 传统的
headless: true会修改 UA 并禁用大量 Web API。对策:使用 stealth 插件:
playwright-stealth几乎是行业标准。它通过动态注入脚本,在网页加载前重写navigator.webdriver、伪造chrome.runtime、并修复那些暴露自动化的 JS 变量。一致性是关键:
如果你用了代理 IP(如美国 IP),但时区(Timezone)和地理位置(Geolocation)却是北京,这种“不一致”是高权重风险指标。
方案: 必须同步设置
context里的locale,timezoneId和geolocation。
对抗硬件指纹(噪声技术):
- 不要尝试抹除,要尝试干扰。 通过在 Canvas 渲染结果中随机加入 1-2 像素的扰动(Noise),让每次生成的指纹都唯一且看起来像真实硬件生成的。
网络指纹(TLS/JA3):
痛点: 网站能在 TCP 握手阶段识别出你是 Node.js 发起的请求。
高级方案: 如果 stealth 插件失效,可能需要配合
curl-impersonate思想的代理,或者使用专门修改过浏览器内核的“指纹浏览器”(如 Adspower, Browserless)作为 Playwright 的连接端。
5. 模拟真实设备 —— 应对针对设备的限制
可以使用 https://github.com/apify/fingerprint-suite 来生成真实设备的指纹,
import { chromium } from 'playwright';
import { newInjectedContext } from 'fingerprint-injector';
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await newInjectedContext(browser, {
// Constraints for the generated fingerprint (optional)
fingerprintOptions: {
devices: ['mobile'],
operatingSystems: ['ios'],
},
// Playwright's newContext() options (optional, random example for illustration)
newContextOptions: {
geolocation: {
latitude: 51.50853,
longitude: -0.12574,
},
},
});
const page = await context.newPage();
// ... your code using `page` here
})();
6. IP Proxy - 动态住宅代理(Residential Proxies)—— 应对针对地区的限制
可以使用代理服务,来获取各地的纯净 IP,如:
使用 proxy 参数来设置代理,以下例子通过 username 来指定目标代理区域,具体请查看代理服务的说明文档。
const browser = await chromium.launch({
headless: true,
proxy: {
server: "http://us2.cliproxy.io:3010",
username: "xxxx-region-JP-st-Tokyo-city-Chofu",
password: "xxxx"
}
});
7. 进一步的大杀器
Anti-detect browser,基于 Firefox https://github.com/daijro/camoufox ,可以实现更深层的定制操作
AI 识别行为模式将成为主流,指纹伪装将进入“大模型时代”。
