
Camoufox 抓取网页实测:浏览器易伪装,代理与时区难匹配
来源标题:Camoufox for Web Scraping: Setup, Proxies and Servers
Camoufox 能伪装浏览器指纹并隐藏自动化标记,但实测发现时区仍暴露真实位置:本机为 Africa/Cairo,经美国代理后 IP 与时钟不一致,容易被识别。文章以 Camoufox 0.5.8、浏览器构建 156.0.1-beta.36 演示代理、GeoIP 与服务器配置,并指出其失效场景。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Camoufox 是专为网页抓取而构建的 Firefox 版本,于是我们在 Linux 机器上用一个小型抓取器试了试。紧跟在商品标题之后,它打印出了页面所看到的我们的浏览器信息: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0 webdriver: False timezone: Africa/Cairo
第一行我们看到的是 Windows 版 Firefox,第二行显示没有自动化标志——我们的 Linux 机器去哪了?这一切都只来自几行 Playwright 代码!
最后一行则讲述了另一个故事。Africa/Cairo 是我们自己机器的时钟,所以在一个美国代理后面,页面会得到一个开罗时钟配一个美国 IP,仅这一处不匹配就足以暴露我们的抓取器。
所以浏览器本身是简单的部分,难的是它周围的一切:代理、GeoIP、指纹和服务器。我们将使用 Camoufox 0.5.8(浏览器构建版本 156.0.1-beta.36)逐一配置这些内容。我们还会看看它在哪里仍然会露馅,以及什么时候远程浏览器是更合适的选择。
Camoufox 是一个用于网页抓取和浏览器 agent 的开源 Firefox 分支。它附带一个使用 Playwright API 的 Python 库。请注意,浏览器代码使用 MPL-2.0 许可证,而 Python 包使用 MIT 许可证。
在指纹方面,Camoufox 不会向页面注入 JavaScript。我们第一次运行时看到的那个 Windows 用户代理是在 Firefox 内部设置的,位于页面自身脚本之下。请注意,Camoufox 指纹页面上列出的 navigator、screen、WebGL、字体、WebRTC、时区和区域设置值也同样如此。对页面来说,它们看起来都是原生的。
我们在浏览器指纹指南中介绍了网站如何读取这些值。
还记得我们第一次运行时的 webdriver: False 吗?Playwright 全程都在驱动那个浏览器,只是没有通过 Chrome 的 CDP。对于 Firefox,Playwright 走的是 Juggler——Firefox 自己的自动化协议。
这正是 Camoufox 的用武之地——它修补了 Juggler,使我们的 Playwright 代码在页面的一个隔离副本上运行,页面自身的脚本看不到这个副本。Chrome 则是另一回事,我们在一篇单独的文章中介绍了 CDP 自动化是如何被检测到的。
让我们看看页面从两次 Camoufox 启动中得到了什么:
from camoufox.sync_api import Camoufox
check = "[navigator.platform, ${screen.width}x${screen.height}, navigator.hardwareConcurrency]"
native = "Object.getOwnPropertyDescriptor(Navigator.prototype, 'platform').get.toString()"
for _ in range(2):
with Camoufox(headless=True) as browser:
page = browser.new_page()
page.goto("https://web-scraping.dev/products")
print(page.evaluate(check))
print(page.evaluate(native))
这里,我们在两次独立的启动中读取平台、屏幕尺寸和核心数,并打印 platform getter 的源码。运行后输出: ['MacIntel', '1920x1080', 12] function platform() { [native code] ['MacIntel', '2560x1440', 12] function platform() { [native code]
如我们所见,我们的 Linux 机器显示为 Mac,而且 getter 仍然读作 [native code],因为该值是在 C++ 中设置的。
在两次启动之间,我们的屏幕从 1920x1080 变成了 2560x1440,因为每次启动都会按真实世界流量加权选择一个设备配置文件。我们又启动了 20 次,得到了 14 个 Windows、3 个 macOS 和 3 个 Linux 配置文件。20 次中有 14 次是 Windows,这大致也是真实访客的分布比例。假设一个网站通常有 5% 的访客使用 Linux,那么某一天有 20% 的访客使用 Linux 本身就值得怀疑。
不过核心数保持在我们机器的 12。这是因为在 0.5.8 中,Camoufox() 启动会报告宿主机的核心数,除非传入 pin_cpu_cores=True。
在 0.5.6 版本之前,这些配置文件来自 BrowserForge。从 0.5.7 开始改用 fpgen,其 model-2/2026 模型随 camoufox fetch 一起下载。
话虽如此,Camoufox 并非一直有人维护。它自己的 2026 年状态说明承认「因个人情况导致了一年的维护空档」,而这个空档牺牲了性能,并暴露出新的指纹不一致问题。
0.5.7 和 0.5.8 版本分别于 2026 年 10 月 4 日和 6 日发布,所以开发又重新活跃起来了。不过,README 仍然警告说「它可能不适合稳定的生产环境使用」。
2026 年最佳网页抓取隐身浏览器——一份对 2026 年最佳开源网页抓取隐身浏览器的中立、基于基准的排名,涵盖成功率、速度和维护成本方面的权衡。
如何在 Python 中安装 Camoufox?
Camoufox 分两步安装——先装带有 geoip extra 的 Python 包,然后装浏览器二进制文件。请注意,0.5.8 版本需要 Python 3.10 或更新版本: pip install -U "camoufox[geoip]==0.5.8" python -m camoufox fetch
第一条命令安装 camoufox 0.5.8 以及 Playwright 1.62 和 fpgen 1.3。浏览器来自第二条命令,在我们的 Linux 机器上,其 zip 包大约有 1.3 GB!fetch 耗时 8 分 29 秒,留下了一个 2.4 GB 的浏览器目录。
geoip extra 还附带了一个 115 MB 的 IP 数据库。它叫做「GeoIP AIO」,取代了 MaxMind GeoLite2 文件成为默认选项。fetch 还会安装一个 17 MB 的 uBlock Origin 插件,该插件默认加载。
不幸的是,Python 3.9 不会用错误阻止我们。在那种环境下,pip install camoufox 会悄悄解析到 2025 年 1 月的 0.4.11 版本。这意味着没有 NewContext(),也没有 2026 年的任何指纹和时区修复!
由于 Camoufox 会同时保留多个浏览器构建版本,一次升级可能会在我们不知不觉中改变行为。所以,让我们固定住我们测试过的构建版本: python -m camoufox set official/stable/156.0.1-beta.36 python -m camoufox active
它会打印我们的固定版本和活动构建版本: Pinned: official/stable/156.0.1-beta.36 (installed) official/stable/156.0.1-beta.36 (72637885)
让我们用 version 命令检查所有已安装的内容,它会打印一张状态表: python -m camoufox version
以下是关键部分,路径、哈希和同步时间已裁剪掉: Camoufox v0.5.8
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。