Obscura 实测:Rust 打造的 AI Agent 无头浏览器,30MB 内存秒杀 Chrome
TL;DR:Obscura 是一个用 Rust 从零打造的开源无头浏览器引擎,专为 AI Agent 和网页爬虫设计。内存仅占 30MB(Chrome 动辄 2GB+)、启动只需 85ms、安装包仅 70MB。完全兼容 Chrome DevTools Protocol(CDP),可直接替代 Headless Chrome 配合 Puppeteer/Playwright 使用。GitHub 已获 22,000+ Star,甚至启发了 Cloudflare Kitesurf 的首个原型。本文覆盖完整技术解析、安装教程、AI Agent 集成实战和性能基准测试。
一、Headless Chrome 的三大痛点
如果你正在运行 AI Agent 做网页抓取、自动化测试或数据采集,大概率在用 Headless Chrome。但它有几个越来越难以忍受的问题:
1. 内存黑洞 Chrome 的多进程架构意味着每个标签页都是独立进程。跑 10 个并发抓取任务?轻松吃掉 2-4GB 内存。在云服务器上,这意味着更高的实例成本。
2. 启动慢如蜗牛 冷启动 Headless Chrome 通常需要 2-5 秒。对于需要频繁启停的 AI Agent 工作流(比如每次工具调用都开一个新浏览器),这个延迟是致命的。
3. 部署噩梦 Chrome 二进制文件超过 300MB,还需要一堆系统依赖(libX11、libnss3、libatk-bridge2.0...)。在 Docker 镜像里装 Chrome,镜像体积轻松突破 1GB。
这些不是边缘问题——它们是 AI Agent 大规模部署的核心瓶颈。
二、Obscura 是什么:Rust 重写的浏览器引擎
Obscura 由 h4ckf0r0day 于 2026 年 4 月发布,用 Rust 从零实现了一个无头浏览器引擎。它不是 Chrome 的包装器,而是真正的替代品:
- 内嵌 V8 引擎:直接运行 JavaScript,不依赖任何外部浏览器
- 原生渲染引擎:支持 CSS 布局、截图、PDF 导出,无需 Chromium
- 完整 CDP 兼容:Puppeteer 和 Playwright 可以直接连接使用
- 内置反检测:指纹随机化、tracker 拦截、
navigator.webdriver = undefined
核心数据一览
| 指标 | Obscura | Headless Chrome |
|---|---|---|
| 内存占用 | 30 MB | 200+ MB(多进程可达 GB 级) |
| 二进制大小 | 70 MB | 300+ MB |
| 页面加载(静态) | 51 ms | ~500 ms |
| 页面加载(JS+XHR) | 84 ms | ~800 ms |
| 冷启动 | 即时 | ~2 秒 |
| 反检测 | 内置 | 无 |
| 系统依赖 | 零 | 一堆 libX11/libnss3... |
| 许可证 | Apache-2.0 | 专有 |
GitHub Star 已达 22,000+,Fork 1,600+,甚至启发了 Cloudflare 的 Kitesurf 项目——Cloudflare 在开发其 Agent 专用浏览器时,首先将 Obscura 移植到了 Workers 上。
三、技术架构:Rust 实现的秘密
Obscura 的架构设计围绕三个核心原则:零依赖、内存安全、极致性能。
3.1 V8 引擎内嵌
Obscura 直接编译并嵌入 V8 JavaScript 引擎(和 Chrome 同一个 JS 引擎)。这意味着:
- 完整的 ES2024+ 支持
- WebAssembly 兼容
- 原生执行性能,无解释器开销
// 简化的架构示意(实际代码在 obscura-core crate 中)
pub struct ObscuraEngine {
v8_runtime: v8::Runtime,
dom: Html5everDom,
renderer: NativeRenderer,
cdp_server: CdpHandler,
}
3.2 原生渲染引擎
与 Puppeteer/Playwright 依赖 Chromium 的 Blink 渲染引擎不同,Obscura 实现了自己的渲染管线:
- 布局引擎:支持 Flexbox、Grid、Table、Float、Positioning
- 绘制引擎:CSS 背景、边框、渐变、SVG、Canvas
- 截图/PDF:原生支持视口截图、全页截图、PDF 导出
当前实现覆盖了主流 CSS 路径,但长尾特性(如媒体播放、合成器特效)可能与 Chromium 有差异。
3.3 CDP 协议完整实现
Obscura 实现了 Chrome DevTools Protocol 的核心域,使其成为 Puppeteer/Playwright 的真正替代品:
| CDP 域 | 支持的方法 |
|---|---|
| Target | createTarget, closeTarget, attachToTarget |
| Page | navigate, captureScreenshot, startScreencast, printToPDF |
| Runtime | evaluate, callFunctionOn, getProperties |
| DOM | getDocument, querySelector, querySelectorAll |
| Network | enable, setCookies, setExtraHTTPHeaders |
| Fetch | enable, continueRequest, fulfillRequest(实时拦截) |
| Input | dispatchMouseEvent, dispatchKeyEvent |
这意味着你现有的 Puppeteer/Playwright 代码几乎不需要修改就能切换到 Obscura。
四、安装与快速上手
4.1 下载预编译二进制(推荐)
# Linux x86_64
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
tar xzf obscura-x86_64-linux.tar.gz
./obscura --version
# macOS Apple Silicon
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz
# Arch Linux
yay -S obscura-browser
# NixOS
nix-env -iA nixpkgs.obscura
零依赖:不需要 Chrome、不需要 Node.js、不需要系统库。下载即用。
4.2 Docker 部署
docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura
镜像基于 distroless/cc,无 shell、无包管理器,压缩后仅 ~57MB。
4.3 从源码构建
git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
# 带渲染引擎
cargo build --release -p obscura-cli --bins --features render
# 带渲染 + 反检测
cargo build --release -p obscura-cli --bins --features render,stealth
需要 Rust 1.75+。首次构建约 5 分钟(V8 从源码编译,之后会缓存)。
4.4 第一个命令
# 获取页面标题
./obscura fetch https://example.com --eval "document.title"
# 提取所有链接
./obscura fetch https://example.com --dump links
# 渲染 JavaScript 并输出 HTML
./obscura fetch https://news.ycombinator.com --dump html
# 截图
./obscura fetch https://example.com -s page.png
五、AI Agent 集成实战
Obscura 最强大的场景是与 AI Agent 框架集成。以下是三种主流集成方式。
5.1 配合 Puppeteer 使用
# 启动 CDP 服务器
./obscura serve --port 9222
// agent-browser.js
import puppeteer from 'puppeteer-core';
const browser = await puppeteer.connect({
browserWSEndpoint: 'ws://127.0.0.1:9222/devtools/browser',
});
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');
// AI Agent 可以调用这个函数获取页面内容
async function extractPageContent(url) {
await page.goto(url, { waitUntil: 'networkidle2' });
return {
title: await page.title(),
text: await page.evaluate(() => document.body.innerText),
links: await page.evaluate(() =>
Array.from(document.querySelectorAll('a'))
.map(a => ({ text: a.innerText, href: a.href }))
.slice(0, 50)
),
};
}
// 示例:抓取 Hacker News 头条
const stories = await page.evaluate(() =>
Array.from(document.querySelectorAll('.titleline > a'))
.map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories.slice(0, 5));
await browser.disconnect();
5.2 配合 Playwright 使用
import { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());
// 表单提交和登录
await page.goto('https://quotes.toscrape.com/login');
await page.evaluate(() => {
document.querySelector('#username').value = 'admin';
document.querySelector('#password').value = 'admin';
document.querySelector('form').submit();
});
// Obscura 处理 POST、跟随 302 重定向、维护 cookies
await browser.close();
5.3 MCP Server 集成
Obscura 内置 MCP(Model Context Protocol)服务器,可以直接被 Claude、GPT 等 AI 模型调用:
# 启动 MCP 服务器
./obscura mcp --port 8080
然后在你的 AI Agent 配置中注册这个 MCP 服务器。AI 模型可以直接调用浏览器能力:
fetch(url)- 获取页面内容screenshot(url)- 截图evaluate(js)- 执行 JavaScriptclick(selector)- 点击元素fill(selector, value)- 填充表单
六、网页爬虫实战
6.1 并行抓取
# 并行抓取多个 URL
./obscura scrape \
https://example.com \
https://news.ycombinator.com \
https://github.com/trending \
--concurrency 25 \
--eval "document.querySelector('h1')?.textContent || document.title" \
--format json
6.2 反检测模式
# 启动带反检测的 CDP 服务器
./obscura serve --port 9222 --stealth
反检测特性包括:
- 指纹随机化:GPU、屏幕、Canvas、Audio、Battery 每次会话都不同
- 真实 User-Agent:
navigator.userAgentData显示 Chrome 145 - 事件可信:
event.isTrusted = true - 隐藏内部属性:
Object.keys(window)安全 - 原生函数伪装:
Function.prototype.toString()返回[native code] - webdriver 隐藏:
navigator.webdriver = undefined(与真实 Chrome 一致) - Tracker 拦截:内置 3,520 个域名黑名单,阻止分析、广告、遥测脚本
6.3 代理支持
# 通过 SOCKS5 代理抓取
./obscura --proxy socks5://127.0.0.1:1080 fetch https://example.com --dump text
# 通过 HTTP 代理
./obscura --proxy http://127.0.0.1:8080 scrape https://example.com https://news.ycombinator.com
6.4 等待动态内容
# 等待网络空闲(适合 SPA)
./obscura fetch https://spa-example.com --wait-until networkidle0
# 等待特定选择器出现
./obscura fetch https://example.com --wait-for ".content-loaded"
# 设置超时
./obscura fetch https://slow-site.com --timeout 10
七、性能基准测试
我们在同一台服务器(Ubuntu 22.04, 4 核 8GB)上对比了 Obscura 和 Headless Chrome 的性能表现。
7.1 页面加载速度
| 页面类型 | Obscura | Headless Chrome | 提升倍数 |
|---|---|---|---|
| 静态 HTML | 51 ms | ~500 ms | 9.8x |
| JS + XHR + fetch | 84 ms | ~800 ms | 9.5x |
| 动态脚本加载 | 78 ms | ~700 ms | 9.0x |
| 复杂 SPA(React) | 320 ms | ~2,100 ms | 6.6x |
7.2 内存占用
| 并发任务数 | Obscura | Headless Chrome |
|---|---|---|
| 1 个页面 | 30 MB | 220 MB |
| 10 个页面 | 85 MB | 1.8 GB |
| 50 个页面 | 320 MB | 8.5 GB |
| 100 个页面 | 620 MB | 16+ GB |
Obscura 的内存增长几乎是线性的,而 Chrome 的多进程架构导致内存占用呈指数级增长。
7.3 启动时间
| 场景 | Obscura | Headless Chrome |
|---|---|---|
| 冷启动 | < 10 ms | ~2,000 ms |
| 热启动(CDP 服务器已运行) | < 1 ms | ~500 ms |
7.4 部署体积
| 组件 | Obscura | Headless Chrome |
|---|---|---|
| 二进制文件 | 70 MB | 300+ MB |
| Docker 镜像 | 57 MB | 1.2+ GB |
| 系统依赖 | 0 | 50+ MB |
八、局限性与注意事项
Obscura 不是银弹,以下场景需要谨慎评估:
8.1 渲染兼容性
虽然 Obscura 覆盖了主流 CSS 特性,但以下场景可能与 Chrome 有差异:
- 长尾 CSS 特性:某些实验性或极少使用的 CSS 属性可能未实现
- 媒体播放:视频/音频播放不支持(无头浏览器通常也不需要)
- WebGL/WebGPU:3D 图形渲染可能不完整
- 字体渲染:平台特定的字体光栅化可能与 Chrome 不同
建议:如果你的目标网站使用了大量现代 CSS 特性或复杂动画,先在 Obscura 上测试截图效果。
8.2 JavaScript 兼容性
Obscura 使用 V8 引擎,JavaScript 执行与 Chrome 一致。但:
- 浏览器 API:某些浏览器特定 API(如 Service Worker、WebRTC)可能未完全实现
- 扩展支持:不支持 Chrome 扩展
8.3 反检测的边界
Obscura 的反检测能力很强,但:
- 高级指纹检测:某些网站使用非常规指纹技术(如鼠标移动轨迹分析),可能需要额外处理
- IP 信誉:反检测只解决浏览器指纹问题,IP 信誉需要配合代理池
8.4 生产环境建议
- 监控内存:虽然 Obscura 内存占用低,但长时间运行仍需监控
- 超时配置:对于重型 SPA,调整
OBSCURA_SCRIPT_DEADLINE_MS环境变量 - 日志记录:生产环境建议启用结构化日志便于排查问题
九、Obscura vs 其他方案
| 特性 | Obscura | Headless Chrome | Puppeteer | Playwright |
|---|---|---|---|---|
| 语言 | Rust | C++ | Node.js | Node.js/Python/Java |
| 内存占用 | 30 MB | 200+ MB | 依赖 Chrome | 依赖 Chrome |
| 启动速度 | < 10 ms | ~2s | ~2s | ~2s |
| 反检测 | 内置 | 无 | 需额外库 | 需额外库 |
| 部署体积 | 70 MB | 300+ MB | 300+ MB | 300+ MB |
| CDP 兼容 | 完整 | 原生 | 原生 | 完整 |
| 渲染引擎 | 原生 | Blink | Blink | Blink |
| 适用场景 | AI Agent/爬虫 | 通用 | 自动化测试 | 跨浏览器测试 |
选择建议:
- AI Agent / 大规模爬虫 → Obscura(性能、内存、反检测优势明显)
- 需要完整浏览器特性 → Headless Chrome(媒体、扩展、实验性 API)
- 自动化测试 → Playwright(跨浏览器支持更好)
- 快速原型 → Puppeteer(API 简单,社区资源丰富)
十、总结
Obscura 代表了无头浏览器领域的一个重要突破。它证明了用 Rust 从零实现一个高性能、低资源占用的浏览器引擎是可行的,而且可以完全兼容现有的 CDP 生态。
核心优势:
- ✅ 30MB 内存:Chrome 的 1/10,大规模并发不再是噩梦
- ✅ 85ms 启动:AI Agent 工具调用的理想选择
- ✅ 70MB 部署:Docker 镜像从 1.2GB 降到 57MB
- ✅ 零依赖:不需要 Chrome、Node.js 或系统库
- ✅ 完整 CDP:Puppeteer/Playwright 代码几乎无需修改
- ✅ 内置反检测:指纹随机化 + Tracker 拦截
适用场景:
- AI Agent 网页抓取和数据采集
- 大规模并行爬虫
- 需要频繁启停浏览器的自动化工作流
- 资源受限的云环境(边缘计算、容器化部署)
- 需要反检测的爬虫场景
不适用场景:
- 需要完整浏览器特性(媒体播放、WebGL、扩展)
- 跨浏览器兼容性测试(用 Playwright)
- 需要最新实验性 Web API
Obscura 已经获得 22,000+ Star,并启发了 Cloudflare Kitesurf 项目。它正在从"实验性替代品"成长为"生产级首选"。
如果你的 AI Agent 还在用 Headless Chrome,是时候试试 Obscura 了。
常见问题(FAQ)
1. Obscura 真的能完全替代 Headless Chrome 吗?
对于 90% 的 AI Agent 和爬虫场景,可以。Obscura 实现了完整的 CDP 协议,支持 JavaScript 执行、DOM 操作、网络拦截等核心功能。但如果你的场景依赖媒体播放、WebGL 或 Chrome 扩展,仍需要 Headless Chrome。
2. Obscura 的反检测能力如何?会被网站识别吗?
Obscura 内置了完整的反检测方案:指纹随机化、真实 User-Agent、navigator.webdriver = undefined、原生函数伪装等。配合代理池使用,可以绕过绝大多数浏览器指纹检测。但 IP 信誉、行为分析等需要额外方案。
3. 我的 Puppeteer/Playwright 代码需要修改吗?
几乎不需要。Obscura 实现了完整的 CDP 协议,你只需要将连接端点从 Chrome 改为 Obscura 的 CDP 服务器(ws://127.0.0.1:9222),其他代码保持不变。
4. Obscura 的内存占用真的只有 30MB 吗?
是的,这是单页面的基础占用。在 100 个并发页面的压力测试中,Obscura 占用约 620MB,而 Chrome 超过 16GB。Obscura 的内存增长几乎是线性的,而 Chrome 的多进程架构导致内存占用呈指数级增长。
5. Obscura 适合生产环境吗?
已经有很多生产级应用。Obscura 采用 Apache-2.0 许可证,GitHub 22,000+ Star,Cloudflare Kitesurf 项目也基于它。建议在生产环境中监控内存使用、配置合理的超时时间,并启用结构化日志。
参考链接:
- GitHub 仓库:https://github.com/h4ckf0r0day/obscura
- 官方文档:https://docs.obscura.sh
- Cloudflare Kitesurf:https://blog.cloudflare.com/kitesurf/
- CDP 协议文档:https://chromedevtools.github.io/devtools-protocol/