web-fetch について
Web Fetchは、ヘッドレスChromeでウェブページを取得し、読みやすいテキストを抽出するPythonスキルです。JavaScript描画ページやリダイレクト、複数URLを扱うワークフロー向けで、外部APIは不要です。
主な機能
- 01ヘッドレスChromeでページを取得
- 02JavaScriptによる動的コンテンツの描画
- 03リダイレクトとSPAルーティングへの対応
- 041つのセッションで複数URLを処理
- 05テキストまたはJSONで出力
活用シーン
- 01JavaScriptを多用するページからテキストを抽出
- 02リダイレクトされるニュースリンクの解決
- 03分析用のURLをまとめて取得
- 04構造化した取得結果をファイルに保存
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ creminiai/ cremini-skills --skill web-fetchインストール後、Claude Code で/web-fetchを入力して読み込まれたか確認します。
同梱ファイルscripts/web_fetch.py
詳細
Web Fetch
**Chrome DevTools Protocol(CDP)**を介してヘッドレス Chrome インスタンスを操作し、JavaScript を完全にレンダリングして Web ページを取得します。JavaScript によるリダイレクト、SPA、動的コンテンツに対応し、あらゆる URL からテキストを抽出します。
前提条件
- Google Chrome または Chromium:システムにインストールされている必要があります。
- macOS:
brew install --cask google-chrome - Ubuntu/Debian:
sudo apt install google-chrome-stable - Windows:
winget install Google.Chrome
- macOS:
- Python 3:標準ライブラリのみを使用します。pip 依存関係はありません。必要に応じて、コンテンツ抽出の精度を高めるために
trafilaturaを使用できます。 - API キーやトークンは必要ありません。
使用方法
単一の URL
python <skill-path>/scripts/web_fetch.py --url "https://example.com/article"
複数の URL(Chrome セッションを共有して効率化)
python <skill-path>/scripts/web_fetch.py --url "https://example.com/a" --url "https://example.com/b"
パイプ入力(1 行につき 1 つの URL)
echo "https://example.com/article" | python <skill-path>/scripts/web_fetch.py
ファイルへの JSON 出力(複数の URL に推奨)
# Cross-platform temp dir
TMPDIR=$(python -c "import tempfile; print(tempfile.gettempdir())")
python <skill-path>/scripts/web_fetch.py --url "https://example.com" --format json -o "$TMPDIR/results.json"
オプション
| フラグ | デフォルト | 説明 |
|---|---|---|
--url | — | 取得する URL(複数指定可能) |
--format | text | 出力形式:text または json |
-o, --output | stdout | stdout の代わりにファイルへ書き込みます(大きな結果に推奨) |
--wait-ms | 1500 | JavaScript レンダリングの待機時間(ミリ秒) |
--timeout | 15 | URL ごとのタイムアウト(秒) |
--max-chars | 15000 | ページごとの最大文字数 |
--batch-size | 3 | バッチごとの URL 数(安定性のため、バッチ間で Chrome を再起動します) |
--port | auto | CDP デバッグポート(デフォルト:空いているポートを自動検出) |
出力
テキストモード(デフォルト)
各 URL のプレーンテキストコンテンツを --- で区切って出力します。
JSON モード
[
{
"url": "https://news.google.com/rss/articles/...",
"final_url": "https://www.theguardian.com/actual-article",
"success": true,
"content": "Article text content..."
}
]
失敗時:
[
{
"url": "https://example.com/broken",
"success": false,
"error": "Page load timeout"
}
]
仕組み
- Chrome を検出 — プラットフォーム固有のパスを確認し、次に PATH を検索します
- 分離された Chrome を起動 —
--headless=new --remote-debugging-port=PORT --user-data-dir=TMPDIR(起動中の Chrome と競合することはありません) - CDP 経由で操作 — 依存関係のない純粋な Python 製 CDP クライアントを使い、WebSocket 経由で接続します
- 移動して待機 —
Page.navigateを使用し、loadEventFiredを待ち受けた後、JavaScript のレンダリングを待ちます - コンテンツを取得 —
Runtime.evaluateで最終 URL を取得し、DOM.getOuterHTMLで DOM を抽出します - テキストを抽出 —
trafilatura(インストールされている場合)を使用し、ない場合は HTML タグを除去します - 後処理 — Chrome を終了し、一時プロファイルを削除します
主な利点
- プロファイルの競合なし — 分離された
--user-data-dirを使用し、起動中の Chrome と並行して動作します - JavaScript によるリダイレクトに対応 — Google News、URL 短縮サービス、SPA のルーティングも動作します
- 依存関係ゼロ — 純粋な Python 3 標準ライブラリを使用します(WebSocket クライアントを含む)
- 単一の Chrome セッション — 複数の URL で 1 つのインスタンスを再利用します(高速)
- クロスプラットフォーム — Mac、Windows、Linux
クロスプラットフォーム対応
| プラットフォーム | 確認する Chrome のパス |
|---|---|
| macOS | /Applications/Google Chrome.app/...、Chromium.app |
| Linux | /usr/bin/google-chrome、chromium、snap chromium |
| Windows | %ProgramFiles%\Google\Chrome\...、%LocalAppData%\... |
すべてのプラットフォームで、見つからない場合は PATH を検索します。
注意事項
- 設定は不要です — Chrome をインストールするだけで使用できます。「リモートデバッグ」を有効にしたり、Chrome の設定を変更したりする必要はありません。スクリプトがすべて自動的に処理します。
- macOS での初回起動 — 「アプリケーション Google Chrome に受信ネットワーク接続を許可しますか?」というポップアップが表示される場合があります。許可をクリックしてください。CDP はローカルポート(
127.0.0.1)を使用するためです。外部ネットワーク通信は発生しません。
コメント
Markdown 対応