WEBCLAW について
WEBCLAWは、AIエージェントやRAGパイプライン向けのウェブ抽出ツールです。CLI、MCPサーバー、REST API、SDKを備え、ページをMarkdown、JSON、LLM向けの内容に整形でき、セルフホストにも対応します。
主な機能
- 01ページをMarkdownまたはJSONで抽出
- 02CSSセレクターとXPathによる選択
- 03ページの表やリンクを抽出
- 04テキストや類似要素を検索
- 05ページのクロールと分割
- 06質問に基づくページ内容の絞り込み
活用シーン
- 01エージェント向けのウェブページ情報収集
- 02商品情報や表データの抽出
- 03RAGインデックス用のページ分割
MCP 対応
ClaudeやCursorなどの互換クライアント向けにMCPサーバーを提供し、スクレイピング、選択、クロールのツールを公開します。
詳細
英語 | 簡体字中国語
webclaw
ウェブサイトを、整った Markdown、JSON、LLM 対応のコンテキストに変換します。
AI エージェントや RAG パイプライン向けの CLI、MCP サーバー、REST API、SDK。
ほとんどのウェブスクレイピングツールは、エージェントに次のどちらかの質の悪い出力を返します。
- ブロックされたページ、ログイン画面、または空のアプリシェル
- ナビゲーション、スクリプト、スタイル、広告、重複した定型コンテンツであふれた生の HTML
webclaw.io は、webclaw のホスト型ウェブ抽出 API です。このリポジトリには、オープンソースの CLI、MCP サーバー、抽出エンジン、セルフホスト可能なサーバーが含まれています。
webclaw は URL を、ツールが実際に活用できる整ったコンテンツに変換します。
webclaw https://example.com --format markdown
# Example Domain
This domain is for use in illustrative examples in documents.
You may use this domain in literature without prior coordination or asking for permission.
ターミナルから利用する、MCP 経由で Claude/Cursor に接続する、アプリからホスト型 API を呼び出す、または OSS サーバーをセルフホストできます。
インストール
エージェントのセットアップ
webclaw を Claude Code、Claude Desktop、Cursor、Windsurf、OpenCode、Codex CLI、その他の MCP 対応ツールに接続する最も簡単な方法です。
npx create-webclaw
インストーラーが対応クライアントを検出し、MCP サーバーを自動で設定します。
Homebrew
brew tap 0xMassi/webclaw
brew install webclaw
ビルド済みバイナリ
GitHub Releases から macOS、Linux、Windows 用のバイナリをダウンロードできます。
Windows(x64)
ビルド済み ZIP を使うのが最も簡単なインストール方法で、Rust は不要です。
v0.6.22 リリースページから
webclaw-v0.6.22-x86_64-pc-windows-msvc.zip をダウンロードします。エクスプローラーで展開し、
webclaw.exe がある展開先フォルダーで PowerShell を開いて、次を実行します。
.\webclaw.exe --version
.\webclaw.exe https://example.com --format markdown
PowerShell では、現在のディレクトリにあるプログラムを実行する際に .\ を付ける必要があります。
他のフォルダーから webclaw を実行したい場合に限り、そのディレクトリをユーザー PATH に追加してください。
Windows で Visual C++ ランタイム DLL が見つからないと表示された場合は、
Microsoft Visual C++ Redistributable for x64 をインストールしてください。ZIP には x64 バイナリが含まれています。
Windows ARM64 はネイティブインストールの確認対象ではありません。
Windows でソースからビルドするには、x86_64-pc-windows-msvc
ツールチェーンを含む Rust、C++ によるデスクトップ開発と
Windows SDK を含む Visual Studio Build Tools、Git、CMake 3.22 以降、LLVM(libclang.dll を含む)、および
NASM をインストールしてください。インストール後、新しい Developer PowerShell for Visual Studio を開きます。
CMake と NASM が PATH にあることを確認してください。bindgen が libclang.dll を見つけられない場合は、
次の例のように LIBCLANG_PATH を LLVM の bin ディレクトリに設定します。
$env:LIBCLANG_PATH = "C:\Program Files\LLVM\bin"
cargo install --git https://github.com/0xMassi/webclaw.git --tag v0.6.22 --locked webclaw-cli
webclaw --version
Cargo パッケージは webclaw-cli、実行ファイルは webclaw です。これらのパッケージは crates.io ではなく、Git からインストールされます。ソースからの初回ビルドには数分かかることがあります。Windows CI ワークフローでは、ビルドツールがプリインストールされたホステッドランナーで Git インストールと公開済み ZIP を確認します。クリーンな PC の環境を再現するものではありません。macOS 上の Docker を含む Linux コンテナーでは、Windows のサポートを検証できません。
Docker
docker run --rm ghcr.io/0xmassi/webclaw https://example.com
Cargo
cargo install --git https://github.com/0xMassi/webclaw.git --tag v0.6.22 --locked webclaw-cli
cargo install --git https://github.com/0xMassi/webclaw.git --tag v0.6.22 --locked webclaw-mcp
ネイティブビルドツールがないためにソースからのビルドに失敗する場合は、プラットフォームの前提条件をインストールしてください。
| OS | コマンド |
|---|---|
| Debian / Ubuntu | sudo apt install -y pkg-config libssl-dev cmake clang git build-essential |
| Fedora / RHEL | sudo dnf install -y pkg-config openssl-devel cmake clang git make gcc |
| Arch | sudo pacman -S pkg-config openssl cmake clang git base-devel |
| macOS | xcode-select --install |
Python
python/ ディレクトリでは、webclaw バイナリをバンドルした Python パッケージをビルドし、Python から呼び出します。API キーも Python の依存関係も不要で、scrape、select、tables、find_text、similar、crawl、map、screenshot を利用できます。
cd python && uv build --wheel && pip install dist/webclaw_cli-*.whl
import webclaw_cli as wc
md = wc.scrape("https://example.com", "llm")
titles = wc.select("https://books.toscrape.com", css="h3 a::attr(title)")
for page in wc.crawl("https://quotes.toscrape.com", max_pages=10):
print(page["url"])
各関数とオプションについては、python/README.md を参照してください。
クイックスタート
1 ページをスクレイピングする
webclaw https://stripe.com --format markdown
LLM に最適化されたテキストを返す
webclaw https://docs.anthropic.com --format llm
メインコンテンツのみを残す
webclaw https://example.com/blog/post --only-main-content
セレクターを指定または除外する
webclaw https://example.com \
--include "article, main, .content" \
--exclude "nav, footer, .sidebar, .ad"
CSS セレクターまたは XPath で値を取得する
webclaw https://books.toscrape.com --select "h3 a::attr(href)"
webclaw https://books.toscrape.com --select "article.product_pod" \
--field "title=h3 a::attr(title)" --field price=.price_color
--select は、セレクターに一致する内容を JSON 配列として出力します。各要素のテキスト、またはセレクターが ::attr(NAME) や ::html で終わる場合は属性値または要素の HTML が出力されます。href と src のリンクは絶対 URL で返されます。--field NAME=SELECTOR を指定すると、各一致要素の内部でフィールドが実行され、それぞれのフィールドの最初の値または null を持つ JSON オブジェクトが各一致要素に対して作成されます。JavaScript が必要なページは、抽出時と同様に、最初にレンダリングされます。
webclaw https://books.toscrape.com --xpath "//li[@class='next']/a/@href"
webclaw https://books.toscrape.com --xpath "//article[@class='product_pod']" \
--field "title=.//h3/a/@title" --field "price=.//p[@class='price_color']"
--xpath を指定すると、同じ解析済みページに対して XPath 1.0 式を使用します。要素とテキストノードの場合はテキスト、属性の場合はその値が返され、count() や string() 形式の式の場合は単一の値が返されます。--xpath を使う場合、各 --field は一致要素を基準に評価される式であり、通常は . で始まります。MCP の select ツールでは、selector の代わりに xpath を指定します。
データテーブルを JSON として取得する
webclaw "https://en.wikipedia.org/wiki/List_of_S%26P_500_companies" --tables
--tables は、ページのデータテーブルを JSON 配列として出力します。各テーブルには、caption(ある場合)、headers、およびセルのテキストを含む rows が含まれます。複数の行または列にまたがるセルは、それぞれのセルに同じテキストが繰り返されるため、各行の値は列ごとに 1 つずつになります。複数段のヘッダー行は、Population / % of world のように、列ごとに / で連結されます。MCP の select ツールでは、セレクターの代わりに tables: true を指定します。
ヘッダー行は、<thead> の行と、先頭にある <th> のみで構成される行です。テーブル全体にまたがる 1 つのセルだけからなる先頭行は、キャプションになります。次のテーブルは、ページレイアウトとして扱われ、除外されます。
role="presentation"またはrole="none"が指定されたテーブル。- テキストを含む列が 2 列未満のテーブル。
- ヘッダー行がなく、本文行が 1 行だけのテーブル、別のテーブルを内包するテーブル、リンクのみを含むテーブル、または複数のセルからなる行に段落、リスト、その他のブロックを含むテーブル。
hidden、インラインの display:none、または <template> で非表示になっているテキストは除外されます。スタイルシートによって非表示になっているテキストは、ページにスタイルが適用されないため、保持されます。セルのテキストは先頭から 64 KB まで保持され、非常に大きなテーブルは途中で切り詰められ、"truncated": true が付加されます。ページ内のテーブルが 64 MB に達すると、それ以降のテーブルは除外されます。
テキストで要素を検索する、または例と類似するすべての要素を取得する
webclaw https://books.toscrape.com --find-text "tipping the"
webclaw https://books.toscrape.com --find-regex '^£5\d\.\d\d$'
webclaw https://books.toscrape.com --find-text "Tipping the Velvet" --similar
--find-text は、ページ本文内で表示テキストに指定した文字列を含む要素を、大文字と小文字を区別せずに検索し、{"selector", "text"} オブジェクトとして出力します。一致する要素は、そのテキストを含む最も深い要素です。そのため、インラインタグで分割されたテキストも一致します。selector は、一意の ID を持つ最も近い祖先から、またはルートからの要素のパスです。このパスはその要素だけを選択しますが、そのような ID がなく、ページのネストが 64 レベルを超える場合は、最後の 64 ステップのみが保持されるため、複数の要素が選択されることがあります。--exact はテキスト全体を照合し、--case-sensitive は大文字と小文字を区別します。また、--find-regex には正規表現を指定します。
--similar は、--find-text、--find-regex、--select、または --xpath が最初に選択した要素を例として使用し、リスト、グリッド、テーブル内の他の項目など、ページ内でそれに類似するすべての要素を、それらすべてを選択する 1 つの CSS セレクターとともに返します。例のセレクターが ::attr(NAME) または ::text で終わる場合、あるいは XPath がテキストノードまたは属性ノードを選択する場合は、それを含む要素が例になります。
{
"selector": "article.product_pod > h3 > a",
"matches": [
{ "selector": "html > body > ... > li:nth-of-type(1) > article > h3 > a", "text": "A Light in the ..." },
...
]
}
セレクターを --select で再利用するか、--field を追加すると、レコードをすぐに取得できます。--similar を使う場合、フィールドは CSS で指定し、出力は {"selector", "records"} になります。フィールドが項目内にある場合は、その項目自体を例として選択してください(たとえば --select "article.product_pod" --similar)。MCP の select ツールでも、同じ方法で text または regex(exact と case_sensitive を指定可能)と similar を指定できます。1 回の呼び出しで使用できるピッカーは 1 つです。--select、--xpath、--tables、--find-text、または --find-regex(MCP では selector、xpath、tables、text、または regex)を指定してください。テーブルには --similar と --field は適用されません。
質問への回答に必要な部分だけを取得する
webclaw "https://en.wikipedia.org/wiki/Rust_(programming_language)" -f llm \
--query "Who began the language as a personal project?"
--query(MCP の scrape ツールでは query)は、質問との関連度に基づいて各段落、リスト、テーブル、コードブロックを評価し、見出しの下に最も関連性の高いものを残します。そのため、エージェントはページ全体ではなく、回答を読み取れます。質問と単語が一致するブロックがない場合、ページは変更されずに返されます。
検索用チャンク
webclaw https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html --chunk 256
webclaw https://quotes.toscrape.com --crawl --depth 1 --chunk 512 --chunk-overlap 50
--chunk は、検索インデックスや RAG パイプライン向けにページをチャンク単位で出力します。1 行につき 1 つの JSON オブジェクトが出力されます(-f json の場合は 1 つの JSON 配列)。各チャンクには、url、index、heading_path(チャンクの先頭位置で有効な見出しを、最上位から順に記録)、tokens、チャンクの Markdown text が含まれます。チャンクは段落、リスト、表、コードブロックを丸ごと含めて構成され、指定されたトークン数をおおむね下回るようにします。1 つのチャンクに収まらないブロックは、まず改行位置で、次に文末で、それでも収まらない場合は単語間で分割し、文字間に空白のないテキストは文字間で分割します。コードブロックは各分割片で再び開き、表ではヘッダー行が繰り返されます。トークン数はトークナイザーを使わずに推定しています。本文、ドキュメント、コード、表、9 言語を含むベンチマークページでは、10 個中 9 個のチャンクで、cl100k の実測値は推定値の 0.77~1.12 倍、o200k では 0.72~0.97 倍でした。cl100k のトークン数では 4.5%、o200k では 0.5%のチャンクが指定サイズを超えました。--chunk-overlap は、各チャンクの末尾から指定トークン数までを、次のチャンクの先頭で繰り返します。複数の URL を指定した場合や --crawl を使った場合も、各ページは個別にチャンク化されます。MCP の scrape ツールは chunk と chunk_overlap を受け取り、チャンクを JSON 配列として返します。crawl もこれらを受け取り、クロール件数、取得に失敗したページ、チャンクを含むオブジェクトを返します。
番号付き引用としてのリンク
webclaw https://en.wikipedia.org/wiki/Web_scraping --citations
--citations は、すべてのリンクと画像の URL を Markdown から取り除き、末尾の番号付きリストに Markdown の脚注形式でまとめます。[Data scraping](https://...) は Data scraping[^1] に、画像は ![alt][^2] になり、ページの末尾には ## Links と URL ごとの [^1]: https://... が追加されます。番号は URL が初めて現れる順に付けられ、同じ URL が複数回使われている場合は最初の番号が維持されます。番号付き脚注がページにすでにある場合は、その続きから番号を付けます。複数の URL を指定した場合や --crawl を使った場合は、まとめて出力されるページ間で番号が連続するため、出力全体で 1 つの番号が 1 つの URL を表します。--output-dir、-f json、jsonl の場合は、ページごとに番号が付けられます。
そのまま残る要素もあります。コードブロックとインラインコード、参照形式のリンク([text][id])、自動リンク(<https://...>)、生の HTML リンクです。同じページ内の位置へのリンク(#section)と javascript: リンクは、テキストを残して URL を削除します。引用形式にした画像は、Markdown レンダラーでは画像として表示されなくなります(GitHub では ![alt] がテキストとして表示されます)。画像の URL はリストに記載されます。-f markdown では、ページの ## Structured Data ブロックはリストの後に続きます。
ライブで取得したベンチマークページ 63 件では、リストより前の本文のトークン数はプレーンな Markdown の約半分になり、リストを含む出力全体ではトークン数が合計で 10.7%減りました。この削減の大半は、Wikipedia の記事のようなリンクの多いページによるものです。最も削減効果の大きかった 5 ページが削減量全体の 68%を占め、ページごとの削減率の中央値は 2.5%で、63 ページ中 18 ページではわずかに長くなりました。主要な事実は、この機能の使用前後で変わりませんでした。短く安定した ID でソースを引用したり、テキストから URL を取り除いたりする場合に使ってください。一般的なトークン削減手段としては使わないでください。
1 つの URL、複数の URL、--crawl のいずれでも、-f markdown と -f json および jsonl 内の Markdown に対応しています。--chunk とは併用できません。また、ページの Markdown を出力しないモード(-f text、llm、html、--select、--map、--brand、--diff-with、--watch、LLM モードなど)では拒否されます。MCP の scrape、crawl、batch ツールは citations: true を受け取り、webclaw_core::to_citations(または、ページ間で番号を連続させる to_citations_after)は、任意の Markdown に同じ処理を行います。
取得したページを再利用する
webclaw https://example.com --cache # fetch once, answer later runs from disk
--cache を指定すると、成功したすべてのページが ~/.cache/webclaw(または WEBCLAW_CACHE_DIR)に保存されます。保存先を読み取れるのは自分だけです。同じ URL を同じブラウザープロファイルとヘッダーで後から取得すると、ネットワークリクエストを行わず、そこから応答します。クロールやバッチ処理ではページごとにキャッシュを使用します。エントリーは期限切れにならないため、更新するにはディレクトリを削除してください。エラーレスポンス、チャレンジページ、Set-Cookie ヘッダーは保存されません。キャッシュに保存されるのは HTTP レスポンスのみです。JavaScript が必要なページは引き続きブラウザーでレンダリングされ、ブラウザーはスクリプトをネットワーク経由で読み込みます。
Web アーカイブを保存する
webclaw https://example.com --warc page.warc.gz
webclaw https://docs.example.com --crawl --depth 2 --warc site.warc.gz > site.md
--warc FILE を指定すると、webclaw が取得するすべての HTTP レスポンスと、それを要求したリクエストが、WARC ファイルに保存されます。WARC は ISO 28500 の Web アーカイブ形式であり、Web アーカイブや再生ツールで読み取れます。出力は通常の出力先に保存され、アーカイブはその隣に書き込まれます。.gz で終わる名前を指定すると、.warc.gz ファイルと同様に、各レコードが個別に gzip 圧縮されます。単一の URL、複数の URL、--crawl(robots.txt とリダイレクトのレスポンスを含む)、--map(試行したサイトマップを含む)で使用できます。レコードは到着順に書き込まれるため、クロールを途中で停止しても、取得済みのページはすべて保存されます。すでに存在するファイルには追記され、上書きはされません。実行ごとに独自の warcinfo レコードが作成され、複数回の実行からなる WARC ファイルも有効な WARC ファイルです。実行中に書き込みが停止し、レコードの途中で終わっているファイルは、切断後に追加されたレコードが読み取れなくなるため拒否されます。その場合は、--warc に新しいファイルを指定してください。各レコードには、コンテンツの SHA-1 ダイジェストが含まれます。
レスポンスは、webclaw の HTTP クライアントが受け取った状態のまま保存されますが、これはデコード済みです。つまり、圧縮された本文は展開された状態で保存され、Content-Encoding、Content-Length、Transfer-Encoding ヘッダーは含まれません。また、HTTP/2 のレスポンスは HTTP/1.1 のステータス行になります。各実行の warcinfo レコードにはこのことが記載され、すべてのレコードがそのレコードを参照します。このようなレコードは再生ツールで問題なく読み取れますが、ペイロードのダイジェストはデコード済みの本文を対象にするため、別のアーカイバーが同じページを圧縮されたまま保存したコピーとは、重複排除の際に一致しません。リクエストレコードには、webclaw が送信したヘッダーが記録され、-H と --cookie の値も含まれるため、これらの値と同様にファイルを安全に保管してください。実行中にサイトが設定した Cookie は記録されません。リダイレクトごとに、リダイレクトレスポンスを含む独自のレスポンスレコードとリクエストレコードが作成されます。これはクロール中かどうかを問いません。渡した Cookie と認証情報は、--warc を指定しない場合と同様に、別のサイトには送信されません。ブラウザーでレンダリングされたページは含まれないため、--warc は --render always、--actions、--scroll と併用できません。--render auto の場合は、後からレンダリングされるページの HTTP レスポンスが保存されます。また、ネットワークにアクセスしない --cache と --cloud も併用できません。レンダリング済みのページを保存するには、--save-mhtml を使用してください。
JavaScript ページをレンダリングする
browser 機能(cargo build --release --features browser)を有効にしてビルドすると、通常の HTTP レスポンスにまだコンテンツがない場合、webclaw はローカルの Chrome でページをレンダリングします。
webclaw https://hn.algolia.com # --render auto: HTTP first, Chrome only when needed
webclaw https://example.com --render always --wait-for "#app li"
webclaw https://example.com --cdp-url ws://localhost:9222/devtools/browser/<id> # use a running browser
auto は、ページがスクリプトを読み込み、HTTP レスポンスにテキストがほとんどない場合、または空のアプリルートや「JavaScript を有効にしてください」という通知のほかにテキストがほとんどない場合にレンダリングします。レンダリング結果は、より多くのコンテンツがある場合にのみ保持されます。
webclaw が起動するブラウザーは、通常の Chrome として動作します。すべてのページ、フレーム、ワーカーは、ヘッドレス Chrome が追加する「Headless」のない、Chrome 独自の User-Agent を送受信するため、Chrome が送信するクライアントヒントと一致します。サイトによっては、ヘッドレスブラウザーにエラーや事前レンダリング済みのページを配信することがあります。--cdp-url で接続するブラウザーは、独自の User-Agent を使用します。
webclaw が起動するブラウザーで、レンダリングされたページがアクセスできるもの:
- ページ、そのフレーム、またはワーカーからの HTTP リクエストは、リダイレクトも含め、プライベートアドレス、ループバックアドレス、リンクローカルアドレスには到達しません。
- これらのアドレスへの WebSocket 接続は拒否されますが、先に TCP 接続が確立されます。プロキシ経由の場合、ループバック以外への WebSocket 接続はプロキシを経由するため、安全性はプロキシ次第です。
- 投機的なプリフェッチとプリコネクトは無効です。
- WebRTC は UDP を送信しませんが、TCP 経由の TURN サーバーはローカルポートへの接続を確立する可能性があります。
- プロキシを使わない場合、ページのドキュメントがプライベートアドレスから取得された場合はレンダリングに失敗するため、DNS リバインディングによってローカルコンテンツが返されることはありません。ただし、リクエスト自体は送信され、ポップアップはチェックされません。
プロキシ経由の場合、プロキシが自らホスト名を解決し、ドキュメントのチェックは無効になるため、HTTP の安全性もプロキシ次第です。サービスワーカーはテストされません。--cdp-url で接続するブラウザーはページごとにチェックされ、ほかのタブには影響しませんが、webclaw がそこでレンダリングするページのフレーム、ワーカー、WebSocket、WebRTC、投機的プリフェッチは対象外です。
--block images,fonts,media は、ページをコンテンツ用にレンダリングする際に、指定したリソースを読み込みません。多くのアプリは CSS をオンデマンドで取得し、読み込まないと動作しなくなるため、スタイルシートは常に読み込まれます。スクリプトと、それらが取得するデータは引き続き読み込まれるため、ほとんどのページではテキストがすべて表示され、ダウンロード量を約 40%削減できます。フォントや画像の読み込み後(document.fonts.load()、FontFace.load()、画像の onload または decode() 経由)に一部のテキストを表示するページでは、それらをブロックするとそのテキストが表示されません。テストした実際のサイトでは該当するページは見つかりませんでしたが、ご自身のページで --block の有無を比較してください。webclaw はテキストが確定するとそれ以上待機しないため、レンダリングはあまり速くなりません。そのため、指定がない限りブロックは無効です。スクリーンショットと PDF では常にすべてのリソースが読み込まれます。MCP の scrape ツールと crawl ツールでも、同じリストを block として指定できます。
--screenshot page.png はレンダリングされたページの 1280x720 のビューポートを保存し、--full-page はページ全体を保存します。また、名前の拡張子が .jpg の場合は JPEG になります。MCP の screenshot ツールは、同じ画像をエージェントに返します。
--save-pdf page.pdf(または標準出力には -)は、ブラウザーの印刷エンジンを通じてレンダリングされたページを PDF に出力します。サイトの印刷スタイルと Chrome のデフォルトの余白を適用し、ブラウザーによって追加されるアクセシビリティタグは付けずに、すべてのページを出力します。--paper a4 はデフォルトの US Letter を変更し、--landscape は用紙を横向きにし、--print-background は背景色と画像を保持し、--scale 0.8 はコンテンツを拡大縮小します(0.1~2)。ほかのレンダリングと同様に --wait-for、--actions、--scroll を指定でき、読み込みと印刷は --timeout の時間内に完了する必要があります。Chrome は印刷用にページ全体をレイアウトするため、1 ページにまとめたウェブ標準の全文のような非常に長いページを印刷する際、Chrome が数 GB のメモリを使用することがあります。このフラグが --pdf ではないのは、--pdf-mode が取得した PDF の読み取りに関するもので、PDF の作成には使わないためです。MCP の screenshot ツールは、format: "pdf" を指定すると同じ PDF を最大 10 MiB の application/pdf リソースとして返し、同様に paper、print_background、actions を受け取ります。
--save-mhtml page.mhtml(または標準出力には -)は、レンダリングされたページを MHTML として保存します。これは「ページを保存」の「単一ファイル」と同じ、1 ファイルのウェブアーカイブです。スクリプトの実行後のページと、読み込まれた画像、スタイル、フレームが保存されます。Chrome はスクリプトを実行せずにオフラインで開きます。ほかのレンダリングと同様に --wait-for、--actions、--scroll を指定できます。スクロールして初めて読み込まれる画像は、先に読み込まれていない限りファイルに含まれないため、そのようなページでは --scroll を追加してください。Chrome はファイルを一度にまとめて渡すため、書き込み中はファイル全体がメモリに保持されます。1 ページの HTML 規格の 18.6 MB のアーカイブでは、同じページのスクリーンショットより約 100 MB 多くメモリを使用しました。MCP の screenshot ツールは、format: "mhtml" を指定すると同じファイルを最大 10 MiB の multipart/related リソースとして返します。
--solve は、「Just a moment...」や「Performing security verification」と表示される Cloudflare のチャレンジページを突破します。ページがそのようなページとして返された場合、webclaw は Chrome で開き、チャレンジが解消されるまで待ち、クリックを求められたらチェックボックスをクリックして、その先のページを読み込みます。すべて --timeout の範囲内で行います。タイムアウトの4分の3が経過してもチャレンジが残っている場合、コマンドはその内容をエラーとして失敗します。クロールやバッチで同じサイトの後続ページを読み込む際は、通常の HTTP に戻り、Chrome が取得したクリアランス Cookie(cf_clearance のみで、サイトのほかの Cookie は一切含みません)と Chrome の User-Agent を使います。試したサイトの約半数では、Cloudflare が同じ IP アドレスからのアクセスを受け入れ、受け入れられない場合は webclaw が再度チャレンジを解決します。サインアップフォームなど、webclaw がレンダリングするページ内の Turnstile チェックボックスもクリックするため、そのページでのアクションによってフォームを送信できます。通常はレンダリングされないページで使う場合は、--render always を追加してください。webclaw はそのようなウィジェットのトークンを最大10秒間待ち、その後ページをそのまま読み込みます。クリアランスは Chrome の User-Agent と組み合わせて使うため、--solve には --browser chrome(デフォルト)、chrome-macos、または edge が必要です。-H で渡したヘッダーはページのほかのリクエストには引き続き適用されますが、ドキュメントのリクエストには適用されません。ドキュメントのリクエストを書き換えるとチャレンジに失敗するためです。--cdp-url で接続するブラウザーは、独自の User-Agent を維持します。MCP の scrape ツールでは、solve: true を指定します。
webclaw https://www.scrapingcourse.com/cloudflare-challenge --solve
webclaw https://gitlab.com/users/sign_in https://gitlab.com/explore --solve # solves once, then plain HTTP
クロール、バッチ、--watch、MCP サーバーは、同じ方法でレンダリングし、1つのブラウザーを共有します。ブラウザーはページで必要になったときにのみ起動します。webclaw はサイトごとに回数を記録します。少なくとも3回のレンダリングでレンダリングによるコンテンツの追加が確認されると(5回中4回以上)、スクリプトを実行するそのサイトのすべてのページをレンダリングします。レンダリングによるコンテンツの追加がなくなると(5回中1回以下)、そのサイトではレンダリングを停止します。
読み込む前にクリック、入力、スクロールする
browser ビルドでは、--actions を指定すると、ページの読み込み後、webclaw がページを読み取る前にブラウザーで手順を実行します。ホスト型 API の actions と同じ形式なので、無限スクロール、「さらに読み込む」ボタン、ページネーションボタン、フォーム、読み込みの遅いスクリプトの背後にあるコンテンツも出力に含まれます。--scroll だけを指定すると、ページの成長が止まるまで、最大20回末尾までスクロールします(回数を増やすには --scroll=50 を指定します)。
webclaw https://quotes.toscrape.com/scroll --scroll
webclaw https://github.com/topics/rust --actions '[{"type": "click", "selector": "button.ajax-pagination-btn", "repeat": 3}]'
webclaw https://quotes.toscrape.com/login --actions '[{"type": "type", "selector": "#username", "value": "me"}, {"type": "type", "selector": "#password", "value": "secret"}, {"type": "press", "key": "Enter"}]'
webclaw https://example.com --actions @steps.json
| 手順 | フィールド | 動作 |
|---|---|---|
click | selector、および nth、all または repeat | 最初に一致した要素、インデックス nth(0から始まります)の要素、またはすべての一致要素をクリックします。repeat を指定すると、一致する要素がなくなるか、連続する2回のクリックで変化がなくなるまで、最初に表示されている一致要素を指定回数を上限として繰り返しクリックします |
type | selector、value | 要素にフォーカスし、値を入力します |
press | key | Enter、Tab、ArrowDown などのキーを押します |
scroll | direction(down または up)、amount、selector、repeat(いずれも省略可能) | ページまたは要素を amount ピクセル分スクロールします。amount を省略すると末尾までスクロールします。repeat を指定すると、連続する2回のスクロールで何も追加されなくなるまで再びスクロールします。amount を指定した場合は末尾まで段階的にスクロールし、その途中で遅延読み込み画像を読み込みます |
wait | milliseconds | 一時停止します |
waitForSelector | selector、timeout | 要素が一致するまで待機します。最大待機時間は timeout ミリ秒で、既定値は10秒です |
executeJavascript | code | JavaScript を実行します。式、最後の文が値を返す文、または return を含む関数本体を指定でき、どこでも await を使用できます。得られた値は、Promise の場合は解決を待ってから、JSON として js_results に保持されます。後続の手順で同じトップレベルの let、const、または class 宣言を繰り返すことはできますが、種類を変えることはできません(let m の後に const m とすると失敗します)。また、ページ独自のスクリプトが宣言する名前を再利用することもできません |
クリック、キーの押下、スクロールの後、webclaw は次の手順に進む前に、ページとサイト独自のリクエストが落ち着くまで最大5秒待機します。リクエストの完了後、サイトがタイマーで描画するコンテンツはその後に表示されることがあります。その場合は、waitForSelector の手順を追加してください。要素を必要とする手順は、その要素が見つかるまで最大10秒待機します。ブラウザーが解析できないセレクターはすぐに失敗します。手順によって表示されたアラート、確認ダイアログ、プロンプトは閉じられ、手順によって開かれたタブやウィンドウも閉じられます。ページの読み込み時間とは別に、手順には --timeout と同じ時間が割り当てられます。最初に失敗するか時間切れになった手順があるとコマンド全体が失敗し、エラーにはその手順名が示されます。repeat が完了前に時間切れになった場合も、ページの一部を返すのではなく失敗します。長いフィードには --timeout を使用してください。すべての executeJavascript 手順の値を合計した上限は1 MiBです。手順はページ独自のスクリプトと同じチェックのもと、同じブラウザーで実行されます。プライベートアドレスやループバックアドレス、またはそれらに解決される名前へ移動する手順があると、コマンドは失敗します。
--actions は URL を1つ受け取り、--render auto を指定していてもページをレンダリングします。js_results は -f json または -f jsonl の場合は出力に含まれ、それ以外の場合は標準エラー出力に出力されます。また、--raw-html は手順の実行後のページを出力します。MCP の scrape ツールと screenshot ツールは、actions と同じリストを受け取り、コンテンツの後に js_results を返します。ローカル版では、click に nth、all、repeat を追加でき、scroll に selector、repeat、末尾までのスクロールを追加できます。ホスト版の screenshot 手順は省略されています。これは --screenshot がその機能を担うためです。
実行間でログイン状態を維持する
browser ビルドでは、--browser-profile DIR によってブラウザーの Cookie、ローカルストレージ、IndexedDB が DIR に保存されるため、一度ログインすれば次回の実行でもログイン状態が維持されます。
webclaw https://quotes.toscrape.com/login --browser-profile ~/.webclaw-profile \
--actions '[{"type": "type", "selector": "#username", "value": "me"}, {"type": "type", "selector": "#password", "value": "secret"}, {"type": "click", "selector": "input[type=submit]"}]'
webclaw https://quotes.toscrape.com/ --browser-profile ~/.webclaw-profile # a later run, still logged in
webclaw https://example.com/account --browser-profile ~/.webclaw-profile --cookie "session=..." # or bring a session cookie in once
プロファイルを指定すると、クロールやバッチ処理の場合も含め、webclaw が読み取るすべてのウェブページは、まずウェブページを PDF、フィード、その他のファイルと判別するための通常の HTTP リクエストを行った後、プロファイルの Cookie を使ってブラウザーで読み込まれます。PDF、フィード、その他のファイルは引き続き HTTP で処理されます。そのため、すべてのページがブラウザーで読み込まれます。当社のベンチマークでは、50 ページのクロールに、プロファイルなしでは 3.6 秒、新規プロファイルでは 12.4 秒、使用済みプロファイルでは 8.0 秒かかりました。--raw-html は、ブラウザーがページを表示した状態の HTML を出力します。ブラウザーでページの読み込みに失敗した場合、webclaw は警告を出し、HTTP の結果をそのまま使用します。使用中、拒否(下記参照)、または設定を読み取れないなどの理由でプロファイルを開けない場合、クロールを含め、最初のページを処理する前にエラーで実行を停止します。MCP ツールもそのエラーを返します。クロール中にブラウザーがリダイレクトに遭遇した場合は、HTTP と同様に、そのリダイレクト先をたどる前に robots.txt とクロールの対象範囲を確認します。
セッション Cookie も保持されます。Chrome は、プロファイルを保持している場合でも終了時にセッション Cookie を破棄しますが、ほとんどのサイトではセッション Cookie にログイン状態を保持します。すべてのページで、プロファイルの Cookie が共有されます。--cookie と --cookie-file の Cookie は、ページでブラウザーが必要ない場合も含め、実行開始時に、コマンドライン上(または --urls-file 内)で指定された URL のプロファイルに保存されます。プロファイルを指定した場合、ブラウザーが送信するのはプロファイル固有の Cookie のみです。MCP の scrape ツールは、指定された URL に対して cookies をプロファイルに保存し、以降の呼び出しでも保持します。デフォルトのまま --browser-profile を指定しない場合、実行のたびに空のプロファイルから開始します。また、Cookie を使ってレンダリングされるページにはそれぞれ独自のブラウザーコンテキストが割り当てられるため、ページ間や実行間で状態は引き継がれません。
webclaw は、ディレクトリが存在しない場合は作成し、Unix では自分だけが読み取れるようにして、専用のディレクトリとして管理します。空ではなく、webclaw が作成したものでもないディレクトリ(普段の閲覧に使う Chrome のプロファイルなど)は拒否されます。また、シンボリックリンクや、Unix で他のユーザーが書き込み可能なディレクトリも拒否されます。実行のたびに、前回の実行で開いたままになっていたタブと、サイトが登録したサービスワーカーを削除し、プロファイルの設定でプリフェッチを無効にします。その他の設定は保持されます。プロファイルにはログイン情報が含まれるため、パスワードと同じように取り扱ってください。レンダリングされたページがアクセスできる対象に関する上記のチェックは、プロファイルを使う場合にも適用されます。
1 つのプロファイルを同時に使用できる webclaw は 1 つだけです。使用中のプロファイルで 2 つ目の実行を開始すると、二重に開いて破損させる代わりに、使用中のプロセスを示すエラーを出して停止します。Ctrl-C または SIGTERM で webclaw を停止すると、先にブラウザーが閉じます。kill -9 の後は、エラーに表示された Chrome を停止してください。--browser-profile と --cdp-url は併用できません。MCP サーバーでは、ディレクトリを WEBCLAW_BROWSER_PROFILE で指定します。
当社のベンチマークでは、ページをレンダリングする実行にかかる時間は、使用済みプロファイルで 1.7 秒、新規プロファイルで 2.1 秒でした。6 回実行した後のプロファイルのディスク使用量は約 9 MB でした。
ページが読み込む JSON を取得する
シングルページアプリはデータを JSON として取得し、それをもとにページを構築します。browser ビルドで --capture-network を指定すると、ページをレンダリングし、ページの代わりに読み込んだレスポンスを JSON 配列として出力します。これにより、サイト独自の API が返したとおりの JSON を取得できます。
webclaw https://quotes.toscrape.com/scroll --capture-network # every XHR and fetch response
webclaw https://github.com/rust-lang/cargo --capture-network=latest-commit
webclaw https://quotes.toscrape.com/scroll --scroll --capture-network=/api/quotes
webclaw https://example.com --capture-network --capture-types all # documents, scripts, images too
各レスポンスには、url、method、status、resource_type、mime_type、ページが設定した request_headers、およびテキスト形式のレスポンス(JSON、HTML、JavaScript、XML、プレーンテキスト)の body が含まれます。バイナリ形式の本文は除外されます。パターンは URL が一致する必要のある正規表現で、等号の後に記述します。--capture-types で別の種類を指定しない限り、xhr と fetch のレスポンスのみが保持されます。種類はブラウザーのリソースタイプをカンマ区切りで指定するか、all を指定します。保持されるレスポンスは最大 100 件で、各本文は 1 MB、本文全体では 5 MB までに切り詰められます。切り詰められた本文には truncated が設定されます。
--capture-credentials を指定しない限り、認証情報を示す名前(Authorization、API キー、トークン、セッション、署名など)のリクエストヘッダーは除外され、access_token や key など、そのような名前の URL クエリパラメーターは REDACTED として読み取られます。Cookie はページがリクエストを送信した後にブラウザーによって追加されるため、含まれることはありません。レスポンス本文はサイトが送信したまま保持されるため、サイトが JSON で返したトークンは出力に残ります。共有する内容を確認してください。
キャプチャを行うレンダリングでは、保持対象となるリクエストが実行中ではなくなり、1 秒間新たに開始されない状態になるまで待機してからレスポンスを読み取ります。ただし、待機時間は --timeout の 3 分の 1 が上限です。それより後にページが開始したリクエストは取得されません。その場合は --wait-for または wait ステップで取得できます。--actions または --scroll を指定した場合は、先にそのステップが実行され、それによって発生したレスポンスもキャプチャされます。レンダリングに失敗した場合やタイムアウトした場合、コマンドは失敗し、レスポンスは出力されません。
キャプチャできるのは、ブラウザーによる読み込みが許可されたものだけです。上記のアドレスチェックまたは --block によって停止されたリクエストにはレスポンスがなく、プライベートアドレスからのレスポンスも除外されます。クロスサイトフレームや専用ワーカーが独自に行うリクエストはキャプチャされません。ページがデータを HTML 内に含めて配信する場合、API は呼び出されないためキャプチャするものはありません。ページ自体を読み取るか、--capture-types document を指定してそのドキュメントを保持してください。MCP の scrape ツールでは、capture_network、capture_types、capture_credentials と同じオプションを使用できます。モデルのコンテキストに収めるため、各本文は 100 KB、本文全体では 1 MB までに切り詰められます。レスポンスはコンテンツの後に返されるか、format: "json" の場合は network の下に返されます。
ドキュメントサイトをクロールする
webclaw https://docs.rust-lang.org --crawl --depth 2 --max-pages 50
--delay(デフォルトは 100 ms)は、同じホストへの 2 回のページリクエスト間に置く最短時間です。すべての --concurrency ワーカーで共有されるため、並行数を増やしても、1 つのサイトに対するページリクエストが --delay ごとに 1 回を超えて開始されることはありません。最初のページは、robots.txt とサイトマップへのリクエスト後、--delay の時間を待ちます。robots.txt を尊重する場合、リダイレクトの各ホップもリクエストとして数えられます。一方、--ignore-robots を指定すると、リダイレクトは 1 回のフェッチ内でたどられ、ホップごとの間隔は設けられません。--delay 0 を指定すると、リクエスト間隔の制御が無効になります。クローラーはサイトの robots.txt に従い、許可されていない URL をスキップし、Crawl-delay が --delay より長い場合は、--delay の代わりにその値を使用します。これを無効にするには --ignore-robots を指定します。robots.txt を尊重する場合、各リダイレクトは、たどる前に robots.txt とクロール範囲に照らして確認されます。また、末尾にスラッシュを追加した場合やスキームを変更した場合に同じページへリダイレクトされると、そのページは除外されずに 1 回取得されます。http:// と https:// のどちらを使う場合も、末尾のスラッシュの有無にかかわらず、同じパスは 1 ページとして数えられます。また、開始 URL と同じホストでスキームが異なるリンクは、開始 URL のスキームでクロールされます。
長時間のクロールでは、ページを JSON Lines 形式でストリーム出力し、クラッシュや強制終了後に中断したところから再開できるよう、クロールのチェックポイントを保存します。チェックポイントには、サイトへの前回のリクエスト時刻が記録されません。そのため、すぐに再起動すると、前回の実行での最後のリクエストから --delay が経過する前に、最初のリクエストが送信される場合があります。
webclaw https://docs.rust-lang.org --crawl --max-pages 0 -f jsonl --crawl-state crawl.json >> pages.jsonl
クロールに質問を指定すると、レベルごとではなく、回答につながる可能性が最も高いリンクから取得します。
webclaw https://docs.python.org/3/ --crawl --depth 4 --max-pages 25 \
--query "How do I sort a list of dictionaries by a key?"
各リンクは、リンクテキスト、URL パス、リンク周辺の段落やリスト項目に含まれる質問の単語と、リンク元ページがどの程度質問に答えているかに基づいてスコア付けされます。多くのページに共通する単語の重みは低くなります。各ページでは、質問への回答に該当する部分だけを残し、0 から 1 の relevance を付与します。出力では一致度の高いページから順に表示されます(-f jsonl を指定した場合は、クロール順にストリーム出力されます)。--max-pages がページ数の上限です。同じ --query を指定して --crawl-state から再開すると、順序が維持されます。MCP の crawl ツールでも、最大 1,000 文字の同じ query を指定できます。
--stop-when-answered を追加すると、回答が見つかったと判断された時点で、ページ数の上限に達する前にクロールを終了します。評価が 0.8 以上のページが取得され、その後に取得した 8 ページの評価がそれを上回らない場合、新しいページの取得を開始しません。すでに処理中のページは最後まで取得します。このルールの調整に使った 60 件の質問でのベンチマークでは、50 ページを上限とした場合、平均取得ページ数は 50 ページではなく 32 ページでした。保留データの 48 件の質問では 39 ページでしたが、完全なクロールで見つかった回答を 1 件見逃しました。質問に含まれるすべての単語がページ内にありながら、質問への回答ではないページが先に 1.0 と評価されたためです。この保留データも、ルールの選定時に参照されていました。ルール確定後に作成した、別の 4 サイトに関する 48 件の質問では、完全なクロールで見つかった 40 件の回答をすべて保持し、取得ページ数は 50 ページではなく 44 ページでした。約 10%の削減です。この 48 件のクロールのうち、ページが 0.8 と評価されたのは 10 件だけでした。そのため、ほとんどのサイトでは削減効果は小さいと考えてください。ページが 0.8 と評価されないクロールは上限まで続き、他の言語での質問は 0.8 に達することがほとんどありません。MCP の crawl ツールでは、query とともに stop_when_answered: true を指定できます。また、webclaw-fetch の CrawlConfig::stop_when_answered でも同じ設定ができます。
スコア付けは単語の一致に基づくため、英語の質問で最も効果を発揮します。他の言語での質問では、該当ページを見つけるまでに時間がかかります(ベンチマークの日本語、フランス語、スペイン語、中国語の質問では、16 件中 3 件が 10 ページ目までに見つかり、中央値は 18 ページでした。一方、重みの調整に使っていないサイトでの英語の質問では、48 件中 33 件が見つかり、中央値は 6 ページでした)。質問の単語は、先頭から異なる 32 語までが対象です。
サイトの URL を一覧表示する
webclaw https://docs.python.org/3/ --map
webclaw https://docs.python.org/3/ --map --map-source sitemap,cc --path-prefix /3/library \
--query "cancel an asyncio task" --map-limit 20
--map はサイトの URL を抽出せずに一覧表示します。1 行に 1 件ずつ表示するか、-f json を指定すると JSON 配列で出力します。サイトの robots.txt に記載されたサイトマップ(または一般的なサイトマップのパス)を読み込み、URL が 200 件未満の場合は短時間のクロールで見つかったリンクを追加します(--map-pages、無効にするには --no-map-crawl)。各ページは 1 回だけ一覧に表示されます。http と https、www.、末尾のスラッシュ、フラグメント、トラッキングパラメーター(utm_*、ref、fbclid、gclid)だけが異なる URL は同一として扱われます。--crawl では、ページの www. 付き URL とホスト名のみの URL は別々に扱われます。
--map-source sitemap,cc を指定すると、公開されている Common Crawl インデックスにも、そのサイトの最新クロールで取得されたページを問い合わせます。これにより、サイトマップに記載されておらず、数ページのクロールでは見つからないページも見つけられます。--map-source cc はインデックスのみを問い合わせます。サイト自身のホスト(www. の有無を問わず)上にあり、HTML を返したステータス 200 のページのみが保持され、トラッキングパラメーターは除去されます。リダイレクト、エラー、その他のファイルも保持するには --map-all-captures を指定します。サイトマップからすでに --map-limit 件の URL が得られていて、--query が指定されていない場合、インデックスには問い合わせません。
インデックスは無料の共有サービスのため、webclaw は一度に 1 件ずつ、1 秒間隔でリクエストを送信し、混雑を示す応答には 2 回まで再試行し、検索全体に 2 分の制限時間を設けています。通常は 10〜60 秒かかり、ときどき停止します。応答が止まると、webclaw は警告を表示して、それまでに見つかった URL を一覧表示します。URL が 1 件も見つからなかった場合に限り、処理は失敗します。次の点にご注意ください。
- インデックスの検索結果は最大 10 ページ(約 150,000 件のキャプチャ)まで読み込みます。インデックスは URL 順に並べられているため、大規模なサイトではサンプルではなく、アルファベット順の一部分が対象となり、
--queryによる順位付けもその範囲内で行われます。 - 1 回のクロールですべてのページが取得されるわけではありません。小規模なサイトでも、最新のコレクションに含まれるキャプチャが数十件しかない場合があり、存在がわかっているページが見つからないこともあります。
--path-prefix、--include-paths、--exclude-paths はクロールと同じように一覧を絞り込み、フォールバックのクロールもその範囲内でページを巡回します。--query を指定すると、パスに含まれる単語との一致度が高い URL を先に一覧表示します。サイト内のパスの多くで使われていない単語ほど重み付けされ、検索語の先頭部分だけが一致する長い単語よりも、単語全体が一致するものを優先します(auto.html は、検索語 auto に対して autovacuum.html より先に表示されます)。ページは読み込まないため、URL 名からトピックがわかる場合にのみ役立ちます。たとえば、「cancel an asyncio task」と検索すると、docs.python.org の URL の中で asyncio-task.html が最初に表示されます。--map-limit は、順位付けの後に先頭から N 件に絞り込みます。MCP の map ツールでは、source、limit、query を指定できます。
ベンチマーク対象の 10 サイト(ドキュメント、ニュース、ショップ、ブログ。うち半数にはサイトマップがありません)では、--map-source sitemap,cc により、サイト自身のホスト上の URL が 44,122 件見つかりました。通常の --map では 17,026 件でした。また、サンプルの 96% がステータス 200 の HTML を返しました。それでも、測定した日には 10 サイト中 4 サイトでインデックスの問い合わせに失敗しました。ベンチマークをご覧ください。
ワークフローの例
- HTML から RAG 用 Markdown への変換
- Firecrawl 互換 API
- MCP ウェブスクレイピング
- ColdProxy を使ったプロキシ経由のクロール
- Cloudflare の診断
ブランドアセットを抽出する
webclaw https://github.com --brand
ページを時系列で比較する
webclaw https://example.com/pricing --format json > pricing-old.json
webclaw https://example.com/pricing --diff-with pricing-old.json
MCP サーバー
webclaw には、AI エージェント向けの MCP サーバーが付属しています。
インストール不要です。任意の MCP クライアントから npx ランチャーを指定してください。
{
"mcpServers": {
"webclaw": {
"command": "npx",
"args": ["-y", "@webclaw/mcp"]
}
}
}
または、npx create-webclaw を実行すると、AI ツールを自動検出し、その設定を書き込みます。
HTTP 経由
複数のエージェントで1つのサーバーを共有したり、別のマシンからアクセスしたりするには、ストリーミング可能な HTTP 経由でサーバーを提供します。
WEBCLAW_MCP_TOKEN=$(openssl rand -hex 16) webclaw-mcp --http 127.0.0.1:8000
クライアントは http://127.0.0.1:8000/mcp に接続し、Authorization: Bearer <token> を送信します。
{
"mcpServers": {
"webclaw": {
"type": "http",
"url": "http://127.0.0.1:8000/mcp",
"headers": { "Authorization": "Bearer <token>" }
}
}
}
HTTP 経由では、トークンなしでサーバーを起動できません。サーバーに到達できる人は誰でも、マシンに任意の URL を取得させることができるためです。--no-auth を指定すると、認証なしで公開されます。ループバックアドレスでは、Host ヘッダーに別のホスト名が指定されているリクエストも拒否し、Web ページからの DNS リバインディング攻撃を防ぎます。
続いて、エージェントに次のようなことを依頼できます。
Scrape these competitor pricing pages and summarize the differences.
Crawl this documentation site and prepare clean context for a RAG index.
Extract the brand colors, fonts, and logos from this company website.
エージェントスキルとして使う
1つのコマンドで、webclaw を Claude Code、Cursor、Windsurf、その他の MCP エージェントに追加できます。
npx skills add 0xMassi/webclaw-skill
エージェントは、スクレイプ、クロール、マップ、抽出、要約、差分、ブランド、検索をネイティブツールとして利用できます。ほとんどのサイトは、API キーなしでローカルに抽出できます。ボット対策や JavaScript でレンダリングされるページに対応するには、WEBCLAW_API_KEY を設定します。
skills.sh で確認できます。
ツール
| ツール | 機能 | ローカル |
|---|---|---|
scrape | 1つの URL を Markdown、テキスト、JSON、LLM 形式、または HTML として抽出します | はい |
select | CSS セレクターや XPath、ページのデータテーブル、テキストから見つかった要素、または例のようなすべての要素を使って、ページから値やレコードを JSON として選択します | はい |
screenshot | ページのビューポートまたはページ全体を PNG または JPEG としてキャプチャしたり、PDF に出力したり、1つの MHTML ファイルとして保存したりします | はい。browser ビルドが必要です |
crawl | 同一オリジンのリンクをたどって、見つかったページを抽出します。query を指定すると、関連性の高い順に表示します | はい |
map | すべてのページを抽出することなく、サイトマップ、短いクロール、Common Crawl インデックスから URL を検出します | はい |
batch | 複数の URL を並列でスクレイプします | はい |
extract | ページのコンテンツを構造化データに変換します | はい。ローカル LLM または設定済みの LLM が必要です |
summarize | ページを要約します | はい。ローカル LLM または設定済みの LLM が必要です |
diff | ページコンテンツのスナップショットを比較します | はい |
brand | 色、フォント、ロゴ、メタデータを抽出します | はい |
search | Web を検索して結果をスクレイプします | ホステッド API |
research | 複数のソースを対象とする調査ワークフローです | ホステッド API |
SDK
npm install @webclaw/sdk
pip install webclaw
go get github.com/0xMassi/webclaw-go
TypeScript
import { Webclaw } from "@webclaw/sdk";
const client = new Webclaw({ apiKey: process.env.WEBCLAW_API_KEY! });
const page = await client.scrape({
url: "https://example.com",
formats: ["markdown"],
only_main_content: true,
});
console.log(page.markdown);
Python
from webclaw import Webclaw
client = Webclaw(api_key="wc_your_key")
page = client.scrape(
"https://example.com",
formats=["markdown"],
only_main_content=True,
)
print(page.markdown)
cURL
curl -X POST https://api.webclaw.io/v1/scrape \
-H "Authorization: Bearer $WEBCLAW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com",
"formats": ["markdown"],
"only_main_content": true
}'
出力形式
| 形式 | 用途 |
|---|---|
markdown | 構造を保った、整形済みのページコンテンツ |
llm | エージェントや RAG パイプライン向けの簡潔なコンテキスト |
text | 書式設定を最小限に抑えたプレーンテキスト |
json | 構造化されたメタデータ、リンク、画像、抽出フィールド |
html | カスタム処理向けにクリーニングされた HTML |
ローカル優先、必要に応じてホステッド
CLI と MCP サーバーは、基本的な抽出処理であればアカウントなしでローカルに動作します。
次のような場合は、webclaw.io のホステッド API を利用してください。
- インフラを管理せずに、保護されたサイトへアクセスする
- JavaScript をレンダリングする
- 非同期のクロールや調査のジョブを実行する
- Web 検索を行う
- ウォッチ機能や本番環境での利用状況追跡を使う
- アプリケーションコード向けの SDK を使う
export WEBCLAW_API_KEY=wc_your_key
webclaw https://example.com --cloud
構築できるもの
| ユースケース | 例 |
|---|---|
| AI エージェントの Web アクセス | Claude、Cursor、または他の MCP クライアントに、整形されたページのコンテキストを提供する |
| RAG の取り込み | ドキュメント、ヘルプセンター、ブログ、ナレッジベースをクロールする |
| 競合モニタリング | 価格ページ、変更履歴、ドキュメント、製品ページを追跡する |
| 構造化抽出 | 雑然としたページを、自動化に使える型付き JSON に変換する |
| 調査ワークフロー | 複数のソースを検索、スクレイプ、要約し、引用する |
| ブランドインテリジェンス | ロゴ、色、フォント、ソーシャルメタデータを抽出する |
アーキテクチャ
webclaw/
crates/
webclaw-core HTML to markdown, text, JSON, and LLM-ready output
webclaw-fetch Fetching, crawling, batching, and mapping
webclaw-llm Local and hosted LLM provider support
webclaw-pdf PDF text extraction
webclaw-mcp MCP server for AI agents
webclaw-cli Command-line interface
webclaw-core は抽出ロジックのみを担うコンポーネントです。ネットワーク I/O を行わず、表面積が小さく、フェッチ層とは独立して使用できます。
設定
| 変数 | 説明 |
|---|---|
WEBCLAW_API_KEY | ホスト型 API キー |
OLLAMA_HOST | ローカル LLM 機能用の Ollama URL |
OPENAI_API_KEY | OpenAI 互換 LLM プロバイダーのキー |
OPENAI_BASE_URL | OpenAI 互換のベース URL |
ANTHROPIC_API_KEY | Anthropic 互換 LLM プロバイダーのキー |
ANTHROPIC_BASE_URL | Anthropic 互換のベース URL |
ORCAROUTER_API_KEY | OrcaRouter LLM プロバイダーのキー |
ORCAROUTER_BASE_URL | OrcaRouter のベース URL(デフォルトは https://api.orcarouter.ai/v1) |
WEBCLAW_PROXY | 単一のプロキシ URL |
WEBCLAW_PROXY_FILE | プロキシプールのファイル |
WEBCLAW_RENDER | MCP サーバーのレンダリング:auto(デフォルト)、always または never。browser ビルドが必要です |
WEBCLAW_CDP_URL | Chrome を起動する代わりに、この DevTools エンドポイントのブラウザーで MCP サーバーをレンダリングします |
WEBCLAW_BROWSER_PROFILE | MCP サーバーは、実行のたびにブラウザーの Cookie とストレージをこのディレクトリに保持します。--browser-profile を参照してください |
WEBCLAW_CHROME | レンダリング用に起動する Chrome の実行ファイル |
WEBCLAW_MCP_TOKEN | webclaw-mcp --http がすべてのクライアントに要求するベアラートークン |
コントリビューション
現在、特に役立つコントリビューションは、実用的で小規模なものです。
- 実際のエージェントや RAG のワークフロー向けの例を追加する
- SDK のコードスニペットを改善する
- 抽出結果が不十分なページを報告する
- 複雑な HTML の失敗を再現するフィクスチャを追加する
- MCP クライアントとローカル環境の設定に関するドキュメントを改善する
- より多くの Linux/macOS 環境で CLI をテストする
最初に取り組むのにおすすめの項目:
ページの抽出結果が不十分な場合は、次の情報を添えてください。
URL:
Command or API request:
Expected output:
Actual output:
Format used: markdown / llm / text / json / html
CLI, MCP, SDK, or API:
投稿する前に、ログからシークレット、Cookie、プライベートトークン、顧客データを削除してください。
戦略的パートナー
|
| SerpApi、ウェブ検索 API。 SerpApi を利用して、AI エージェントにリアルタイムデータを提供し、構造化された検索エンジンの結果で応答を強化しましょう。 SerpApi は戦略的パートナーとして webclaw を支援しています。 |
インフラストラクチャパートナー
|
ColdProxy はインフラストラクチャパートナーとして webclaw を支援し、195 以上の国で、住宅用 IPv4、住宅用 IPv6、データセンター向け IPv6 のプロキシインフラストラクチャを提供しています。公開データの収集、地域別テスト、モニタリング、ウェブスクレイピングのワークフローにご利用いただけます。
ウェブサイトで
ColdProxyの最新プランと利用可能なオファーをご確認ください。
初回のお支払いにコード webclaw8Off を使用すると、8% 割引になります。
ColdProxy を webclaw に組み込む手順については、
プロキシを使用したクロールガイドをご覧ください。
|
Studio Partners
|
NodeMaven:Webスクレイピングと自動化に最適な、業界最高品質のIPを提供する最も効率的なプロキシプロバイダーです。
Webclawユーザー向け特別コード:
|
|
MangoProxyは、200以上のロケーションでレジデンシャル、ISP、データセンター、モバイルプロキシを提供しています。9,000万以上のIPプールを備え、HTTPとSOCKS5に対応し、大規模なウェブスクレイピングやデータ収集に適した高い安定性を実現しています。
mangoproxy.comでコード0XMASSIを使用すると、ISP(静的)プロキシが8%割引になります。
|
|
Thordata:開発者向けのプレミアムなレジデンシャルプロキシです。クリーンなレジデンシャルIPと安定したプロキシインフラストラクチャで、信頼性の高いクローラー、AI エージェント、自動化ワークフローを構築できます。
Webclaw特別オファー:3日間の無料トライアル
|
Community Plugins
webclawをAIエージェントプラットフォームと連携するサードパーティ製プラグイン:
| Plugin | Platform | What it does |
|---|---|---|
| openclaw-webclaw | OpenClaw | 9つのツール(スクレイプ、検索、クロール、抽出、要約、差分、マップ、一括処理、ブランド)を備えた、ネイティブなwebclaw v1 APIプラグイン |
| hermes-webclaw | Hermes Agent | ウェブ検索プロバイダーと、v1 APIの全機能に対応する9つの専用ツール。hermes plugins install jal-co/hermes-webclawでインストールできます |
webclaw連携を作成しましたか?プルリクエストを作成して、ここに追加してください。
Contributors
issue、サンプル、ドキュメント、バグ報告、プルリクエストを通じてwebclawの改善に貢献してくださった皆さん、ありがとうございます。
Star History
License
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。