AIエージェントにヘッドレスChromeを使い続けるほど、メモリとスタートアップの重さが気になってくる。
この記事では、Rust製オープンソースのヘッドレスブラウザ「Obscura」を紹介します。既存のPuppeteerやPlaywrightコードを書き換えなくても使え、メモリ使用量を85%削減できます。
この記事でわかること:
- ObscuraがHeadless Chromeより速い理由と具体的な数値
- Puppeteer/Playwright をそのまま接続する方法
- ステルスモードのアンチフィンガープリント機能の仕組み
- インストールから最初の動作確認までの手順
なぜ Headless Chrome では足りないのか
AIエージェントやスクレイピングのワークロードでは、ブラウザを並列で多数起動します。Headless Chrome は起動に約2秒かかり、1プロセスあたり 200MB 以上のメモリを消費します。25並列で動かせば、それだけで 5GB を超えます。加えて、Chromeのバイナリ自体が 300MB 以上あるため、コンテナイメージも膨らみます。
Obscura とは何か
https://github.com/h4ckf0r0day/obscura
Obscura は Rust で書かれたヘッドレスブラウザエンジンです。V8 でリアルな JavaScript を実行し、Chrome DevTools Protocol(CDP)を実装しています。2026年4月13日に公開され、v0.1.1 時点で GitHub スターは 7,000 超、ライセンスは Apache 2.0 です。
設計思想はシンプルで、「スケールでの自動化のために設計されており、デスクトップブラウジングのためではない」と README に明記されています。
主なスペックを Headless Chrome と比較します。
| 指標 | Obscura | Headless Chrome |
|---|---|---|
| メモリ | 30 MB | 200 MB 以上 |
| バイナリサイズ | 70 MB | 300 MB 以上 |
| ページ読み込み | 85 ms | 約 500 ms |
| 起動時間 | 即時 | 約 2 秒 |
| アンチ検出 | 内蔵 | なし |
ページ読み込みの実測値
README に記載されているベンチマーク結果では、静的 HTML で 51ms、JS + XHR + fetch を含む動的ページで 84ms、動的スクリプト込みで 78ms です。いずれも Chrome の 500〜800ms と比べ、6〜10 倍の差があります。
インストール:単一バイナリで完結
Chrome も Node.js も不要です。バイナリ 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
# 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
Windows は Releases ページから .zip をダウンロードして展開します。ソースからビルドする場合は Rust 1.75 以上が必要で、初回ビルドは V8 のコンパイルに約 5 分かかります。以降はキャッシュされるため、再ビルドは高速です。
基本的な使い方
obscura fetch でページを取得し、JavaScript を評価できます。
# ページタイトルを取得
obscura fetch https://example.com --eval "document.title"
# リンクを一覧表示
obscura fetch https://example.com --dump links
# 動的コンテンツを待機してから取得
obscura fetch https://example.com --wait-until networkidle0
複数 URL を並列でスクレイピングする場合は obscura scrape を使います。
obscura scrape url1 url2 url3 \
--concurrency 25 \
--eval "document.querySelector('h1').textContent" \
--format json
Puppeteer / Playwright との互換性
Obscura が CDP サーバーとして動くため、既存コードの書き換えは最小限で済みます。obscura serve を起動し、接続先のエンドポイントを切り替えるだけです。
obscura serve --port 9222
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');
Playwright の場合も同様です。
import { chromium } from 'playwright-core';
const browser = await chromium.connectOverCDP({
endpointURL: 'ws://127.0.0.1:9222',
});
フォーム送信やログインを伴うページにも対応しています。POST リクエスト後の 302 リダイレクトの追跡と Cookie の維持は Obscura が自動で処理します。
ステルスモードでアンチ検出を回避する
--stealth フラグを付けると、アンチフィンガープリントとトラッカーブロックが有効になります。
アンチフィンガープリントはセッションごとにランダム化されます。GPU・スクリーン・Canvas・Audio・バッテリーの各情報がランダム値に差し替えられ、navigator.userAgentData は実際の Chrome 145 に合わせた値を返します。navigator.webdriver は undefined に設定されるため、自動化ブラウザとして検出されにくくなります。
トラッカーブロックは 3,520 ドメインを対象とし、アナリティクス・広告・テレメトリ・フィンガープリントスクリプトをページ読み込みの段階でシャットアウトします。不要なリクエストが発生しないため、ページ読み込み速度のさらなる向上にも寄与します。
ステルスモードをビルドに含める場合は次のコマンドを使います。
cargo build --release --features stealth
ランタイムでは obscura serve --stealth または obscura fetch --stealth のフラグで有効化できます。
料金とライセンス
Obscura はオープンソースで Apache 2.0 ライセンスです。商用利用も無料で可能です。バイナリのダウンロードも無料で、利用回数や並列数の制限もありません。
Headless Chrome との使い分け
Playwright や Puppeteer はブラウザを操作するライブラリであり、ブラウザエンジン自体は別物です。Obscura はエンジン部分を Rust で再実装し、CDP の口だけを合わせることで互換性を実現しています。
既存の自動化コードをそのまま流用できるため、スクレイピング規模が小さい段階では Playwright + Chrome のままでも問題ありません。並列数が増えてメモリコストが課題になった時点で Obscura に切り替えると、コードの変更を最小限にしながら性能を改善できます。
v0.1.1 はまだ初期リリースです。現時点では PDF レンダリングや拡張機能のサポートはなく、一部の CDP ドメインは未実装です。本番投入の前に、使用しているすべての CDP メソッドが実装済みかどうかを README の対応表で確認することをおすすめします。