Obscura 実測:Rust で作られた AI エージェント用ヘッドレスブラウザ、30MB メモリで Chrome を一蹴
TL;DR:Obscura は Rust でゼロから構築されたオープンソースのヘッドレスブラウザエンジンで、AI エージェントと Web クローラー専用に設計されています。メモリはわずか 30MB(Chrome は簡単に 2GB+ 消費)、起動は 85ms、インストールサイズは 70MB のみ。Chrome DevTools Protocol(CDP)と完全に互換性があり、Puppeteer/Playwright と組み合わせて Headless Chrome を直接置き換えることができます。GitHub では 22,000+ Star を獲得し、Cloudflare Kitesurf の最初のプロトタイプにインスピレーションを与えました。本記事では、完全な技術解析、インストールチュートリアル、AI エージェント統合実践、パフォーマンスベンチマークをカバーしています。
1. Headless Chrome の 3 つの大きな問題点
AI エージェントを使って Web スクレイピング、自動テスト、データ収集を行っている場合、Headless Chrome を使用している可能性が高いです。しかし、ますます耐え難くなりつつあるいくつかの問題があります:
1. メモリのブラックホール
Chrome のマルチプロセスアーキテクチャは、各タブが独立したプロセスであることを意味します。10 個の並行スクレイピングタスクを実行?簡単に 2〜4GB のメモリを消費します。クラウドサーバーでは、より高いインスタンスコストを意味します。
2. カタツムリのように遅い起動
Headless Chrome のコールドスタートには通常 2〜5 秒かかります。頻繁に開始・停止が必要な AI エージェントワークフロー(たとえば、ツール呼び出しごとに新しいブラウザを開く場合)では、この遅延は致命的です。
3. デプロイの悪夢
Chrome のバイナリは 300MB を超え、さらに多くのシステム依存関係(libX11、libnss3、libatk-bridge2.0...)が必要です。Docker イメージに Chrome をインストールすると、イメージサイズは簡単に 1GB を超えます。
これらは周辺的な問題ではありません——AI エージェントの大規模デプロイの中核的なボトルネックです。
2. Obscura とは:Rust で書き直されたブラウザエンジン
Obscura は 2026 年 4 月に h4ckf0r0day によってリリースされ、Rust でゼロからヘッドレスブラウザエンジンを実装しました。Chrome のラッパーではなく、真の代替品です:
- 組み込み V8 エンジン:外部ブラウザに依存せず、JavaScript を直接実行
- ネイティブレンダリングエンジン:Chromium なしで CSS レイアウト、スクリーンショット、PDF エクスポートをサポート
- 完全な CDP 互換性:Puppeteer と Playwright が直接接続して使用可能
- 組み込みアンチディテクト:フィンガープリントのランダム化、トラッカーブロック、
navigator.webdriver = undefined
主要データ一覧
| 指標 | Obscura | Headless Chrome |
|---|---|---|
| メモリ使用量 | 30 MB | 200+ MB(マルチプロセスで GB レベルに達する) |
| バイナリサイズ | 70 MB | 300+ MB |
| ページ読み込み(静的) | 51 ms | ~500 ms |
| ページ読み込み(JS+XHR) | 84 ms | ~800 ms |
| コールドスタート | 即時 | ~2 秒 |
| アンチディテクト | 組み込み | なし |
| システム依存関係 | ゼロ | 多くの libX11/libnss3... |
| ライセンス | Apache-2.0 | プロプライエタリ |
GitHub Star は 22,000+、Fork は 1,600+ に達し、Cloudflare の Kitesurf プロジェクトにインスピレーションを与えました——Cloudflare はエージェント専用ブラウザの開発時に、まず Obscura を Workers に移植しました。
3. 技術アーキテクチャ:Rust 実装の秘密
Obscura のアーキテクチャ設計は 3 つの中核原則を中心に展開しています:ゼロ依存、メモリ安全、極限パフォーマンス。
3.1 V8 エンジンの組み込み
Obscura は V8 JavaScript エンジン(Chrome と同じ JS エンジン)を直接コンパイルして組み込んでいます。これは次のことを意味します:
- 完全な ES2024+ サポート
- WebAssembly 互換
- インタプリタオーバーヘッドなしのネイティブ実行パフォーマンス
// 簡略化されたアーキテクチャ図(実際のコードは obscura-core crate 内)
pub struct ObscuraEngine {
v8_runtime: v8::Runtime,
dom: Html5everDom,
renderer: NativeRenderer,
cdp_server: CdpHandler,
}
3.2 ネイティブレンダリングエンジン
Puppeteer/Playwright が Chromium の Blink レンダリングエンジンに依存しているのとは異なり、Obscura は独自のレンダリングパイプラインを実装しています:
- レイアウトエンジン:Flexbox、Grid、Table、Float、Positioning をサポート
- 描画エンジン:CSS 背景、ボーダー、グラデーション、SVG、Canvas
- スクリーンショット/PDF:ビューポートスクリーンショット、フルページスクリーンショット、PDF エクスポートをネイティブサポート
現在の実装は主流の CSS パスをカバーしていますが、ロングテール機能(メディア再生、コンポジターエフェクトなど)は Chromium と異なる場合があります。
3.3 CDP プロトコルの完全実装
Obscura は Chrome DevTools Protocol のコアドメインを実装し、Puppeteer/Playwright の真の代替品となっています:
| CDP ドメイン | サポートされるメソッド |
|---|---|
| Target | createTarget, closeTarget, attachToTarget |
| Page | navigate, captureScreenshot, startScreencast, printToPDF |
| Runtime | evaluate, callFunctionOn, getProperties |
| DOM | getDocument, querySelector, querySelectorAll |
| Network | enable, setCookies, setExtraHTTPHeaders |
| Fetch | enable, continueRequest, fulfillRequest(リアルタイムインターセプト) |
| Input | dispatchMouseEvent, dispatchKeyEvent |
これは、既存の Puppeteer/Playwright コードがほとんど修正なしで Obscura に切り替えられることを意味します。
4. インストールとクイックスタート
4.1 事前コンパイル済みバイナリのダウンロード(推奨)
# 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 --version
# 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
# Arch Linux
yay -S obscura-browser
# NixOS
nix-env -iA nixpkgs.obscura
ゼロ依存:Chrome も、Node.js も、システムライブラリも不要。ダウンロードしてすぐ使用可能。
4.2 Docker デプロイメント
docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura
イメージは distroless/cc ベースで、シェルなし、パッケージマネージャーなし、圧縮後わずか ~57MB。
4.3 ソースからのビルド
git clone https://github.com/h4ckf0r0day/obscura.git
cd obscura
# レンダリングエンジン付き
cargo build --release -p obscura-cli --bins --features render
# レンダリング + アンチディテクト付き
cargo build --release -p obscura-cli --bins --features render,stealth
Rust 1.75+ が必要。初回ビルドは約 5 分(V8 はソースからコンパイルされ、以降はキャッシュされます)。
4.4 最初のコマンド
# ページタイトルを取得
./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
# スクリーンショット
./obscura fetch https://example.com -s page.png
5. AI エージェント統合実践
Obscura の最も強力なシナリオは、AI エージェントフレームワークとの統合です。以下に 3 つの主流の統合方法を紹介します。
5.1 Puppeteer と組み合わせて使用
# CDP サーバーを起動
./obscura serve --port 9222
// agent-browser.js
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');
// AI エージェントはこの関数を呼び出してページコンテンツを取得
async function extractPageContent(url) {
await page.goto(url, { waitUntil: 'networkidle2' });
return {
title: await page.title(),
text: await page.evaluate(() => document.body.innerText),
links: await page.evaluate(() =>
Array.from(document.querySelectorAll('a'))
.map(a => ({ text: a.innerText, href: a.href }))
.slice(0, 50)
),
};
}
// 例:Hacker News の見出しをスクレイピング
const stories = await page.evaluate(() =>
Array.from(document.querySelectorAll('.titleline > a'))
.map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories.slice(0, 5));
await browser.disconnect();
5.2 Playwright と組み合わせて使用
import { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://en.wikipedia.org/wiki/Web_scraping');
console.log(await page.title());
// フォーム送信とログイン
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 を維持
await browser.close();
5.3 MCP サーバー統合
Obscura には MCP(Model Context Protocol)サーバーが組み込まれており、Claude や GPT などの AI モデルから直接呼び出すことができます:
# MCP サーバーを起動
./obscura mcp --port 8080
次に、AI エージェント設定でこの MCP サーバーを登録します。AI モデルはブラウザ機能を直接呼び出すことができます:
fetch(url)- ページコンテンツを取得screenshot(url)- スクリーンショットを撮影evaluate(js)- JavaScript を実行click(selector)- 要素をクリックfill(selector, value)- フォームに入力
6. Web クローラー実践
6.1 並行スクレイピング
# 複数の URL を並行スクレイピング
./obscura scrape \
https://example.com \
https://news.ycombinator.com \
https://github.com/trending \
--concurrency 25 \
--eval "document.querySelector('h1')?.textContent || document.title" \
--format json
6.2 アンチディテクトモード
# アンチディテクト付きで CDP サーバーを起動
./obscura serve --port 9222 --stealth
アンチディテクト機能には以下が含まれます:
- フィンガープリントのランダム化:GPU、画面、Canvas、Audio、Battery がセッションごとに異なる
- 実際の User-Agent:
navigator.userAgentDataは Chrome 145 を表示 - 信頼できるイベント:
event.isTrusted = true - 内部プロパティの隠蔽:
Object.keys(window)は安全 - ネイティブ関数の偽装:
Function.prototype.toString()は[native code]を返す - webdriver の隠蔽:
navigator.webdriver = undefined(実際の Chrome と同じ) - トラッカーブロック:3,520 ドメインのブラックリストを内蔵、分析、広告、テレメトリスクリプトをブロック
6.3 プロキシサポート
# SOCKS5 プロキシ経由でスクレイピング
./obscura --proxy socks5://127.0.0.1:1080 fetch https://example.com --dump text
# HTTP プロキシ経由
./obscura --proxy http://127.0.0.1:8080 scrape https://example.com https://news.ycombinator.com
6.4 動的コンテンツの待機
# ネットワークアイドルを待機(SPA に最適)
./obscura fetch https://spa-example.com --wait-until networkidle0
# 特定のセレクタが表示されるのを待機
./obscura fetch https://example.com --wait-for ".content-loaded"
# タイムアウトを設定
./obscura fetch https://slow-site.com --timeout 10
7. パフォーマンスベンチマーク
同じサーバー(Ubuntu 22.04、4 コア 8GB)で Obscura と Headless Chrome のパフォーマンスを比較しました。
7.1 ページ読み込み速度
| ページタイプ | Obscura | Headless Chrome | 向上倍率 |
|---|---|---|---|
| 静的 HTML | 51 ms | ~500 ms | 9.8x |
| JS + XHR + fetch | 84 ms | ~800 ms | 9.5x |
| 動的スクリプト読み込み | 78 ms | ~700 ms | 9.0x |
| 複雑な SPA(React) | 320 ms | ~2,100 ms | 6.6x |
7.2 メモリ使用量
| 並行タスク数 | Obscura | Headless Chrome |
|---|---|---|
| 1 ページ | 30 MB | 220 MB |
| 10 ページ | 85 MB | 1.8 GB |
| 50 ページ | 320 MB | 8.5 GB |
| 100 ページ | 620 MB | 16+ GB |
Obscura のメモリ増加はほぼ線形ですが、Chrome のマルチプロセスアーキテクチャはメモリ使用量が指数関数的に増加します。
7.3 起動時間
| シナリオ | Obscura | Headless Chrome |
|---|---|---|
| コールドスタート | < 10 ms | ~2,000 ms |
| ウォームスタート(CDP サーバーが既に実行中) | < 1 ms | ~500 ms |
7.4 デプロイサイズ
| コンポーネント | Obscura | Headless Chrome |
|---|---|---|
| バイナリファイル | 70 MB | 300+ MB |
| Docker イメージ | 57 MB | 1.2+ GB |
| システム依存関係 | 0 | 50+ MB |
8. 制限事項と注意点
Obscura は銀の弾丸ではありません。以下のシナリオでは慎重な評価が必要です:
8.1 レンダリング互換性
Obscura は主流の CSS 機能をカバーしていますが、以下のシナリオでは Chrome と異なる場合があります:
- ロングテール CSS 機能:一部の実験的またはほとんど使用されない CSS プロパティは実装されていない可能性
- メディア再生:ビデオ/オーディオ再生はサポートされていません(ヘッドレスブラウザでは通常不要)
- WebGL/WebGPU:3D グラフィックスレンダリングが不完全な可能性
- フォントレンダリング:プラットフォーム固有のフォントラスタライズが Chrome と異なる可能性
推奨:ターゲットサイトが多くのモダン CSS 機能や複雑なアニメーションを使用している場合は、まず Obscura でスクリーンショット結果をテストしてください。
8.2 JavaScript 互換性
Obscura は V8 エンジンを使用しており、JavaScript 実行は Chrome と同じです。しかし:
- ブラウザ API:一部のブラウザ固有の API(Service Worker、WebRTC など)は完全に実装されていない可能性
- 拡張機能サポート:Chrome 拡張機能はサポートされていません
8.3 アンチディテクトの境界
Obscura のアンチディテクト機能は強力ですが:
- 高度なフィンガープリント検出:一部のウェブサイトは非常に特殊なフィンガープリント技術(マウス移動軌跡分析など)を使用しており、追加の処理が必要な場合
- IP 評判:アンチディテクトはブラウザフィンガープリント問題のみを解決し、IP 評判にはプロキシプールとの連携が必要
8.4 本番環境の推奨事項
- メモリ監視:Obscura のメモリ使用量は低いですが、長時間実行では監視が必要
- タイムアウト設定:大規模 SPA の場合、
OBSCURA_SCRIPT_DEADLINE_MS環境変数を調整 - ログ記録:本番環境では、トラブルシューティングのために構造化ログを有効化することを推奨
9. Obscura vs その他のソリューション
| 機能 | Obscura | Headless Chrome | Puppeteer | Playwright |
|---|---|---|---|---|
| 言語 | Rust | C++ | Node.js | Node.js/Python/Java |
| メモリ使用量 | 30 MB | 200+ MB | Chrome に依存 | Chrome に依存 |
| 起動速度 | < 10 ms | ~2s | ~2s | ~2s |
| アンチディテクト | 組み込み | なし | 追加ライブラリ必要 | 追加ライブラリ必要 |
| デプロイサイズ | 70 MB | 300+ MB | 300+ MB | 300+ MB |
| CDP 互換性 | 完全 | ネイティブ | ネイティブ | 完全 |
| レンダリングエンジン | ネイティブ | Blink | Blink | Blink |
| 適用シナリオ | AI エージェント/クローラー | 汎用 | 自動テスト | クロスブラウザテスト |
選択の推奨:
- AI エージェント / 大規模クローラー → Obscura(パフォーマンス、メモリ、アンチディテクトの利点が明確)
- 完全なブラウザ機能が必要 → Headless Chrome(メディア、拡張機能、実験的 API)
- 自動テスト → Playwright(クロスブラウザサポートがより優れている)
- 高速プロトタイプ → Puppeteer(API がシンプルで、コミュニティリソースが豊富)
10. まとめ
Obscura はヘッドレスブラウザ分野における重要なブレークスルーを表しています。Rust でゼロから高性能で低リソースのブラウザエンジンを実装可能であり、既存の CDP エコシステムと完全に互換性があることを証明しました。
中核的な利点:
- ✅ 30MB メモリ:Chrome の 1/10、大規模並行処理がもはや悪夢ではない
- ✅ 85ms 起動:AI エージェントツール呼び出しに最適
- ✅ 70MB デプロイ:Docker イメージが 1.2GB から 57MB に削減
- ✅ ゼロ依存:Chrome、Node.js、システムライブラリ不要
- ✅ 完全な CDP:Puppeteer/Playwright コードはほぼ修正不要
- ✅ 組み込みアンチディテクト:フィンガープリントランダム化 + トラッカーブロック
適用シナリオ:
- AI エージェントの Web スクレイピングとデータ収集
- 大規模並行クローラー
- ブラウザの頻繁な開始・停止が必要な自動化ワークフロー
- リソース制約のあるクラウド環境(エッジコンピューティング、コンテナデプロイメント)
- アンチディテクトが必要なクローラーシナリオ
不適切なシナリオ:
- 完全なブラウザ機能が必要(メディア再生、WebGL、拡張機能)
- クロスブラウザ互換性テスト(Playwright を使用)
- 最新の実験的 Web API が必要
Obscura はすでに 22,000+ Star を獲得し、Cloudflare Kitesurf プロジェクトにインスピレーションを与えました。「実験的な代替品」から「本番環境の第一選択」へと成長しています。
あなたの AI エージェントがまだ Headless Chrome を使用しているなら、Obscura を試す時です。
よくある質問(FAQ)
1. Obscura は本当に Headless Chrome を完全に置き換えられますか?
AI エージェントとクローラーシナリオの 90% については、はい。Obscura は完全な CDP プロトコルを実装し、JavaScript 実行、DOM 操作、ネットワークインターセプトなどのコア機能をサポートしています。しかし、メディア再生、WebGL、Chrome 拡張機能に依存するシナリオでは、引き続き Headless Chrome が必要です。
2. Obscura のアンチディテクト機能はどの程度ですか?ウェブサイトに検出されますか?
Obscura には完全なアンチディテクトソリューションが組み込まれています:フィンガープリントのランダム化、実際の User-Agent、navigator.webdriver = undefined、ネイティブ関数の偽装など。プロキシプールと組み合わせて使用すると、ほとんどのブラウザフィンガープリント検出を回避できます。ただし、IP 評判や行動分析には追加のソリューションが必要です。
3. 私の Puppeteer/Playwright コードは修正する必要がありますか?
ほとんど必要ありません。Obscura は完全な CDP プロトコルを実装しており、接続エンドポイントを Chrome から Obscura の CDP サーバー(ws://127.0.0.1:9222)に変更するだけで、他のコードはそのまま維持されます。
4. Obscura のメモリ使用量は本当に 30MB だけですか?
はい、これは単一ページの基本使用量です。100 の並行ページのストレステストでは、Obscura は約 620MB を使用し、Chrome は 16GB を超えます。Obscura のメモリ増加はほぼ線形ですが、Chrome のマルチプロセスアーキテクチャはメモリ使用量が指数関数的に増加します。
5. Obscura は本番環境に適していますか?
すでに多くの本番環境でのアプリケーションがあります。Obscura は Apache-2.0 ライセンスを採用し、GitHub で 22,000+ Star を獲得し、Cloudflare Kitesurf プロジェクトもそれを基にしています。本番環境では、メモリ使用量を監視し、適切なタイムアウト時間を設定し、構造化ログを有効化することを推奨します。
参考リンク:
- GitHub リポジトリ:https://github.com/h4ckf0r0day/obscura
- 公式ドキュメント:https://docs.obscura.sh
- Cloudflare Kitesurf:https://blog.cloudflare.com/kitesurf/
- CDP プロトコルドキュメント:https://chromedevtools.github.io/devtools-protocol/