🔍 Obscura:11.6k Stars 的 Rust 无头浏览器,30MB 内存替代 Puppeteer,AI Agent 抓网页快 10 倍
项目地址:h4ckf0r0day/obscura | ⭐ 11,692 Stars | 🛠 Rust | 作者:h4ckf0r0day
老实说,每次用 Puppeteer/Playwright 给 AI Agent 配网页抓取能力,我都要深呼吸。装个 Chrome 几百 MB,启动等两秒,内存随便飙到 200MB+,在服务器上跑分分钟把 1G 小机搞崩。
说的就是这玩意儿,Obscura——一个用 Rust 写的无头浏览器引擎,跑 V8 解析 JavaScript,支持 Chrome DevTools Protocol,内存只要 30MB,二进制 70MB,页面加载 85ms。最骚的操作是:Puppeteer 和 Playwright 的代码几乎不用改,直接连 WS 就能用。
为什么值得关注
Obscura 不是"又一个无头浏览器",它是从头为 AI Agent 设计的:
一行命令跑起来
# 下载二进制(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 fetch https://news.ycombinator.com --eval "document.title"
输出直接就是标题,快到离谱。
AI Agent 接入实战
启动 CDP Server
./obscura serve --port 9222 --stealth
Puppeteer 直连(代码几乎不用改)
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');
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 也兼容
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 scrape url1 url2 url3 \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format json
25 个并发,每个页面 85ms 左右,十几秒干完 100 个页面。Chrome 的话光启动就得等半天。
防反爬能力
Obscura 的 --stealth 模式做了全套伪装:
navigator.webdriver 设为 undefined(真实 Chrome 行为)Function.prototype.toString() 返回 [native code]Object.keys(window) 不暴露内部属性不用再写 page.evaluate 去改 navigator 属性了。
总结
curl 下载就能跑,没有依赖地狱