Rust 写的无头浏览器,凭什么比 Chrome 轻 85%?


做过大规模网页抓取的人,一定熟悉那种绝望——开了 10 个 Chrome 实例,32GB 内存就开始嗷嗷叫了。
这感觉像什么?为了泡一碗泡面,先把整个厨房点着了。火是够旺,但代价太大了。
最近冒出来的一个 Rust 项目直接把这事翻了个底朝天。它叫 Obscura,专门为 AI Agent 和网页抓取设计的无头浏览器。GitHub 上线不到一个月,12K star。
先上硬数据:
| 指标 | Headless Chrome | Obscura |
|---|---|---|
| 内存占用 | 200MB+ | 30MB |
| 二进制大小 | 300MB+ | 70MB |
| 页面加载 | 500ms | 85ms |
| 启动时间 | 2秒 | 瞬间 |
85% 的内存缩减,不是靠调优调出来的。是根本没装那些你用不着的东西。
把沃尔玛超市换成自动贩卖机
Chrome 说到底是一个"通用浏览器"。视频解码、PDF 渲染、扩展商店、同步服务、自动更新…
这些功能对你刷网页有用,但对爬虫来说全是死重。就像你去便利店买一瓶水,Chrome 直接给你搬来一整个沃尔玛的货架。
Obscura 的思路干净利落——用 Rust 从头写一个浏览器内核。只保留渲染页面和跑 JavaScript 的能力。别的一概不装。
出来的结果就是一个 70MB 的单文件。不用装 Node.js,不依赖 Chrome,一个二进制直接跑。下载、解压、跑起来,三件事。
Rust 在这里使了什么劲
Chrome 的多进程架构隔离性好,但每个进程都有不小的固定开销。就像给每个工人配一间独立办公室,看着体面,租金吓人。
Rust 的异步 runtime 加上零成本抽象,让 Obscura 可以把多个浏览上下文塞进更少的系统线程里。省掉了整间办公室,留下的是共享工位。
数字很直观:一台 32GB 服务器,原来最多扛 160 个 Chrome 实例。换了 Obscura,能跑 1000 个以上。
省下来的不是边角料,是整套系统开销。架构不同,结果自然不同。
# 安装:下载一个文件,解压就跑
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-macos.tar.gz
tar xzf obscura-aarch64-macos.tar.gz
./obscura fetch https://example.com --eval "document.title"
反检测:每次登门都换一张脸
爬虫最怕的不是性能差,是被反爬系统认出来。
Headless Chrome 虽然看着像个正经浏览器,但网站有一万种方法揪出它的马脚。检查 navigator.webdriver 属性、看 GPU 指纹、比对 Canvas 渲染差异、检测音频信号…
Obscura 在隐身这件事上花了大力气:
- 每次会话生成随机化的浏览器指纹。GPU、Canvas、音频上下文、电池状态,全都不一样
- 默认拦截 3520 个追踪域名
- 隐藏
navigator.webdriver,把自己伪装成真实的 Chrome - 重写 JavaScript 原生函数,让行为检测脚本摸不到底
翻译成人话:每次去同一家店,你都换了一身衣服、变了走路姿势、连口音都不一样了。店门口的保安拿你一点办法都没有。
命令行一把梭
如果你不需要完整的 Playwright API,只是想快速抓数据,命令行就够了:
# 拿页面标题
obscura fetch https://example.com --eval "document.title"
# 提取所有链接
obscura fetch https://example.com --dump links
# 等动态内容渲染完再抓
obscura fetch https://news.ycombinator.com --dump html --wait-until networkidle0
# 25 个页面并行抓取,输出 JSON
obscura scrape url1 url2 url3 ... \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format json
--concurrency 25 这个数字放在 Chrome 上想都不敢想。Obscura 跑起来轻飘飘的,25 个并发连眉头都不皱一下。
别急着扔了 Playwright
最舒服的地方来了:Obscura 完全兼容 Chrome DevTools Protocol。
你已有的 Playwright 或者 Puppeteer 代码,几乎不用改就能切过来:
import { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
const page = await browser.newContext().then(ctx => ctx.newPage());
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());
await browser.close();
先跑 obscura serve --port 9222 --stealth,然后用上面的代码连上去。API 还是那个 API,底层已经换成了 30MB 的 Rust 引擎。
AI Agent 时代的浏览器
2026 年 AI Agent 的一个重要赛道是"浏览器自动化"——让 AI 像人一样点网页、填表单、翻页、提取信息。
这个场景下浏览器不是开三五个,是几十上百个同时跑。有的 Agent 搜资料,有的点链接提取内容,还有的在后台填表单、比价格、等通知…
Chrome 的资源消耗在这种并发量下根本扛不住。加内存是个办法,但 32GB 封顶了也就 160 个实例,天花板太低了。
Obscura 刚好处在这个交叉点上:轻到可以随便开,快到你感觉不到启动延迟,而且反检测能力让 Agent 不那么容易被拦住。
保持冷静
Obscura 目前是 v0.1.2,Apache 2.0 开源。49 个 open issue,还在快速迭代。
生产环境用的话,建议先在非关键任务上跑一跑。CDP 兼容性虽然整体不错,但边缘 API 可能还没覆盖全。项目才一个月大,给它点时间。
想继续看 Rust 和 AI 编程的干货?关注公众号「全栈之巅-梦兽编程」,每周推送实战内容。
也欢迎来了解 梦兽编程 AI 编程助手服务 ,让 AI 编程工具真正跑在生产环境里。
FAQ
Q: Obscura 现在能完全替代 Headless Chrome 吗?
A: 看场景。做网页截图、PDF 导出、浏览器扩展测试,Chrome 还是更靠谱。但做网页抓取、自动化测试、AI Agent 浏览,Obscura 在资源效率和反检测上是碾压级的优势。
Q: Rust 写的浏览器,JS 兼容性行不行?
A: Obscura 的 JS 引擎兼容 ES2024 标准。主流网站没问题。但用了很新的 Web API(比如 WebGPU)的页面可能会遇到兼容坑。毕竟项目才一个月大,边缘 case 还需要时间覆盖。
Q: 反检测真的管用吗?
A: 对 Cloudflare、DataDome 等主流反爬服务有一定效果。但反检测本质上是猫鼠游戏,没有一劳永逸的方案。Obscura 的随机化指纹策略是目前比较前沿的思路,起码比 Headless Chrome 裸跑强一个数量级。
