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 互換
  • インタプリタオーバーヘッドなしのネイティブ実行パフォーマンス
RUST
// 簡略化されたアーキテクチャ図(実際のコードは 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 事前コンパイル済みバイナリのダウンロード(推奨)

BASH
# 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 デプロイメント

BASH
docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura

イメージは distroless/cc ベースで、シェルなし、パッケージマネージャーなし、圧縮後わずか ~57MB。

4.3 ソースからのビルド

BASH
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 最初のコマンド

BASH
# ページタイトルを取得
./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 と組み合わせて使用

BASH
# CDP サーバーを起動
./obscura serve --port 9222
JAVASCRIPT
// 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 と組み合わせて使用

JAVASCRIPT
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 モデルから直接呼び出すことができます:

BASH
# MCP サーバーを起動
./obscura mcp --port 8080

次に、AI エージェント設定でこの MCP サーバーを登録します。AI モデルはブラウザ機能を直接呼び出すことができます:

  • fetch(url) - ページコンテンツを取得
  • screenshot(url) - スクリーンショットを撮影
  • evaluate(js) - JavaScript を実行
  • click(selector) - 要素をクリック
  • fill(selector, value) - フォームに入力

6. Web クローラー実践

6.1 並行スクレイピング

BASH
# 複数の 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 アンチディテクトモード

BASH
# アンチディテクト付きで 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 プロキシサポート

BASH
# 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 動的コンテンツの待機

BASH
# ネットワークアイドルを待機(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 プロジェクトもそれを基にしています。本番環境では、メモリ使用量を監視し、適切なタイムアウト時間を設定し、構造化ログを有効化することを推奨します。


参考リンク: