WebReaper について
WebReaper は、Web ページを整ったMarkdownに変換し、scrape・crawl・map の操作を stdio 経由で提供する AI 向け Web スクレイピング MCP サーバーです。単一のバイナリとして配布され、Docker やデータベースは不要で、MIT ライセンスです。
主な機能
- 01Docker やデータベースが不要な単一バイナリ
- 02スキーマ定義なしでMarkdownを既定出力
- 03HTTP からブラウザ、ステalth への自動切り替え
- 04ブロックされたチャレンジページを出力から除外
- 05LLM によるフォールバック抽出とセレクター自己修復
活用シーン
- 01ブログやドキュメントサイトからLLM用のコンテキストを作成
- 02競合の価格ページやステータスページの定期監視
- 03Cloudflare で保護されたカタログのスクレイピング
MCP 対応
WebReaper.Mcp は scrape、map、extract、crawl などのツールを stdio で公開し、Cursor や Claude Desktop などのローカルクライアントから利用できます。WebReaper.Mcp.AspNetCore は同じツールを Streamable HTTP で提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細

WebReaper
AI ネイティブなウェブスクレイパーです。Claude Code スキルをバンドルした単一バイナリです。
HighCraft.io が開発しています。
インストール
macOS / Linux(Homebrew):
brew install alex-on-ai/webreaper/webreaper
任意の POSIX シェル(install.sh):
curl -fsSL https://raw.githubusercontent.com/alex-on-ai/WebReaper/master/scripts/install.sh | sh
.NET ライブラリ:
dotnet add package WebReaper
Windows バイナリはGitHub Releases ページにあります。winget と Scoop は v10.1 のロードマップに含まれています。
更新: Homebrew の場合は brew upgrade webreaper を実行します。install.sh の場合は、--upgrade を追加してインストール行を再実行します(| sh -s -- --upgrade)。ライブラリの場合は dotnet add package WebReaper を実行します。新しいリリースがある場合、scrape/crawl/map は stderr に 1 行のアップグレード案内を表示します(対話型ターミナルでのみ表示され、パイプや CI では表示されません)。WEBREAPER_NO_UPDATE_CHECK=1 を設定すると、この確認を無効にできます。
30 秒デモ
$ webreaper scrape https://news.ycombinator.com
# Hacker News
- [Show HN: ...](https://news.ycombinator.com/item?id=...)
- [Ask HN: ...](https://news.ycombinator.com/item?id=...)
...
$ webreaper init
Wrote WebReaper Agent Skill to .claude/skills/webreaper/SKILL.md
Try it out:
webreaper scrape https://example.com
webreaper map https://example.com
webreaper init の実行後、次の Claude Code セッションでスキルが読み込まれ、スクレイピングの意図(「X のマークダウンを取得して」、「Y にはどんなブログ記事がある?」、「上位 5 件の記事をスクレイピングして」)が自動的に webreaper に振り分けられます。
目次
- WebReaper を選ぶ理由
- クイックスタート
- ボット対策を自動処理
- エージェントを強化
- AI 機能
- ユースケース
- パッケージ
- Firecrawl、Crawl4AI、Crawlee との比較
- API の概要
- アーキテクチャとインターフェース
- リポジトリ構成
- ライセンス
WebReaper を選ぶ理由
| 🪶 PATH に置いて、実行するだけです。 Docker、Postgres、サインアップは不要です。バイナリは約 12 MB です。 | 🤖 構成によって AI ネイティブです。 デフォルトで Markdown を出力します。スキーマ抽出、LLM フォールバック、自己修復セレクター、自律型エージェントを備えています。 .With…() で機能を組み合わせられます。 | 🔌 任意の LLM を利用できます。Microsoft.Extensions.AI を介して、OpenAI、Anthropic、Ollama、Azure OpenAI、llamafile を利用できます。 |
| 🛡 ボットチェックを自動処理します。 ブロックされたページは、ページごとに自動で HTTP → ブラウザー → ステルスへと切り替わり、ホストごとの設定は維持されます。チャレンジページは破棄され、データとして返されることはありません。ブラウザーフォールバックにフラグは不要です。 | 📡 必要に応じて分散処理できます。 スケジューラー、トラッカー、シンクを Redis、MongoDB、SQLite、Azure Service Bus、Cosmos に切り替えられます。コードはそのまま使えます。 | 📜 AGPL ではなく MIT です。 商用ソフトウェアへの組み込み、フォーク、変更、再配布が可能です。Firecrawl の AGPL では、サービスをオープンソースにするか、商用ライセンスの料金を支払う必要があります。 |
クイックスタート
CLI
# One page as Markdown
webreaper scrape https://example.com
# Save Markdown to a file
webreaper scrape https://example.com --output page.md
# Discover URLs on a site
webreaper map https://example.com --search /blog/ --max-urls 50
# Crawl a whole site recursively (every on-domain page) to JSON Lines
webreaper crawl https://example.com > pages.jsonl
# Structured fields with a JSON schema (output: JSON; multi-page: JSON Lines)
webreaper scrape https://example.com --schema schema.json
# Schema-free extraction with an LLM (bring your own OpenAI-compatible endpoint)
webreaper scrape https://example.com --prompt "title and author" \
--model gpt-4o-mini --llm-url https://api.openai.com/v1
# Whole site, fields, cheaply: infer a schema once, then extract the rest
webreaper crawl https://example.com --infer "product name and price" \
--model gpt-4o-mini --llm-url https://api.openai.com/v1 --output-dir ./out
# JS-rendered single-page app
webreaper scrape https://example.com --browser
# Bot-protected site: a plain scrape already auto-climbs HTTP -> browser on a
# block; --stealth starts at a stealth backend (--auto-stealth = no prompt, for CI)
webreaper scrape https://example.com --stealth
# Install the Claude Code skill
webreaper init
CLI は Native-AOT(ADR-0043)でビルドされ、タグ付きの GitHub リリースごとに、6 つの RID(linux-x64、linux-arm64、osx-x64、osx-arm64、win-x64、win-arm64)向けの単一バイナリとして配布されます。また、ブロックを認識し、ブラウザー/ステルスへの自動エスカレーションに対応しています(ADR-0083)。macOS バイナリは Apple のコード署名と公証を受けているため(ADR-0071)、クリーンなマシンでも Homebrew によるインストール時に Gatekeeper の警告は表示されません。
ライブラリ
using WebReaper.Builders;
var engine = await ScraperEngineBuilder
.Crawl("https://news.ycombinator.com")
.AsMarkdown()
.WriteToConsole()
.BuildAsync();
await engine.RunAsync();
これは HTTP のみで動作し、追加パッケージもスキーマも必要ありません。構造化フィールドを扱う場合は、AsMarkdown() を Extract(schema) に置き換えてください。JavaScript でレンダリングされるページの場合は、Crawl を CrawlWithBrowser に置き換え、トランスポート用サテライト(WebReaper.Playwright または WebReaper.Cdp)を追加してください。全機能についてはAPI の概要をご覧ください。
ボット対策を自動で処理
多くのスクレイパーでは、最初にブラウザーを使うかどうかを選び、サイトにブロックされたタイミングを推測する必要があります。WebReaper はブロックを検出すると、ページごとに自動で上位の方式へ切り替えます。
HTTP -> browser (Chromium) -> stealth (CloakBrowser)
(climbs only when a page actually looks blocked)
- 自動。 通常の
scrapeまたはcrawlは高速な HTTP フェッチから開始し、ページがブロックされているように見える場合(チャレンジのステータス、レスポンスヘッダー、または本文のマーカー)にのみ、実際のブラウザーへ切り替えます。ブラウザーへのフォールバックにフラグは不要です。 - ページ単位、ホストごとに維持。 ホストで最初のブロックが確認されると、そのホストの最低ティアが引き上げられます。そのため、サイト全体のクロールでは、失敗したティアを再度試すことなく、残りのページも最初から動作するティアで処理を開始します。ティアの引き上げにかかるコストは一度だけで、ページごとには発生しません。
- データにゴミが混ざりません。 最上位のティアでもブロックされたページは破棄され、出力には書き込まれません。また、実行はゼロ以外の終了コードを返すため、無人ジョブでもブロックを検知できます。クリーンなデータか、明確なシグナルのどちらかを得られます。コンテンツを装ったチャレンジページが混ざることはありません。
- ステルスの使用は選択できます。
--stealthはステルスバックエンドから開始し、--auto-stealth(またはWEBREAPER_AUTO_STEALTH=1)は無人実行時にステルスを有効にします。--no-auto-stealthを指定すると、通常のブラウザーを上限に切り替えます。約 220 MB のステルスバックエンドは、オプトインした場合にのみダウンロードされます。
セルフホスト可能な単一バイナリで、クラウドへの往復通信はありません(ADR-0083)。
エージェントを強化
エージェントをゼロから導入しますか? docs/AI-ONBOARDING.md を渡してください。インストール → 確認 → 用途に応じた選択までを 1 ページで説明し、認証情報は不要です。
Claude Code スキル
webreaper init
整った SKILL.md を .claude/skills/webreaper/ に作成します。Claude Code は次のセッションでこれを読み込み、スクレイピングの依頼を CLI に振り分けます。例:「HN のトップ 5 の記事をスクレイピングして、それぞれ要約して」「この記事の Markdown を見せて」「この Cloudflare で保護されたサイトにブロックされている」。このスキルでは、組み込みの WebFetch より webreaper を優先する場面について説明します(成果物と構造化データには webreaper を使い、会話形式の回答には WebFetch を使います)。
MCP サーバー
2 つの MCP サーバーが同じツール(scrape、map、extract、extract_with_prompt、extract_inferred、crawl)を公開し、Model Context Protocol に対応したクライアントから利用できます。
-
WebReaper.Mcp(ADR-0049)は、プロセスを起動するローカルクライアント向けに stdio で通信します。Cursor、Claude Desktop、Copilot Studio が該当します。 -
WebReaper.Mcp.AspNetCore(ADR-0086)は、URL に接続するクライアント向けに Streamable HTTP で通信します。代表的な用途は n8n です。n8n の MCP Client ノードは URL のみを受け付け、stdio サーバーには接続できません。Chromium を組み込んだイメージを実行し、n8n の MCP Client ノードにベアラートークン付きの URL を指定すれば、ワークフローからツールを呼び出せます。docker run -p 8080:8080 -e WEBREAPER_MCP_TOKEN=your-secret \ ghcr.io/alex-on-ai/webreaper-mcp-http:latest
n8n クイックスタートをご覧ください。
どちらもライブラリ API を薄くラップしたもので、エージェント向けの主なインターフェースは引き続き CLI です。
任意のエージェントハーネス内で使える CLI
単一バイナリは、シェルを起動するあらゆるエージェント内で動作します。LangChain の ShellTool、OpenAI Assistants の code-interpreter、GitHub Actions、内部スクリプトなどが該当します。インストールが必要なランタイムはなく、システムコール 1 回で実行できます。
AI 機能
1. スキーマ不要の LLM 対応 Markdown
await ScraperEngineBuilder
.Crawl("https://example.com")
.AsMarkdown() // ADR-0040 + ADR-0063
.WriteToConsole()
.BuildAsync()
.Result.RunAsync();
Markdown 抽出機能(プリミティブ HtmlToMarkdown、ADR-0063、アダプター MarkdownContentExtractor、ADR-0040)は、ページごとに {title, markdown} を出力します。その出力をそのまま後続の LLM プロンプトに渡せます。
2. コンパイル時ガード付きソース生成スキーマ
using WebReaper.Extraction.Attributes;
[ScrapeSchema]
public partial class Article
{
[ScrapeField("h1")] public string? Title { get; set; }
[ScrapeField(".views", Type = SchemaFieldType.Integer)] public int Views { get; set; }
[ScrapeField(".tag", IsList = true)] public List<string> Tags { get; set; } = new();
}
// Emitted at compile time, reflection-free, AOT-clean:
// public static Schema Schema { get; }
// public static Article Materialize(JsonObject json)
var engine = await ScraperEngineBuilder
.Crawl("https://example.com/post")
.Extract(Article.Schema)
.Subscribe(p => HandleArticle(Article.Materialize(p.Data)))
.BuildAsync();
WebReaper.Extraction.Generators Roslyn アナライザー(ADR-0045)がスキーマと Materialize 関数を生成します。スキーマの誤記はコンパイルエラーになり、生成されたパスではリフレクションを使用しないため、AOT に対応しています。
3. 決定論的な抽出を補う LLM のセーフティネット
LLM が呼び出されるのは、決定論的なパスでは対応できない場合のみとなる、組み合わせ可能な3つのパターンです。いずれも同じ提案者と検証者の構成です。
using WebReaper.AI;
// (a) Fire LLM only when a field returns empty (ADR-0046)
.WithLlmFallback(chatClient)
// (b) Repair a broken selector once per (Schema, field), cache forever (ADR-0047)
.WithLlmSelfHealing(chatClient)
// (c) No schema at all: infer it from the URL, re-infer on validator failure (ADR-0067 + ADR-0069)
.UseAi(chatClient, AiPolicyMode.Inferred)
安定したページでは LLM の呼び出しはゼロです。壊れたページでは、(ページ、フィールド)ごとに1回呼び出され、キャッシュされます。スキーマの推論はサイトごとに1回行われます(実行中はキャッシュされます)。WebReaper.AI サテライトは Microsoft.Extensions.AI 上に構築されているため、任意の IChatClient を利用できます。
4. 自律型エージェント:目標に基づくページ選択
using WebReaper.AI;
var result = await LlmAgent.RunAsync(
"https://example.com",
goal: "Find the contact email and phone number for the support team.",
chatClient);
AgentEngine(ADR-0051)は、閉じた合計型 AgentDecision(Extract | Follow | Act | Stop)を使って、順次 decide → persist → execute ループを実行します。ブレインが制限された AgentState ビューから各ステップを選択し、エンジンが検証(訪問済みリンクの適用、MaxSteps の上限)、永続化(IAgentRunStore)、ディスパッチを行います。プロセスを再起動しても、永続化された状態から再開できます。
5. セマンティックなページ操作
ScraperEngineBuilder
.CrawlWithBrowser(url, actions => actions
.Do(PageAction.SemanticAct("click 'sign in'")) // ADR-0050
.Do(PageAction.WaitForNetworkIdle())
.Build())
.WithLlmActionResolver(chatClient)
// ...
自然言語による PageAction.SemanticAct(intent) は、10種類ある閉じた合計型のうちの1つです(ADR-0050 で追加され、ADR-0074 でフォーム操作用の Fill / Press / ScrollIntoView が追加されました)。トランスポートは登録済みの IActionResolver(デフォルトでは LLM を利用)を使って一度だけ解決し、具体的な型をディスパッチして、意図文字列ごとに解決結果をクロール単位でキャッシュします。最初のページでは LLM が呼び出されますが、以降の同じ意図を持つページでは、キャッシュされた型が LLM を呼び出さずにディスパッチされます。
エンドツーエンドで実行できるデモ
Examples/WebReaper.AiNativeShowcase では、このセクションのすべての機能を組み合わせています。
dotnet run --project Examples/WebReaper.AiNativeShowcase -- markdown
dotnet run --project Examples/WebReaper.AiNativeShowcase -- sourcegen
dotnet run --project Examples/WebReaper.AiNativeShowcase -- llm
dotnet run --project Examples/WebReaper.AiNativeShowcase -- router
dotnet run --project Examples/WebReaper.AiNativeShowcase -- changetrack
ユースケース
- ブログやドキュメントサイトから LLM のコンテキストを構築する。
webreaper mapに続けて URL ごとにwebreaper scrapeを実行し、プロンプトまたはベクトル DB にパイプで渡します。 - 競合他社の価格やステータスページの変更を監視する。 CLI を cron またはワーカーでスケジュール実行し、レコードを MongoDB または SQLite に保存して、
.WithChangeTracking()(ADR-0048)を追加すると、差分がある場合のみシンクが実行されます。ハッシュベースの重複排除に対応しており、cron に適しています。 - 自律型のリサーチエージェントを実行する。
LlmAgent.RunAsync(url, goal, chatClient)が、目標を達成するまでたどるリンクを判断します。再起動後も永続化された状態から再開できます。 - Cloudflare に保護されたカタログをスクレイピングする。 通常の
scrapeは、ブロックされると HTTP からブラウザーへ自動的に切り替わります。ステルスバックエンドに切り替えるには、--stealth(無人実行の場合は--auto-stealth)を追加します。ブロックされたページは除外され、チャレンジページの不要なデータが出力されることはありません。 - 半構造化ページから整ったデータセットを生成する。
[ScrapeSchema]POCO とソースジェネレーターを使用します。リフレクションを使わず、AOT でネイティブバイナリにコンパイルできます。 - 独自のアプリにスクレイピング機能を組み込む。
dotnet add package WebReaperを実行します。公開された登録拡張ポイントを使って、Redis、Cosmos DB、独自のシンクを接続できます。
パッケージ
このリリースでは、15個のパッケージ(コア1個、サテライト14個)が提供され、すべて同じバージョンで管理されます。コアは依存関係を最小限に抑え、警告ゼロで Native AOT 発行できます。サテライトはそれぞれ独自の SDK 依存関係を持ち、それらがコアの依存関係グラフに入り込まないよう隔離されています(ADR-0009)。
| パッケージ | 用途 | 主なビルダー呼び出し |
|---|---|---|
| WebReaper | コア機能。HTTP クロールと解析、メモリ内およびファイルベースのスケジューラー/訪問済みリンクトラッカー/Cookie と設定のストレージ、Console/CSV/JSON-Lines の出力先、Markdown 抽出器、スキーマ統合。依存関係が少なく、Native-AOT 対応で、Newtonsoft は不要です。 | Crawl Extract AsMarkdown Follow Paginate Sweep WriteToJsonFile WriteToCsvFile WriteToConsole Subscribe |
| WebReaper.Cdp | 生の CDP IPageLoadTransport(ADR-0052)。AOT に適しており(PuppeteerSharp/Playwright への依存なし)、System.Net.WebSockets と System.Text.Json のソース生成を使用します。ステルスパターンの基盤です。 | .WithCdpPageLoader(cdpUrl)(BYO)または .WithCdpPageLoader(CdpLaunchOptions)(Chromium の起動を管理) |
| WebReaper.Playwright | Microsoft.Playwright ベースのトランスポート(ADR-0053)。複数のブラウザーに対応(デフォルトは Chromium、Firefox/WebKit はオプトイン)。10 種類すべての PageAction に対応しています。最新の複数ブラウザー対応が必要な場合に使用し、AOT またはステルスには WebReaper.Cdp と組み合わせてください。 | .WithPlaywrightPageLoader() |
| WebReaper.Stealth.CloakBrowser | 最初のステルスバックエンド用サテライト(ADR-0054)。初回使用時に CloakBrowser を自動ダウンロードし、WebReaper.Cdp 上に構成されます。ADR-0058 のエンジン終了チェーンで破棄できます。 | .WithCloakBrowser() |
| WebReaper.AI | LLM による抽出、LLM アクションリゾルバー、LLM ブレイン、LLM セルフヒーリング、LLM スキーマ推論(ADR-0044 / 0050 / 0051 / 0067)。Microsoft.Extensions.AI を基盤とし、IChatClient は各自で用意してください。 | .WithLlmFallback .WithLlmSelfHealing .WithLlmExtractor .WithLlmAgentBrain .WithLlmActionResolver .WithLlmSchemaInferrer .UseAi(client) |
| WebReaper.AI.Http | AOT セーフな OpenAI 互換 IChatClient(ADR-0084):生の HttpClient と System.Text.Json のソース生成を使用し、プロバイダー SDK は不要です。AOT CLI と MCP サーバーがプロンプト抽出に使用する、各自で用意するクライアントです。 | new OpenAiCompatibleChatClient(baseUrl, model, apiKey) |
| WebReaper.Extraction.Attributes | [ScrapeSchema]/[ScrapeField] マーカー型。単独で使用でき、実行時コストはありません。 | [ScrapeSchema] [ScrapeField("selector")] |
| WebReaper.Extraction.Generators | Roslyn ソースジェネレーター。static Schema と、リフレクションを使わない static Materialize(JsonObject) を生成します(ADR-0045)。DevelopmentDependency=true のため、実行時には引き継がれません。 | コンパイル時のみ |
| WebReaper.Mcp | stdio 経由でスクレイピング/マップ/抽出/プロンプトによる抽出/推論による抽出/クロールを MCP ツールとして公開する MCP サーバー Exe(ADR-0049)。ローカル MCP クライアント(Cursor、Claude Desktop)向けの相互運用アダプターです。 | パッケージ自体が実行可能ファイルです |
| WebReaper.Mcp.AspNetCore | n8n などの URL ベースのクライアント向けに Streamable HTTP 経由で MCP サーバーを提供します(ADR-0086)。WebReaper.Mcp と同じツールに加え、ベアラートークン認証と WEBREAPER_CDP_URL ブラウザーサイドカーを提供します。Chromium を組み込んだコンテナーイメージも提供します。 | パッケージ自体が実行可能ファイルです。または docker run ghcr.io/alex-on-ai/webreaper-mcp-http |
| WebReaper.Mongo | MongoDB の結果出力先と、MongoDB ベースの設定/Cookie ストレージです。 | .WriteToMongoDb(...) .WithMongoDbConfigStorage(...) .WithMongoDbCookieStorage(...) |
| WebReaper.Redis | Redis スケジューラー、訪問済みリンクトラッカー、結果出力先、設定/Cookie ストレージです。 | .WithRedisScheduler(...) .TrackVisitedLinksInRedis(...) .WriteToRedis(...) .WithRedisConfigStorage(...) .WithRedisCookieStorage(...) |
| WebReaper.AzureServiceBus | Azure Service Bus キューを使用する分散スケジューラーです。 | .WithAzureServiceBusScheduler(...) |
| WebReaper.Cosmos | Azure Cosmos DB の結果出力先です。 | .WriteToCosmosDb(...) |
| WebReaper.Sqlite | 組み込み SQLite ストアを使用する、ローカルの永続性のあるスケジューラーと訪問済みリンクトラッカーです。再開はクエリで行い、位置ファイルは不要です。オプトイン方式の堅牢なローカル層で、Redis と異なりサーバーは不要です。 | .WithSqliteScheduler(...) .TrackVisitedLinksInSqlite(...) |
WebReaper.Cli(AOT の単一バイナリ。ADR-0043)は NuGet パッケージではありません。すべての GitHub リリースでプラットフォーム別バイナリとして提供されます(Native-AOT と dotnet tool install は、同じターゲットでは併用できません)。Homebrew または install.sh でインストールするか、ソースからビルドしてください。 |
Firecrawl、Crawl4AI、Crawlee との比較
| WebReaper | Firecrawl | Crawl4AI | WebFetch(Claude) | |
|---|---|---|---|---|
| ライセンス | MIT | AGPL-3.0(商用ライセンスもあり) | Apache 2.0 | Claude にバンドル |
| インストール | 単一バイナリ、約 12 MB | Docker + Postgres + Redis(セルフホスト)またはホスト型 | Docker + Python + Playwright | インストール不要 |
| コスト | 無料 | 従量課金 API と無料枠 | 無料 | Claude に含まれる |
| LLM の持ち込み | 任意の IChatClient | 不可(独自モデル) | 可(LiteLLM) | Claude のみ |
| 自律型エージェント | Agent.RunAsync() による永続化、プロセス内で実行 | /agent エンドポイント(クラウドのみ) | 自分でコードを書く | 利用不可 |
| サイト全体のクロール | webreaper crawl / .Sweep():再帰的、同一ドメイン内、サイトマップを起点とし、JSON Lines をストリーミング | crawl(クラウドまたはセルフホスト) | ディープクロール戦略(自分でコードを書く) | 不可(単一ページの取得のみ) |
| ページ操作 | 10 個の宣言型アーム:Click、Wait、Fill、Press、ScrollToEnd、ScrollIntoView、WaitForSelector、WaitForNetworkIdle、EvaluateExpression、SemanticAct(自然言語) | 9 個のアクション:wait、click、write、press、scroll、executeJavascript、および 3 個の観察機能(screenshot、pdf、scrape) | JS フック。固定の語彙セットなし | なし(単一ページの取得のみ) |
| ボット対策あり | HTTP → ブラウザー → ステルスの段階的な自動切り替え。ページごとに実行し、ホスト単位で固定、セルフホスト可能 | クラウド版は対応。セルフホスト版は機能低下(Fire-engine なし) | 自分で用意 | 非対応 |
| Claude Code スキル | webreaper init に同梱 | コミュニティ製の firecrawl-claude-code-skill がクラウド API をラップ | 公式のものはなし | 該当なし |
Crawlee(Apify の Node/Python ライブラリ)についても知っておくとよいでしょう。WebReaper のライブラリ API と同様の機能を備えていますが、バイナリや Claude Code スキル、組み込みの LLM セーフティネットは提供していません。すでに Apify のエコシステムを利用している場合に適しています。
最も近い比較対象は Firecrawl です。AI ネイティブという位置付けは同じですが、提供形態は対照的です。Firecrawl はホスト型 API の利用を最適化しており、WebReaper はローカルバイナリの利用を最適化しています。他社のプロキシやインフラを使うマネージドクラウドが必要なら、Firecrawl を選んでください。自分の LLM キーを使い、従量課金なしでローカル実行できるバイナリが必要なら、WebReaper を選んでください。
API の概要
このライブラリは、少数の接続点を基盤とした流暢なビルダーです。接続点ごとの詳細なリファレンス(インターフェース、主要エンティティ、カスタムシンク)については、docs/architecture.md を参照してください。
スキーマ抽出
using WebReaper.Builders;
var engine = await ScraperEngineBuilder
.Crawl("https://www.alexpavlov.dev/blog")
.Extract(new()
{
new("title", ".text-3xl.font-bold"),
new("text", ".max-w-max.prose.prose-dark")
})
.Follow("a.text-gray-900.transition")
.WriteToJsonFile("output.json")
.PageCrawlLimit(10)
.WithParallelismDegree(30)
.LogToConsole()
.BuildAsync();
await engine.RunAsync();
各 new("field", "css-selector") はリーフです。オブジェクトにはスキーマをネストし、配列には IsList = true を設定します。内側のテキストではなく HTML 属性を読み取るには、Attr = "href" を設定します。
プロセス内でレコードを収集する
ファイルやカスタムシンクを使わずに、スクレイピングしたレコードを自分のプロセス内で取得できます。Subscribe(ADR-0038)にスレッドセーフなコレクションの Add を渡し、実行後に読み取ります。
using System.Collections.Concurrent;
using WebReaper.Builders;
using WebReaper.Sinks.Models;
var records = new ConcurrentBag<ParsedData>();
var engine = await ScraperEngineBuilder
.Crawl("https://news.ycombinator.com")
.AsMarkdown()
.Subscribe(records.Add) // called concurrently; collect into a thread-safe type
.BuildAsync();
await engine.RunAsync();
foreach (var record in records)
Console.WriteLine($"{record.Url}: {record.Data["markdown"]?.GetValue<string>()?.Length ?? 0} chars");
Crawl ドライバーはシンクへ並行して出力するため、単純な List ではなく ConcurrentBag が適切なコレクターです。構造化フィールドについては、"markdown" ではなく、record.Data からスキーマキーを読み取ってください。
動的ページの解析(SPA)
JavaScript でレンダリングされるページでは、Crawl を CrawlWithBrowser に置き換え、ブラウザートランスポートを登録します。利用可能なサテライトは 2 つあります。
WebReaper.Playwright は最新のデフォルトです(ADR-0053)。複数のブラウザーに対応し、10 種類すべての PageAction を利用できます。
using WebReaper.Builders;
using WebReaper.Playwright;
await ScraperEngineBuilder
.CrawlWithBrowser("https://example.com")
.Extract(new() { new("title", "h1") })
.WithPlaywrightPageLoader()
.BuildAsync();
WebReaper.Cdp は AOT に適した代替手段です(ADR-0052)。System.Net.WebSockets 経由で CDP を直接使用し、AOT で発行できます。AOT を利用する場合や、ステルスバックエンドの基盤として使用してください。
using WebReaper.Cdp;
.WithCdpPageLoader(new CdpLaunchOptions { Headless = true })
// or .WithCdpPageLoader(cdpUrl: "http://localhost:9222") for BYO browser
ボット対策が施されたサイトでは、WebReaper.Stealth.CloakBrowser(ADR-0054)を WebReaper.Cdp の上に重ねて使用します。
using WebReaper.Stealth.CloakBrowser;
.WithCloakBrowser() // auto-downloads CloakBrowser on first use, ~220 MB
ブラウザーを表示してデバッグするには、.HeadlessMode(false) を追加します。
JavaScript とページアクションの実行
ページの読み込みに合わせて操作します。アクションのラムダ式を渡してください。
using WebReaper.Builders;
using WebReaper.Playwright;
using WebReaper.Domain.PageActions;
await ScraperEngineBuilder
.CrawlWithBrowser("https://www.reddit.com/r/dotnet/", actions => actions
.ScrollToEnd()
.Build())
.Extract(new() { new("title", "h1") })
.WithPlaywrightPageLoader()
.BuildAsync();
PageActionBuilder は Click、Wait、ScrollToEnd、ScrollIntoView、WaitForSelector、WaitForNetworkIdle、EvaluateExpression、Fill、Press、SemanticAct、Repeat/RepeatWithDelay、Build() を提供します。Fill(selector, value)/Press(key)/ScrollIntoView(selector)(ADR-0074)には、暗黙的に 30 秒の自動待機が設定されており、CDP トランスポートでは React に適したネイティブセッターの手法を使うため、React/Vue/Svelte の制御コンポーネントで変更が認識されます。SemanticAct(ADR-0050)は自然言語の意図を受け取り、登録された IActionResolver を介して解決します(AI 機能 §5 を参照)。
進捗をローカルに保存する
kill -9 の後もデータを保持し、再起動後に再開できます。アダプターは 2 種類あります。ファイルベース(依存関係なし、コアに含まれる)と SQLite ベース(永続化に対応し、WebReaper.Sqlite を通じたオプトイン方式)です。
using WebReaper.Builders;
using WebReaper.Sqlite;
await ScraperEngineBuilder
.Crawl("https://example.com")
.Extract(new() { new("name", "h1") })
.Follow(".forumlink>a")
.Paginate("a.torTopic", ".pg")
.WriteToJsonFile("result.json")
.WithSqliteScheduler("crawl/state.db") // resume is a query, not a position file
.TrackVisitedLinksInSqlite("crawl/state.db") // the table is the set
.BuildAsync();
起動時にストアを消去するには、任意のシンク、トラッカー、スケジューラーメソッドに dataCleanupOnStart: true を渡します(注:WriteToJsonFile のデフォルトは true、その他のデフォルトは false です)。
認証
サイトで Cookie が必要な場合は、SetCookies を呼び出してコンテナーに入力します。ログインはご自身で行います。
using System.Net;
using WebReaper.Builders;
await ScraperEngineBuilder
.Crawl("https://example.com/protected")
.Extract(new() { new("name", "h1") })
.SetCookies(cookies =>
{
cookies.Add(new Cookie("AuthToken", "123"));
})
.BuildAsync();
分散処理とサーバーレス
スケジューラー、設定ストレージ、リンクトラッカーを Redis または Azure Service Bus に置き換えると、複数のワーカーやサーバーレス関数で 1 つのクロールを共有できます。Examples/WebReaper.AzureFuncs ではサーバーレス構成を示しています(関数は 2 つです。StartScraping が作業を登録し、WebReaperSpider が分散型の Crawl ドライバーになります)。Examples/WebReaper.DistributedScraperWorkerService ではワーカーサービス構成を示しています。
DistributedSpiderBuilder.BuildSpider() は Crawl のシードを持たない、ベアな ISpider を返します(ADR-0009/ADR-0025:「1 つのバグではなく、2 つの接合部」という分割)。ワーカーの設定は、開始エンドポイントによって別途永続化されます。
ストレージとスケジューラーバックエンド
すべてのバックエンドは交換可能な接合部です。デフォルトはメモリ内で、ファイルベースのものはコアに含まれ、その他はサテライトから提供されます。
| 接合部 | コア(デフォルトのメモリ内+ファイル) | サテライトのオプション |
|---|---|---|
| スケジューラー | メモリ内、WithTextFileScheduler | WithSqliteScheduler、WithRedisScheduler、WithAzureServiceBusScheduler |
| 訪問済みリンクトラッカー | メモリ内、TrackVisitedLinksInFile | TrackVisitedLinksInSqlite、TrackVisitedLinksInRedis |
| 設定ストレージ | メモリ内、WithFileConfigStorage | WithMongoDbConfigStorage、WithRedisConfigStorage |
| Cookie ストレージ | メモリ内、WithFileCookieStorage | WithMongoDbCookieStorage、WithRedisCookieStorage |
| エージェント実行ストア | メモリ内、ファイル(ADR-0051) | WithSqliteAgentRunStore、WithRedisAgentRunStore、WithMongoAgentRunStore、WithCosmosAgentRunStore |
| 結果シンク | WriteToConsole、WriteToCsvFile、WriteToJsonFile | WriteToMongoDb、WriteToRedis、WriteToCosmosDb |
| ページローダーのトランスポート | HTTP(デフォルト) | WithPlaywrightPageLoader、WithCdpPageLoader、WithCloakBrowser |
カスタムシンク、インターフェイス一覧、主要なドメインエンティティについては、docs/architecture.md を参照してください。
リポジトリ構成
| プロジェクト | 説明 |
|---|---|
WebReaper | コアライブラリ(WebReaper NuGet パッケージ)。 |
WebReaper.Cdp | 生の CDP トランスポート用サテライト(ADR-0052)。 |
WebReaper.Playwright | Microsoft.Playwright トランスポート用サテライト(ADR-0053)。 |
WebReaper.Stealth.CloakBrowser | 最初のステルスバックエンド用サテライト(ADR-0054)。 |
WebReaper.AI | LLM 抽出、アクションリゾルバー、エージェントの頭脳、自己修復、スキーマ推論。 |
WebReaper.Extraction.Attributes | [ScrapeSchema] / [ScrapeField] マーカー型(ADR-0045)。 |
WebReaper.Extraction.Generators | Roslyn ソースジェネレーター(ADR-0045)。 |
WebReaper.Mcp | MCP サーバー用サテライト(ADR-0049)。 |
WebReaper.Mongo | MongoDB シンクと設定/Cookie ストレージ。 |
WebReaper.Redis | Redis スケジューラー、トラッカー、シンク、設定/Cookie ストレージ。 |
WebReaper.AzureServiceBus | Azure Service Bus 分散スケジューラー。 |
WebReaper.Cosmos | Azure Cosmos DB シンク。 |
WebReaper.Sqlite | 組み込み SQLite を使用した、ローカルで永続化されるスケジューラーと訪問済みリンクトラッカー。 |
WebReaper.Cli | AOT シングルバイナリ CLI(ADR-0043)。 |
Examples/WebReaper.ConsoleApplication | コンソールアプリケーションで WebReaper を使用する例。 |
Examples/WebReaper.AiNativeShowcase | この README に記載されているすべての AI 機能を実行できるデモ。 |
Examples/WebReaper.SchemaInferenceShowcase | ADR-0067 / 0068 / 0069 のスキーマ推論デモ。 |
Examples/WebReaper.ScraperWorkerService | .NET Worker Service で WebReaper を使用する例。 |
Examples/WebReaper.DistributedScraperWorkerService | クロール状態を共有するワーカー間での分散クロール。 |
Examples/WebReaper.AzureFuncs | Azure Functions と Azure Service Bus を使用したサーバーレスクロール。 |
Examples/BrownsfashionScraper | 実際の EC サイトを対象にしたスクレイパーの例。 |
Misc/WebReaper.ProxyProviders | プロキシプロバイダーの実装例。 |
ライセンス
WebReaper は MIT ライセンスです(ADR-0017)。すべての NuGet パッケージと WebReaper.Cli バイナリは同じ条件で提供されます。商用利用、プロプライエタリソフトウェアへの組み込み、フォーク、変更、再配布が可能です。著作権表示を残すことだけが条件です。
10.0.0 のリリース以前、WebReaper は GPL-3.0-or-later でした。再ライセンスによって、利用条件がさらに緩和されています。既存のユーザーには影響がなく、GPL の下では組み込めなかった新しいユーザーも組み込めるようになりました。過去の貢献者は CONTRIBUTORS.md に記載されています。分析と貢献者の同意手順については、docs/adr/0017-relicense-gpl-mit.md をご覧ください。
同じ MIT 条件での貢献を歓迎します。DCO によるサインオフについては、CONTRIBUTING.md をご覧ください。
HighCraft.io のソフトウェアおよび AI エンジニアリングチームが開発しました。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。