Obscura:看看一个70MB的Rust无头浏览器,如何干掉300MB的Chrome

工具推荐 1777187257更新

0

我最近,在研究怎么让 AI agent 真正「看见」网页。

不是那种调个 API 返回一堆 JSON 的「看见」,而是那种,能像真人一样打开浏览器、点点按钮、填填表格、等待页面加载完成的「看见」。

你可能会说,这有什么难的,用 Puppeteer 或者 Playwright 不就行了?

是啊,我也这么想的。

然后我就被 Chrome 的内存占用给教育了。

说实话,200多 MB 的内存占用,对于一个桌面浏览器来说其实不算过分。但当你想要跑几十个、几百个并行的 AI agent 的时候,这个数字就变得相当恐怖了。

这就好像,你只是想用计算器算个数,但得先买一台电脑。

离谱吗?

确实有点。

但更离谱的是,在这个 AI agent 爆发的时代,大多数人还是这么干的。

前两天我在逛 GitHub 的时候,偶然发现了一个项目,叫 Obscura。

一看看愣住了。

这哥们,用 Rust 写了一个无头浏览器,内存占用 30 MB,启动时间 instant,页面加载 84 ms(JS+XHR+fetch 场景)。

而且还支持 Puppeteer 和 Playwright 的接口。

我的第一反应是,假的吧?

第二反应是,我得亲自试试。

于是我就 clone 下来了,cargo build 跑了一遍。第一次编译大概花了 5 分钟,V8 引擎要从源码编译,但编译完成之后,二进制文件只有 70 MB,对比 Chrome 的 300 MB,还是挺离谱的。

而且这 70 MB 是包含了所有东西的,单文件,零依赖,不需要装 Node.js,不需要装 Chrome 本体,开箱即用。

我就跑了一下他们的 example。

obscura fetch https://example.com --eval "document.title"

一秒不到,返回了结果。

然后我又试了一下更复杂的场景,跑一个需要渲染 JavaScript 的页面。

obscura fetch https://news.ycombinator.com --dump html

还是一瞬间。

不止于此,它还能直接提取所有链接,或者等待动态内容加载完成。

obscura fetch https://example.com --dump linksobscura fetch https://example.com --wait-until networkidle0

然后我就开始研究,为什么能这么快?

答案其实挺简单的,就是取舍。Obscura 没有追求做一个「完整的」浏览器,它的目标非常明确,就是做 web scraping 和 AI agent 自动化。所以它砍掉了所有桌面浏览器的功能,保留了最核心的渲染引擎和网络栈。

就像那些超跑一样,拆掉空调、拆掉音响、拆掉后排座椅,然后告诉你,这车能跑 300 码。

你说是减配吧,也确实是减配。但该有的东西,一点没少。

JavaScript 渲染是原生支持的,跑的是完整的 V8 引擎。CDP 协议也支持,所以用 Puppeteer 或者 Playwright 的代码,几乎不用改,直接连上来就能用。

甚至反爬虫机制,Obscura 都帮你考虑好了。

stealth 模式可以随机化 GPU、屏幕、Canvas、音频、battery 等指纹信息,Function.prototype.toString() 会返回 [native code]navigator.webdriver 也被设成了 undefined,跟真浏览器一模一样。

而且还内置了一个 blocklist,屏蔽了 3520 个追踪域名,广告、analytics、遥测脚本根本不会请求到这些域名。

需要注意的是,stealth 模式不是默认开启的,需要用 cargo build --release --features stealth 编译才行。

还有一个我觉得挺骚的功能,叫 getMarkdown。

这是 Obscura 自己实现的一个 CDP 域方法,可以直接把 DOM 转成 Markdown 格式。

obscura serve --port 9222# 然后用 CDP 调用 getMarkdown

另外,表单提交和登录这种场景也没问题,POST 请求、302 重定向、cookie 维护,Obscura 底层帮你处理好了。

还有几个 CLI 参数挺有用。

--selector 可以等待某个 CSS 选择器出现后再返回,--proxy 支持 HTTP/SOCKS5 代理,--obey-robots 尊重 robots.txt,--workers 控制并行 worker 进程数量。

这些参数单独看都不起眼,但加在一起,就是从「将就」到「讲究」的跨越。

说到这里,我想到了一个事。

九十年代末,互联网开始普及。那时候很多人觉得,哦,这就是个新东西,把原来的纸媒内容搬上来就行了。报纸上网、电视上网、黄页上网。

但真正吃到红利的那波人,想的不是「怎么用互联网发布信息」,而是「互联网能做什么以前根本做不到的事」。

ebay 做到了物理世界做不到的事,Google 做到了信息组织方式根本性的变化,amazon 做到了零售业不受地理限制。

而那些只是「把纸媒搬上网」的人,慢慢就被淘汰了。

AI 时代也是这样。现在很多人把 AI 当成一种新的「工具」,然后用它来做「原来的事」。但 AI 能做的事,跟传统工具能做的事,是不一样的。

Obscura 做的事情,本质上也是这个。它不是在 headless Chrome 基础上做了一点优化,而是重新思考了「AI 时代浏览器」应该长什么样。

没有桌面浏览器的包袱,轻装上阵,只保留 AI agent 真正需要的东西。

30 MB 对比 200 MB,84 ms 对比 800 ms,这个差距不是数字上的差距,是可能性上的差距。

而且 Obscura 是开源的,Apache 2.0 协议,用 Rust 写的,架构分成了 obscura-browser、obscura-cdp、obscura-dom、obscura-js、obscura-net 等多个 crate,模块化设计,后续扩展也方便。

好的工具自己会说话。

Obscura 的 GitHub 仓库地址我放在文末了,感兴趣的可以去看看。

说实话,我也不知道这个工具最后能发展成什么样。但我觉得,像这样的项目,值得被更多人知道。

因为它们代表了一种可能性。

AI 时代,我们需要各种各样的新工具,来重新定义我们做事的方式。有些工具是给人类用的,有些工具是给 AI 用的。

Obscura,是后者的一个尝试。

而且是一个,挺有意思的尝试。

项目地址:

https://github.com/h4ckf0r0day/obscura