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.webdriverundefined に設定されるため、自動化ブラウザとして検出されにくくなります。

トラッカーブロックは 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 の対応表で確認することをおすすめします。