Obscura:Rust 实现的无头浏览器,专为 AI Agent 与网页爬取而生
posts posts 2026-05-03T11:30:00+08:00Obscura 是一个由 Rust 编写的开源无头浏览器引擎,专为 AI Agent 自动化与大规模网页爬取设计。支持 Chrome DevTools Protocol,可作为 Puppeteer/Playwright 的底层替代,内存仅 30 MB,内置反指纹与追踪器屏蔽功能。技术笔记Rust, 无头浏览器, AI Agent, 网页爬取, CDP项目概览
Obscura 是由 GitHub 用户 h4ckf0r0day 开发的一个开源无头浏览器(headless browser)引擎,完全由 Rust 语言编写。截至 2026 年 5 月,该项目已获得 9,624 颗 Stars,621 个 Forks,采用 Apache 2.0 许可证开源。
项目定位非常明确:替代 headless Chrome,作为 AI Agent 自动化和大规模网页爬取的后端引擎。Obscura 通过 V8 JavaScript 引擎执行真实 JS,支持 Chrome DevTools Protocol(CDP),可以无缝接入 Puppeteer 和 Playwright 的现有工具链。
核心设计理念来自官方 README 的一句话:
Designed for automation at scale, not desktop browsing.
Obscura vs Headless Chrome:核心差异
Obscura 最大的对手是 Google 官方的 headless Chrome。后者功能成熟,但体积庞大、资源消耗高、没有内置反检测能力。Obscura 在多个关键指标上实现了数量级差距:
| 指标 | Obscura | Headless Chrome |
|---|---|---|
| 内存占用 | 30 MB | 200+ MB |
| 二进制文件大小 | 70 MB | 300+ MB |
| 内置反指纹 | 是 | 无 |
| 页面加载速度 | 85 ms | ~500 ms |
| 冷启动时间 | 即时 | ~2 秒 |
| Puppeteer 支持 | 是 | 是 |
| Playwright 支持 | 是 | 是 |
这些数据来自项目 README 中的官方对比表格。可以看到,Obscura 在资源效率和反检测能力上有结构性优势,适合需要长时间运行大量浏览器实例的 AI Agent 场景。
安装方式
Obscura 提供两种安装途径:下载预编译二进制,或从源码构建。
下载二进制
官方在 GitHub Releases 页面提供跨平台二进制:
# 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
# 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
# macOS Intel
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-macos.tar.gz
tar xzf obscura-x86_64-macos.tar.gz二进制为单文件,无任何外部依赖(不需要 Chrome、不需要 Node.js)。
从源码构建
需要 Rust 1.75+(通过 rustup.rs 安装):
git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
cargo build --release
# 启用 stealth 模式(反指纹 + 追踪器屏蔽)
cargo build --release --features stealth首次从源码构建耗时约 5 分钟,原因是 V8 引擎需要从源码编译,之后会被缓存。
快速上手
Obscura 提供三个核心 CLI 子命令:fetch(单页抓取)、serve(CDP 服务器)、scrape(并行多页爬取)。
obscura fetch — 单页抓取
# 获取页面标题
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 --wait-until networkidle0obscura serve — 启动 CDP 服务器
# 默认端口 9222
obscura serve --port 9222
# 开启 stealth 模式(反检测 + 追踪器屏蔽)
obscura serve --port 9222 --stealth
# 设置代理
obscura serve --port 9222 --proxy http://127.0.0.1:7890启动后,Obscura 作为一个 CDP WebSocket 服务器运行,客户端(Puppeteer / Playwright)通过 ws://127.0.0.1:9222/devtools/browser 连接。
obscura scrape — 并行多页爬取
obscura scrape https://site1.com https://site2.com https://site3.com \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format jsonscrape 会启动多个 worker 进程并行抓取,适合批量 URL 场景。
Puppeteer / Playwright 集成
Obscura 实现了一套完整的 Chrome DevTools Protocol,可以通过 Puppeteer 或 Playwright 的 CDP 连接方式直接使用,无需修改任何代码。
Puppeteer 示例
npm install puppeteer-coreimport 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');
const stories = await page.evaluate(() =>
Array.from(document.querySelectorAll('.titleline > a'))
.map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories);
await browser.disconnect();Playwright 示例
npm install playwright-coreimport { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
const page = await browser.context().newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());
await browser.close();表单提交与登录
README 提供了一个完整的表单登录示例:
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 重定向、维护 cookie
这说明 Obscura 完整实现了浏览器级别的会话管理。
性能基准
README 中提供了两组基准数据,直接对比 Obscura 与 Chrome 的页面加载时间:
页面加载速度:
| 页面类型 | Obscura | Chrome |
|---|---|---|
| 静态 HTML | 51 ms | ~500 ms |
| JS + XHR + fetch | 84 ms | ~800 ms |
| 动态脚本 | 78 ms | ~700 ms |
这组数据来自项目 README,说明 Obscura 在 JS 执行场景下相比 Chrome 有接近 10 倍的速度优势。但需注意:这些数据未说明测试环境、并发条件或具体页面 URL,读者在实际部署时应自行验证。
Stealth 模式:反指纹与追踪屏蔽
Obscura 的 stealth 模式是其差异化能力的核心体现,通过 Cargo feature 启用:
cargo build --release --features stealth
# 或在 CLI 中
obscura serve --port 9222 --stealth反指纹机制
Stealth 模式包含以下具体能力:
- 每会话指纹随机化:GPU、屏幕、Canvas、Audio、电池等指纹维度在每次会话时随机化
- 真实的
navigator.userAgentData:使用 Chrome 145 的高熵值,而非伪造的固定字符串 event.isTrusted = true:对所有 dispatch 的事件标记为可信,这是很多反爬系统检测无头浏览器的关键指标Object.keys(window)安全:隐藏内部属性,避免脚本通过枚举 window 键发现异常Function.prototype.toString()遮蔽:返回[native code],与真实 Chrome 一致navigator.webdriver = undefined:而非 headless Chrome 默认的true
这些机制使 Obscura 在面对基于 JavaScript 指纹检测的反爬系统时,有更强的隐蔽性。
追踪器屏蔽
Stealth 模式内置了一个覆盖 3,520 个域名的追踪器屏蔽列表,自动拦截分析广告、遥测和指纹脚本,从源头减少被追踪的可能。README 明确指出这一功能是"自动启用"的(--stealth 开启后)。
CDP API 覆盖范围
Obscura 实现了 Chrome DevTools Protocol 的多个核心域,支持以下操作:
| Domain | 支持的操作 |
|---|---|
| Target | createTarget, closeTarget, attachToTarget, createBrowserContext, disposeBrowserContext |
| Page | navigate, getFrameTree, addScriptToEvaluateOnNewDocument, lifecycleEvents |
| Runtime | evaluate, callFunctionOn, getProperties, addBinding |
| DOM | getDocument, querySelector, querySelectorAll, getOuterHTML, resolveNode |
| Network | enable, setCookies, getCookies, setExtraHTTPHeaders, setUserAgentOverride |
| Fetch | enable, continueRequest, fulfillRequest, failRequest(实时拦截) |
| Storage | getCookies, setCookies, deleteCookies |
| Input | dispatchMouseEvent, dispatchKeyEvent |
| LP | getMarkdown(DOM 转 Markdown) |
值得注意的是 Fetch 域的完整实现——这意味着 Obscura 支持对 HTTP 请求和响应进行实时拦截、修改、替换或主动失败,是做反向代理测试或数据脱敏的强大工具。
CLI 参考
obscura serve
| 参数 | 默认值 | 说明 |
|---|---|---|
--port | 9222 | WebSocket 监听端口 |
--proxy | — | HTTP/SOCKS5 代理地址 |
--stealth | off | 启用反检测 + 追踪屏蔽 |
--workers | 1 | 并行 worker 进程数 |
--obey-robots | off | 遵守 robots.txt |
obscura fetch <URL>
| 参数 | 默认值 | 说明 |
|---|---|---|
--dump | html | 输出格式:html / text / links |
--eval | — | 要执行的 JavaScript 表达式 |
--wait-until | load | 等待时机:load / domcontentloaded / networkidle0 |
--selector | — | 等待指定 CSS 选择器出现 |
--stealth | off | 反检测模式 |
--quiet | off | 关闭启动 banner |
obscura scrape <URL...>
| 参数 | 默认值 | 说明 |
|---|---|---|
--concurrency | 10 | 并行 worker 数 |
--eval | — | 每个页面执行的 JS 表达式 |
--format | json | 输出格式:json / text |
适用场景与边界
适合的场景
- AI Agent 自动化:需要浏览器级操作能力(点击、表单、JS 执行)但不能依赖笨重的 Chrome 实例
- 大规模网页爬取:对性能和资源占用敏感,需要并行抓取大量页面
- 替代 Puppeteer/Playwright 的 Chrome 依赖:已有代码基于 Puppeteer/Playwright,希望换掉底层浏览器而不改业务代码
- 需要反检测能力的爬虫项目:面对基于指纹检测的反爬系统,headless Chrome 已被识别
边界与局限
- V8 版本同步:Obscura 依赖特定版本的 V8,与官方 Chrome 的 JS 引擎行为可能存在差异,遇到极端兼容性问题时需要对照测试
- 非桌面浏览器:项目明确表示面向自动化规模设计,不适合桌面浏览测试场景
- Stealth 模式仍有局限:README 中的 stealth 功能列表是静态描述,实际反检测效果取决于目标网站的检测强度,不保证对所有网站都有效
- 生态系统成熟度:相比有数年积累的 Puppeteer/Playwright,Obscura 的社区和周边工具仍在建设阶段,遇到问题时的参考资料相对有限
总结
Obscura 是 Rust 生态中一个值得关注的无头浏览器项目。它的核心价值在于:以远低于 Chrome 的资源占用,实现了同等的 JS 执行能力和 CDP 协议覆盖,同时内置了反指纹和追踪屏蔽能力。对于需要大规模浏览器自动化的 AI Agent 项目,以及对性能敏感的网络爬取场景,Obscura 提供了一个轻量级的替代方案。
如果你正在用 Puppeteer 或 Playwright 构建爬虫或 Agent,尝试将底层浏览器换成 Obscura,可能会有意外的收益——特别是在多实例并行运行的场景下。