Camoufox是什么?用于Python的Firefox反检测浏览器
Specialist in Anti-Bot Strategies
TL;DR:
- Camoufox 是一个基于 Firefox 构建的开源反检测浏览器,它在 C++ 引擎层面伪造指纹——浏览器属性、屏幕、WebGL、字体等——而不是通过注入的 JavaScript 层来修补,这样检测工具就无法读取。
- 它作为一个 Python 包提供,封装了 Playwright,因此您可以使用您已经知道的 Playwright API 进行操作:
pip install camoufox[geoip],获取浏览器,并使用Camoufox(...)上下文管理器启动它。 - 它的主要功能是地理 IP 匹配代理:将其指向代理,Camoufox 会自动将时区、语言环境和地理位置与该 IP 对齐,因此指纹和出口节点讲述了同样的故事。
- Camoufox 明确在开发中,不定位于稳定生产环境——稳定的
camoufox包和 Alpha 的cloverlabs-camoufox包存在分歧,天真的browser.new_page()可能会遇到浏览器构建视口错误,而no_viewport上下文则可以避免。 - Camoufox 伪造指纹;它不提供 IP 或解决挑战。 对于难以应对的目标,Scrapeless Scraping Browser 将反检测与 195 个国家的住宅代理配对,提供一个受管控的会话——相同的 Playwright 工作流,无需自托管。
- 免费开始。 新的 Scrapeless 账户包括免费的 Scraping Browser 运行时——请在 app.scrapeless.com 注册。
引言:可以经受第二次审视的指纹
大多数隐秘自动化工具在页面内部修补浏览器:注入的脚本覆盖 navigator.webdriver,重新定义 screen,修补 WebGL。问题在于修补本身是可观察的——检测工具可以比较 JavaScript 报告的内容与 C++ 层面会报告的内容,差异就是线索。Camoufox 采取了更困难的路线:它在源代码层面修改 Firefox,使伪造的值是引擎实际上返回的内容,没有 JavaScript 注入可供检测。
Camoufox 在 Mozilla 公共许可证 2.0 下开源,封装了 Python 的 Playwright,并在 GitHub 上积累了近 10,000 个星标。根据其维护者自己的说法,它仍在积极开发中,尚未针对稳定产品发布——这影响了您的采用方式。
本指南涵盖了安装 Camoufox,通过 Playwright 启动它、它伪造的内容、地理 IP 代理功能、您将遇到的粗糙边缘,以及当目标需要的不仅仅是一个良好的指纹时,它如何与受管控的 云浏览器 配对。
什么是 Camoufox?
Camoufox 是 Firefox 的一个定制版本,其反检测功能存在于浏览器二进制文件中,而不是在脚本层中。它并没有通过 JavaScript 覆盖指纹表面,而是修补了 Firefox 的 Gecko 引擎,使值变得本地化:navigator 属性、屏幕和窗口度量、WebGL 供应商和渲染器、字体以及音频/画布表面都报告伪造的值,这些值与真正浏览器的无异,因为从引擎层面来看它们是实实在在的。这些表面正是浏览器指纹研究——例如 EFF 的 Cover Your Tracks 项目——显示出携带最多识别熵的部分。
您可以通过围绕 Playwright 的一个薄 Python 包装器来控制它。这意味着完整的 Playwright 表面——选择器、evaluate、导航、上下文——均可用,唯一与 Camoufox 相关的部分是启动浏览器和传递指纹选项的方式。例如,os 选项会旋转整个平台故事:请求 Windows,浏览器报告 Win32 和 Windows 的 Firefox 用户代理;请求 macOS,则报告相应的 mac 版本——下文已验证。
安装 Camoufox
Camoufox 从 PyPI 安装。[geoip] 附加包会拉取它用来将地理位置与代理 IP 对齐的数据库:
bash
# 安装带有 geoip 附加包的 Python 包装
pip install -U "camoufox[geoip]"
# 获取 Camoufox 驱动的修补版 Firefox 构建
python -m camoufox fetch
python -m camoufox fetch 会下载浏览器二进制文件(截至目前为 beta Firefox 135 版本)和 GeoIP 数据库。有一个包装注释可以节省您一个下午的时间:维护的开发线已经移至新仓库,Alpha 版本在 单独 的包名 cloverlabs-camoufox 下发布。如果稳定的 camoufox 包在启动时抛出浏览器协议错误(见下文的粗糙边缘),Alpha 包跟踪当前浏览器构建更为紧密。
通过 Playwright 启动它
最小启动是一个 Camoufox 上下文管理器,它返回一个 Playwright 浏览器。这个示例读取伪装的指纹,以便您可以看到引擎级替代的工作原理:
python
from camoufox.sync_api import Camoufox
# os="windows" 使整个平台都适用于 Windows,深层引擎
with Camoufox(headless=True, os="windows") as browser:
context = browser.new_context(no_viewport=True)
page = context.new_page()
page.goto("https://example.com")
print("platform:", page.evaluate("navigator.platform"))
print("ua:", page.evaluate("navigator.userAgent")[:75])
print("webdriver:", page.evaluate("navigator.webdriver"))
运行此代码会打印 platform: Win32、Windows NT 10.0; Win64; x64; rv:135.0 的 Firefox 用户代理,以及 webdriver: False — 这是大多数检测器首先检查的自动化标志。上述值全部来源于已修补的引擎,而不是注入的覆盖。
在上下文中的 no_viewport=True 是故意为之:在当前浏览器构建中,默认的 browser.new_page() 路径可能会触发 Browser.setDefaultViewport 协议错误,而使用 no_viewport=True 创建上下文可以避免这点,同时保持指纹不变。这正是项目“开发中”标签所警告的尖锐问题。
在免费计划上获取您的 API 密钥:app.scrapeless.com
geoip 代理功能
Camoufox 对抓取最有用的能力是指纹与网络之间的一致性。传递一个代理并启用 geoip,它会自动将浏览器的时区、语言环境和地理位置设置为与代理的 IP 匹配:
python
from camoufox.sync_api import Camoufox
with Camoufox(
headless=True,
geoip=True, # 将时区 / 语言环境 / 地理位置与代理的 IP 对齐
proxy={
"server": "http://proxy.example.com:8000",
"username": "user",
"password": "pass",
},
) as browser:
context = browser.new_context(no_viewport=True)
page = context.new_page()
page.goto("https://example.com")
print(page.title())
价值在于一致性:将位于柏林的住宅 IP 与报告 America/New_York 和 en-US 的浏览器配对是一种矛盾,检测器可能会标记,而 geoip 能消除这种矛盾。Camoufox 不 会提供代理 — 该 IP 是您单独提供和付费的,这是一个托管浏览器改变方程的切入点。
严峻的边缘 — 和操作缺口
这里有两个类别的限制需要关注,它们性质不同。
稳定的边缘是真实且被承认的。 Camoufox 的 README 明确指出,该项目仍在开发中,可能不适合稳定的生产环境。实际上,这表现为稳定版和 alpha 包之间的版本分裂,以及像上面提到的视口错误等浏览器构建不匹配。这个项目值得快速使用和改进,但生产部署需要您对任何预 1.0 依赖项进行的版本固定和每个目标测试 — 其 MPL-2.0 许可证也带有商业团队在嵌入前应该审核的义务。
操作缺口是结构性和永久性的。 完美的指纹并不能更改您的 IP 或响应挑战页面。Camoufox 在您的基础设施上运行,从您的出口出发,因此,如果一个目标限制了您的 IP 范围或提供了流量验证的过渡界面,响应的是您的网络,而不是您的 navigator 对象。您仍然需要代理(配合上述 geoip)和处理挑战的计划 — 这两者都是您组装和操作的独立系统。
与 Scrapeless Scraping Browser 配对
当一个目标需要强大的指纹 和 清洁的住宅出口 和 挑战处理 — 而您不想操作三个系统时 — Scrapeless Scraping Browser 将它们合并为一个托管会话。它是一个由自研的 Chromium 提供支持的反检测云浏览器,拥有遍布 195 个国家的住宅代理,可以根据会话选择,并暴露出一个 Playwright 连接的 CDP 端点。工作流程保持 Playwright 原生,与 Camoufox 相同:
python
import os
from playwright.sync_api import sync_playwright
# 构建 Scrapeless 云浏览器的 WebSocket 端点(美国住宅出口)
API_KEY = os.environ["SCRAPELESS_API_KEY"]
ws_endpoint = (
"wss://browser.scrapeless.com/api/v2/browser"
f"?token={API_KEY}&session_ttl=180&proxy_country=US"
)
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(ws_endpoint)
page = browser.contexts[0].new_page() if browser.contexts else browser.new_page()
page.goto("https://example.com", wait_until="domcontentloaded")
print(page.title())
browser.close()
权衡是显而易见的:当您想在您运行的基础设施上获得引擎级指纹控制时,使用 Camoufox;当您想要指纹、IP 和作为服务提供的挑战处理时,使用 Scrapeless。Scrapeless 文档 包含了完整的参数集,定价 是基于使用的,并提供免费层。由于 geoip 配对的质量取决于其背后的代理,因此有关 网络爬虫的住宅代理指南 涉及这个配对所依赖的出站部分。
结论:引擎级隐蔽控制,标明了缝合处
Camoufox 的方法——在一个修补过的 Firefox 中伪造指纹,而不是在其上方——是一个在技术上更强的想法,而其 geoip 匹配的代理解决了大多数隐蔽工具所忽略的一致性问题。需要注意的是它的预生产状态(固定版本、针对每个目标进行测试、注意包的拆分)以及它是一个指纹工具,而不是一个完整的抓取栈。
在您控制基础设施并希望获得深度指纹控制的地方部署它,并将难度较大的高价值目标——也就是那些依赖于 IP 声誉和挑战的目标——通过 Scrapeless 抓取浏览器会话进行处理。两者都使用 Playwright,因此这是在一个代码库内的路由选择,而不是两个重写。
准备好构建您的 AI 驱动数据管道了吗?
加入我们的社区,申请免费的计划,并与构建反检测管道的开发者连接:Discord · Telegram。
在 app.scrapeless.com 注册,获得免费的抓取浏览器运行时,同时让 Camoufox 处理您自行托管的目标。
常见问题解答
问:Camoufox 与使用隐蔽插件修补普通浏览器有什么不同?
Camoufox 在 Firefox 的 C++ 引擎中伪造指纹值,因此页面中的 JavaScript 直接读取伪造的值,没有注入的覆盖可以被检测到。基于插件的隐蔽修补从 JavaScript 中修改值,这在脚本报告与引擎报告之间留下了可检测的间隙。
问:我在 Playwright 还是 Puppeteer 中使用 Camoufox?
通过其 Python API 使用 Playwright。Camoufox 作为一个 Python 包装器 (camoufox.sync_api / camoufox.async_api) 发布,启动修补过的 Firefox,并为您提供一个 Playwright 浏览器对象,因此您脚本的其余部分是普通的 Playwright。
问:Camoufox 是否准备好投入生产?
其维护者表示其仍在开发中,可能不适合稳定的生产环境。将其视为任何 1.0 之前的依赖项:锁定版本,注意 alpha 版本在单独的 cloverlabs-camoufox 包中发布,并在依赖它之前测试每个目标。
问:Camoufox 包含代理吗?
不。Camoufox 伪造指纹,并且在 geoip=True 时,将时区和地理位置与您提供的代理对齐——但代理本身由您提供。Scrapeless 抓取浏览器会将来自 195 多个国家的住宅代理捆绑到会话中。
问:为什么要将 Camoufox 与 Scrapeless 搭配使用,而不仅仅是添加代理?
因为难度较大的目标结合了三项检查——指纹质量、IP 声誉和挑战页面——而一个自托管的指纹工具仅解决了第一项。Scrapeless 抓取浏览器将反检测 Chromium、住宅出站和挑战处理作为一个管理会话提供,因此整个集合在无需组装和操作独立系统的情况下都得到了覆盖。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



