无头浏览器
Rust 写的轻量无头浏览器引擎,为 AI 智能体和爬虫提供反检测自动化
Obscura
开源的无头浏览器,专为 AI 代理和网页抓取设计。
轻量、隐身,使用 Rust 构建。
Obscura 是一个用 Rust 编写的无头浏览器引擎,专为网页抓取和 AI 代理自动化而构建。它通过 V8 运行真实 JavaScript,支持 Chrome DevTools 协议,可作为 Puppeteer 和 Playwright 中无头 Chrome 的即插即用替代品。
为什么在无头 Chrome 之外选择 Obscura?
专为规模化自动化而设计,而非桌面浏览。
| 指标 | Obscura | Headless Chrome |
|---|---|---|
| 内存占用 | 30 MB | 200+ MB |
| 二进制大小 | 70 MB | 300+ MB |
| 反检测能力 | 内置 | 无 |
| 页面加载时间 | 85 ms | ~500 ms |
| 启动速度 | 瞬时 | ~2s |
| Puppeteer 兼容 | 是 | 是 |
| Playwright 兼容 | 是 | 是 |
🎉 10000 星,下一步计划
我们正在开发 Obscura Cloud 托管版本,提供管理式基础设施、住宅代理和专属支持。适合希望使用引擎但不想自行运维的用户。
开源引擎保持 Apache-2.0 许可,功能完整。绝不设功能限制。
赞助商
Obscura 由赞助商支持,确保开发的独立性。
有意赞助?请发送邮件至 hello@obscura.sh。
|
🚀 Obscura × SX.org 在 AI 代理、浏览器自动化或网页抓取中使用 Obscura?通过 SX.org 的稳定代理,让您的工作流更加强大。 🌍 覆盖 235 个国家,1200 万+ IP 🏠 700 万+ 住宅 IP 📱 400 万+ 移动 IP 🏢 100 万+ 企业代理 🔁 轮换和粘性会话 📍 灵活的 geo 设置 🌐 支持 HTTP、HTTPS 和 SOCKS5 ⚡ 连接成功率高达 99.97% 🛟 24/7 支持 🎁 使用代码 Obscura3gb 获取 免费 3GB 试用。 稳定代理,更少拦截,最可靠的 Obscura 自动化。 |
|
🚀 Obscura × ProxyEmpire 在 AI 代理、浏览器自动化或网页抓取中使用 Obscura?通过 ProxyEmpire 的可靠住宅和移动代理,提升您的能力。 🌍 覆盖 170+ 国家,3000 万+ 住宅 IP 📱 4G/5G 移动代理 🔄 轮换和粘性会话 🎯 城市、地区和 ISP 定位 🔐 支持 HTTP、HTTPS 和 SOCKS5 🎁 使用代码 OBSCURA35 获取 35% 循环折扣。 更好的代理,更少拦截,更可扩展的自动化。 |
|
MangoProxy 在 200+ 国家提供住宅、ISP、数据中心和移动代理。凭借稳定连接、快速响应时间和可扩展的代理基础设施,深受全球企业信赖。 使用促销代码 OBSCURA 可享静态 ISP 代理 8% 折扣。 |
|
9Proxy 提供住宅代理,起价仅为 $0.018/IP 或 $0.68/GB。拥有 2000 万+ IP,覆盖 90 多个国家。粘性或轮换会话,可通过桌面或移动应用管理。 |
|
|
NodeMaven — 市场上最可靠的代理提供商,拥有最高质量的 IP。专为自动化、网页抓取、SEO 研究和社交媒体管理而构建。 99.9% 正常运行时间 粘性会话最长 7 天 每个代理均支持 IP 过滤 无需 KYC 流量返现 — 最高可获得 10% 返现 🎁 使用代码 OBSCURA35 享移动和住宅代理 35% 折扣,或使用 OBSCURA40 享 ISP(静态)代理 40% 折扣。 |
|
Rapidproxy — 一个拥有 9000 万+ 真实 IP、覆盖 200 多个国家的住宅代理平台。支持轮换、地理定位和高并发,提高抓取成功率。立即开始您的免费试用! 灵活定价,起价 $0.65/GB 流量永不过期 支持 HTTP / HTTPS / SOCKS5 协议 专为规模而构建的高速、低延迟网络 🎁 使用折扣码 RAPID10 获取 10% 折扣。 |
安装
下载
从 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
./obscura fetch https://example.com --eval "document.title"
# Linux ARM64 (aarch64)
curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-aarch64-linux.tar.gz
tar xzf obscura-aarch64-linux.tar.gz
# Arch Linux (AUR)
yay -S obscura-browser
# 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
# Windows
从发布页面下载 `.zip` 文件并手动解压。
无需 Chrome,无需 Node.js,无依赖。发布归档中包含 obscura 和 obscura-worker;将它们放在同一目录下以支持并行 scrape 命令。
Linux 发布版本针对 Ubuntu 22.04 构建,因此下载的二进制文件可在常见 LTS 服务器(glibc 2.35+)上正常使用。
Docker
docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura
镜像位于 Docker Hub。基于 distroless/cc 的多阶段构建,无 shell,无包管理器,压缩后约 57 MB。
从源码构建
git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
cargo build --release
# 启用隐身模式(反检测 + 跟踪拦截)
cargo build --release --features stealth
需要 Rust 1.75+(rustup.rs)。首次构建约需 5 分钟(V8 从源码编译,之后会缓存)。
快速入门
获取页面
# 获取页面标题
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
# 将导出或 eval 输出写入文件
obscura fetch https://example.com --dump text --output page.txt
# 逐字流式输出原始响应体(二进制安全;绕过 JS/DOM 层)。
# 用于图片、JSON、JS、CSS 或任何非 HTML 资源。
obscura fetch https://picsum.photos/200/300 --dump original > photo.jpg
# 列出页面会获取的每个子资源 URL(NDJSON 格式;每个资源一条记录)
obscura fetch https://example.com --dump assets
# 通过 HTTP 或 SOCKS 代理进行获取
obscura --proxy socks5://127.0.0.1:1080 fetch https://example.com --dump text
# 等待动态内容
obscura fetch https://example.com --wait-until networkidle0
# 限制导航超时时间,适用于缓慢或损坏的页面
obscura fetch https://example.com --timeout 10
启动 CDP 服务器
obscura serve --port 9222
# 启用隐身模式(反检测 + 跟踪拦截)
obscura serve --port 9222 --stealth
并行抓取
obscura scrape url1 url2 url3 ... \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format json
# 抑制 stderr 上的抓取进度,以输出适合脚本的结果
obscura scrape https://example.com --quiet --format json
# 抓取工作进程继承全局代理
obscura --proxy http://127.0.0.1:8080 scrape https://example.com https://news.ycombinator.com
Puppeteer / Playwright
Puppeteer
npm install puppeteer-core
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
npm install playwright-core
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();
表单提交与登录
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
基准测试
页面加载:
| 页面 | Obscura | Chrome |
|---|---|---|
| 静态 HTML | 51 ms | ~500 ms |
| JS + XHR + fetch | 84 ms | ~800 ms |
| 动态脚本 | 78 ms | ~700 ms |
完整的基准测试套件(WPT 一致性、障碍课程、真实语料库、与 Chrome 的速度对比)位于独立的仓库:https://github.com/h4ckf0r0day/obscura-benchmark
隐身模式
通过 --features stealth 启用。
反指纹识别
- 每会话指纹随机化(GPU、屏幕、画布、音频、电池)
- 真实的
navigator.userAgentData(Chrome 145,高熵值) - 分发事件的
event.isTrusted = true - 隐藏的内部属性(
Object.keys(window)安全) - 原生函数伪装(
Function.prototype.toString()→[native code]) navigator.webdriver = undefined(与真实 Chrome 一致)
跟踪拦截
- 拦截 3,520 个域名
- 阻止分析、广告、遥测和指纹识别脚本
- 完全阻止跟踪器加载
- 使用
--stealth时自动启用
CDP API
Obscura 实现了 Chrome DevTools Protocol,以兼容 Puppeteer/Playwright。
| 域 | 方法 |
|---|---|
| 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(实时拦截), takeResponseBodyAsStream |
| IO | read, close(分块流式读取大响应体) |
| Storage | getCookies, setCookies, deleteCookies |
| Input | dispatchMouseEvent, dispatchKeyEvent |
| LP | getMarkdown(DOM 转 Markdown 转换) |
要下载大资源而不使用巨大的 Network.getResponseBody 数据块,可以先调用 Fetch.takeResponseBodyAsStream,然后使用 IO.read / IO.close 分块读取。超过缓存限制(OBSCURA_NETWORK_BODY_BUFFER_BYTES,默认 2 MiB)的响应体不会被保留,因此如果要流式下载大文件,请提高该限制。
CLI 参考
调优 V8
Obscura 直接内嵌 V8。使用 --v8-flags 将原始标志传递给 V8,语法与 Chromium 的 --js-flags 和 Node 的命令行标志相同。最常见的用法是提高堆上限,以修复 JS 密集型页面上的 JavaScript heap out of memory 错误:
obscura --v8-flags "--max-old-space-size=4096" fetch <url>
重型 SPA(脚本执行预算)
Obscura 限制页面的脚本执行阶段,以免单个缓慢或无响应的页面拖慢工作进程。默认预算为 30 秒;提前完成的页面会立即返回,因此该限制只影响持续运行的页面。在慢速网络上,一个非常重的 React/Vue/Angular SPA 在触发数据请求之前可能需要更多时间来启动。可以通过 OBSCURA_SCRIPT_DEADLINE_MS(毫秒)提高预算,并在 CDP 客户端中设置相应的导航超时:
OBSCURA_SCRIPT_DEADLINE_MS=60000 obscura serve --port 9222
obscura serve
启动一个 CDP WebSocket 服务器。
| Flag | 默认值 | 描述 |
|---|---|---|
--port | 9222 | WebSocket 端口 |
--proxy | — | HTTP/SOCKS5 代理 URL |
--stealth | off | 启用反检测 + 追踪拦截 |
--workers | 1 | 并行工作进程数 |
--obey-robots | off | 遵守 robots.txt |
obscura fetch <URL>
获取并渲染单个页面。
| Flag | 默认值 | 描述 |
|---|---|---|
--dump | html | 输出类型:html、text、links、markdown、assets(页面引用的每个子资源 URL 以 NDJSON 格式输出),或 original(原始响应体) |
--eval | — | 要执行的 JavaScript 表达式 |
--wait-until | load | 等待条件:load、domcontentloaded、networkidle0 |
--timeout | 30 | 最大导航时间(秒) |
--selector | — | 等待的 CSS 选择器 |
--stealth | off | 反检测模式 |
--output | — | 将 dump 或 eval 输出写入文件 |
--quiet | off | 隐藏横幅信息 |
--proxy | — | 继承的全局 HTTP/SOCKS5 代理 URL |
obscura scrape <URL...>
使用工作进程并行抓取多个 URL。
| Flag | 默认值 | 描述 |
|---|---|---|
--concurrency | 10 | 并行工作进程数 |
--eval | — | 每个页面的 JS 表达式 |
--format | json | 输出格式:json 或 text |
--quiet | off | 在 stderr 上隐藏抓取进度 |
--proxy | — | 所有工作进程继承的全局 HTTP/SOCKS5 代理 URL |
MCP(模型上下文协议)
Obscura 内置一个 MCP 服务器,向 AI 代理(Claude Desktop、Cursor 等)暴露浏览器自动化工具。
启动
stdio(默认)——适用于 Claude Desktop 以及通过子进程启动的 MCP 客户端:
obscura mcp
HTTP ——适用于通过网络连接的客户端:
obscura mcp --http --port 8080
# 端点:http://127.0.0.1:8080/mcp
两种传输方式均可选的标志:
| Flag | 描述 |
|---|---|
--proxy <URL> | HTTP/SOCKS5 代理 |
--user-agent <UA> | 自定义 User-Agent 字符串 |
--stealth | 启用反检测模式 |
Claude Desktop 配置
{
"mcpServers": {
"obscura": {
"command": "obscura",
"args": ["mcp"]
}
}
}
工具
| 工具 | 描述 |
|---|---|
browser_navigate | 导航到指定 URL(url,可选的 waitUntil:load / domcontentloaded / networkidle0) |
browser_snapshot | 返回当前页面的 URL、标题和正文文本 |
browser_click | 通过 CSS 选择器点击元素 |
browser_fill | 设置输入值(触发 input 和 change 事件) |
browser_type | 向输入框追加文本 |
browser_press_key | 派发键盘事件(key,可选的 selector) |
browser_select_option | 按 value 或文本选择 <option> |
browser_evaluate | 执行 JavaScript 表达式并返回结果 |
browser_wait_for | 等待 CSS 选择器出现(selector,可选的 timeout,单位为秒) |
browser_network_requests | 列出当前页面发出的网络请求 |
browser_console_messages | 返回页面记录的 console 消息 |
browser_close | 关闭页面并重置浏览器状态 |
集成
- Hermes agent 插件:在 Obscura 上运行 Hermes 代理的浏览器任务。该插件在每个会话中启动
obscura serve(或连接到已运行的服务器),并通过 CDP 驱动它,支持可选的--stealth。
许可证
Apache 2.0
