给现有 Playwright 爬虫换上 Camoufox:反检测指纹伪装的最小集成与调参手册

发布时间:2026/11/4 1:33:56
给现有 Playwright 爬虫换上 Camoufox:反检测指纹伪装的最小集成与调参手册

给现有 Playwright 爬虫换上 Camoufox:反检测指纹伪装的最小集成与调参手册

【免费下载链接】camoufox🦊 Anti-detect browser项目地址: https://gitcode.com/gh_mirrors/ca/camoufox

爬虫最常见的死法不是解析失败,而是请求刚发出去就被拦:UA、Canvas 读数、WebGL renderer 里随便挑一项对不上目标画像,就进挑战页。Camoufox 是 Firefox 系反检测浏览器,Playwright 直接驱动它,指纹伪装发生在浏览器 C++ 层而不是页面注入——这是它和"往navigator上打补丁"方案的核心区别。

这套组合改变了什么

现有 Playwright 脚本基本不用改。Camoufox 返回的是标准 Playwright 的Browser/Page对象,page.goto、page.evaluate、选择器照常用,换的只是启动入口。

指纹从 C++ 返回,不是 JS 覆盖。启动器把身份写进CAMOU_CONFIG环境变量,浏览器里的补丁经MaskConfig读取后在 C++ 层应答,页面拿到的是"原生值";toString()、属性描述符都看不到覆盖痕迹,worker、iframe 里读数也一致。

自动化代码在页面不可见。Playwright 的 evaluate、选择器、init script 跑在 Juggler 的隔离世界,输入走 Firefox 原生输入处理器触发 trusted 事件;1-leak-fixes.patch 把navigator.webdriver恢复为false。

HTTP 头和 navigator 永远一致。很多检测是拿Accept-Language、UA 头去对脚本上报值,network-patches.patch 保证两者同源,不用手动对齐。

指纹伪装维度覆盖(实现均在 browser/patches/):

  • Canvas / WebGL:GPU、renderer、扩展与参数,webgl-spoofing.patch
  • 字体:按所声称 OS 下发捆绑字体集
  • 时区 / locale / 地理 / WebRTC IP:随身份下发,worker 内一致
  • 音频、屏幕与窗口尺寸、媒体设备列表

从 0 到跑通的最小路径

四步:拉仓库 → 装依赖 → 启动 → 拿数据。

git clone https://gitcode.com/gh_mirrors/ca/camoufox pip install -U "camoufox[geoip]" camoufox fetch

仓库用于看补丁和构建;日常跑爬虫只依赖 PyPI 包,camoufox fetch会装好与本版本配对、sha256 锁定的浏览器二进制和 fpgen 模型。启动并取数:

from camoufox.sync_api import Camoufox with Camoufox(headless=True) as browser: page = browser.new_page() page.goto("https://example.com") print(page.evaluate("navigator.userAgent")) print(page.evaluate("Intl.DateTimeFormat().resolvedOptions().timeZone"))

现有脚本只需把启动那行从playwright.firefox.launch()换成Camoufox(...),后面的page操作原样保留。

指纹参数怎么调

先动身份,再动网络,最后动细节,一次只动一组:

  1. os:决定字体、语音、WebGL 整套画像,先定下来;
  2. proxy+geoip=True:时区、locale、geolocation、WebRTC IP 全部对齐代理出口 IP,装[geoip]extra 才会查 GeoIP 库;
  3. locale、screen、window:与出口地、机型画像保持一致;
  4. humanize=True、webgl_config:收尾微调,humanize会让page.mouse.move()按录制轨迹回放。

指纹默认由 fpgen 从真实流量分布抽取,coherence.py会拒掉现实中不存在的组合;要固定身份用fingerprint传 dict,fingerprint_preset=True用录制的真实设备。

验证三步:开debug=True打印发给浏览器的配置;page.evaluate读回navigator、Intl与预期比对;盯启动时的LeakWarning,它会点名是哪个字段与其余身份不匹配。

组件注册报错与内存增长排查

现象:浏览器起不来,Playwright 卡在等待 Juggler。原因:Juggler 作为 Firefox 组件由 components.conf 注册,esModule指向resource://gre/modules/juggler/components/Juggler.js、constructor为JugglerFactory;改过组件或配置后这对字段不一致,组件注册不上,Playwright 永远等不到 Juggler 的 listening 行。处理:按该文件核对esModule/constructor,注意它是 ESM 格式,不是旧 JSM。

现象:多 context 长跑内存持续增长。原因:页面缓存默认关闭就是为省内存;enable_cache=True会保留 Firefox 页面与请求缓存,长跑任务里内存随页面数上涨。处理:长跑保持默认,或缩短 context 生命周期,别指望开缓存提速。

现象:Canvas / WebGL 读回随机像素,并打印 LeakWarning。这是预期行为不是 bug:身份 OS 与宿主机不同时,真像素会暴露宿主机 OS,Camoufox 自动打开 canvas 保护。要真像素就canvas_noise=False(代价是像素与宿主机一致),或在宿主机 OS 上启动该浏览器。

适用边界与下一步

这套方案适合已有 Playwright 脚本、目标站点以浏览器指纹为主要检测手段的爬虫场景。边界很明确:Camoufox 只呈现 Firefox 身份,WAF 若直接测 SpiderMonkey 引擎行为,伪装层改不了引擎;另外它默认搭配旋转代理(住宅 IP 优先)使用,无代理时 IPv6 仍可能暴露本机位置。下一步可以试NewContext()在一个浏览器里跑多套身份,或用launch_server暴露远程 Playwright server 给其他语言接入。

【免费下载链接】camoufox🦊 Anti-detect browser项目地址: https://gitcode.com/gh_mirrors/ca/camoufox

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考