编程 从 Headless Chrome 切到 Obscura 之前,我建议你先看这份评估笔记

2026-08-26 22:48:23 views 7

用 Headless Chrome 跑批量爬虫和 AI Agent 的自动化任务,踩过的坑基本都集中在资源开销和反爬这两块。单实例内存长期顶着 200MB+ 跑,并发一高,服务器成本直接失控;冷启动 2 秒,页面加载 500ms 起步;安装包 300MB,容器分发也没什么体验可言。更麻烦的是 Chrome 没有任何原生的反检测能力,爬虫跑得再快,被识别了也是白搭。

最近看到开源项目 Obscura,Rust 写的无头浏览器,主打 AI 代理、网页抓取场景。GitHub 星标破万,宣传数据确实好看。但我对「碾压」「极致」这类词保持警惕,所以把它的技术细节和限制整理了一份笔记,先看再判断。

资源占用:官方宣称的数据,我还没完整复测

先摆官方数字,仅供参考,实际性能需要你自己压测验证:

  • 单实例内存约 30MB,官方说法是比 Chrome 省 6 倍左右
  • 安装包约 70MB,Docker 镜像压缩后约 57MB
  • 启动接近瞬时;静态页首屏约 51ms,动态 JS 页面约 84ms

这些数据看着确实诱人,但注意它的加载数据是官方自测结果,取决于目标站点的资源复杂度和机器配置。我跑本地测试的时候,静态页响应确实比 Chrome 快,但动态页的 84ms 不一定稳定复现,有条件建议自己拿真实目标站点测试一遍。另外要注意,30MB 内存只是基线,跑到重 JS 页面时,V8 引擎的堆内存还是要额外算的。

CDP 兼容:切换成本低,但别指望 100% 覆盖

Obscura 实现了 Chrome DevTools Protocol(CDP),也就是说你原有的 Puppeteer / Playwright 脚本,理论上只需要把 WebSocket 连接地址切过来就能跑。支持页面跳转、元素点击、表单填写、网络拦截、Cookie 管理等常用操作。

启动 CDP 服务:

obscura serve --port 9222
# 开启反检测模式:
obscura serve --port 9222 --stealth

但这有个隐含问题:CDP 的协议覆盖是「常用操作」,不是「全部操作」。Chrome 的 CDP 有几十个 domain,Obscura 目前只实现了核心部分。如果你们团队用了 Chrome DevTools Protocol 里比较冷门的方法,比如某些 Performance、Tracing 相关接口,建议先小范围跑一遍兼容性测试,再决定要不要全面切换。

--stealth 反检测:有用,但有边界

--stealth 是 Obscura 主打的卖点,开启后做以下处理:

  • 会话指纹随机化:屏幕参数、Canvas、Audio、GPU 信息每次刷新
  • 隐藏 webdriver 标识,模拟真实 Chrome 环境
  • 原生拦截 3520 个追踪、广告、指纹采集域名(内置拦截规则,不是插件)
  • 修复事件可信标识、原生函数特征

对常规的爬虫反制来说,这套组合的确能解决大部分问题,不需要额外接第三方隐身插件。

但要注意边界:防的是「大多数常规检测」,不是「针对性风控」。如果你面对的是银行、风控体系这类上了设备指纹深度采集的场景,或者目标网站对 Canvas、WebGL 指纹做了精细比对,--stealth 的随机化策略有可能会在行为一致性上出问题——每次刷新指纹全变,本身就可能是异常信号。

还有一个点:--stealth 拦截的是域名级请求拦截,本质是黑名单机制。碰上动态域名、或者走 CNAME 隐藏的追踪器,这套方案就漏了,需要配合自定义代理或自建拦截规则。

MCP 服务:接 Claude 的两种方式

Obscura 内置 MCP 服务,提供标准化的浏览器操作指令:页面访问、元素点击、输入、等待选择器、执行 JS、抓取网络日志等。另外有个实用的内置功能——DOM 直接转 Markdown,省掉爬虫抓取后清洗 HTML 的步骤,对 LLM 消费友好。

MCP 支持两种传输方式:

标准输入输出(默认) —— 适合 Claude Desktop 这类会启动子进程的 MCP 客户端:

obscura mcp

HTTP 方式 —— 适合通过网络连接的客户端:

obscura mcp --http --port 8080
# endpoint: http://127.0.0.1:8080/mcp

Claude Desktop 配置 claude_desktop_config.json

{
  "mcpServers": {
    "obscura": {
      "command": "obscura",
      "args": ["mcp"]
    }
  }
}

可选参数:

参数说明
--proxy <URL>HTTP/SOCKS5 代理
--user-agent <UA>自定义 User-Agent
--stealth启用反检测模式

CLI 常用命令速查

日常抓取可以直接用 CLI,常用命令如下:

# 获取页面标题
obscura fetch https://example.com --eval "document.title"

# 提取所有链接
obscura fetch https://example.com --dump links

# 渲染 JS 后输出 HTML
obscura fetch https://news.ycombinator.com --dump html

# 输出到文件
obscura fetch https://example.com --dump text --output page.txt

# 流式输出原始响应体(二进制安全)
obscura fetch https://picsum.photos/200/300 --dump original > photo.jpg

# 列出所有子资源 URL
obscura fetch https://example.com --dump assets

# 走 SOCKS5 代理
obscura --proxy socks5://127.0.0.1:1080 fetch https://example.com --dump text

# 等待动态内容加载完成
obscura fetch https://example.com --wait-until networkidle0

# 限制导航超时
obscura fetch https://example.com --timeout 10

# 截图
obscura fetch https://example.com --screenshot page.png

需要注意的是 --wait-until networkidle0 这个标志——它和 Playwright 的 networkidle0 语义是否完全一致,文档里没写清楚,比如长轮询或者 WebSocket 连接不关闭的站点,是否会导致等待超时,建议实际跑个长连接站点验证一下。

适用场景与不适用场景

适合用的场景:

  • 高并发网页爬虫、批量内容提取,单机跑高并发实例的成本优势明显
  • AI Agent 网页操作、工具调用,MCP 协议对 LLM 工具链友好
  • 低成本云自动化、边缘轻量服务,部署包小,没有 Chrome 运行时依赖
  • 常规反爬需求的爬虫,--stealth 加内置追踪拦截能省掉额外配置

不适合(或者说,你需要提前验证)的场景:

  • 完整 WebGL 渲染:官方没有完整实现 WebGL 支持,涉及 3D 渲染的页面会降级或失败
  • 视频播放 / 复杂多媒体:编解码支持是裁剪过的,播放器相关功能会出问题
  • 指纹高度定制化的风控对抗--stealth 做的是「从随机到正常」的策略,不是「自定义固定指纹」。对方如果做了多次访问的指纹比对,发现你每次指纹都不同,这本身就是严重的风险信号

失败时的表现一般不是崩溃,而是 WebGL 接口返回空结果、视频元素永远停在黑屏、整个页面加载超时后落入兜底逻辑。好在因为有超时控制,不会挂死整个任务队列,但这意味着你的错误处理逻辑需要覆盖这些边界。

部署方式

支持三种:二进制包(Linux / macOS / Windows,无 Chrome 和 Node 依赖)、Docker(distroless 精简镜像)、源码编译(Rust 环境,可自定义编译项)。本地快速验证可以直接用 brew 或者下载 release 包,不需要折腾编译工具链。

写在最后

Obscura 的定位很清晰——不做 Chrome 的完全替代品,而是专注于轻量、高并发、AI Agent 场景的无头浏览器。它解决的问题是真实存在的,但它能覆盖的也只是它声称覆盖的那个范围。如果你的场景在「常规爬虫 + AI Agent」的舒适区里,值得试试;如果你要的是完整浏览器能力的替代品,那它大概率会让你失望。

一个值得留意的信号是:它能不能在真实的风控对抗中活下来,靠的不是官方的评测数据,而是你这个具体业务跑起来之后收到的反馈。毕竟,无头浏览器在电商平台面前,从来都不是一次性的技术选型,而是持续的动态对抗。

你会把 Obscura 放在什么样的生产环境里?欢迎分享你的真实压测结果。

复制全文 生成海报 无头浏览器 爬虫 Rust CDP MCP

推荐文章

程序员茄子在线接单