生のHTMLをそのままLLMに渡すと、ナビゲーションや広告が混ざり、トークンを無駄に消費します。RAGやAIエージェントのデータ収集では、本文だけをきれいなMarkdownやJSONに落とし込む工程が欠かせません。
この記事では、オープンソースのWebクローラー「WaterCrawl」がその課題をどう解くかを整理します。
この記事でわかること
- WaterCrawlが解決するデータ収集の課題
- クロール、JSレンダリング、Markdown/JSON出力の主な機能
- Dockerでのセルフホスト手順と料金体系
- FirecrawlやCrawl4AIとの違い
生HTMLではRAGの精度が落ちる
WebページのHTMLには、記事本文以外にヘッダー、フッター、サイドバー、Cookieバナー、トラッキング用スクリプトが含まれます。LLMやベクトルDBにそのまま投入すると、検索時にノイズが混ざり、回答の根拠がぼやけます。
従来のスクレイピングは特定フィールドの抽出には向きますが、LLMが読みやすい形への整形は別工程になりがちです。AIパイプライン向けに、クロールから構造化までを一気通貫で担うツールが求められています。
WaterCrawlとは
https://github.com/watercrawl/WaterCrawl
WaterCrawlは、WebコンテンツをLLM向けの構造化データに変換するオープンソースのクローリング基盤です。GitHubリポジトリの説明は「Transform Web Content into LLM-Ready Data」で、2024年12月に公開され、2026年6月時点で約1,900スターを獲得しています。
バックエンドはPython、Django、Scrapy、Celeryで構成されます。REST APIとWeb UIを備え、セルフホストとクラウドの両方で使えます。ライセンスはMITをベースにした独自のWaterCrawl Licenseで、改変・配布は可能ですが、watercrawl.devと同等の商用サービス提供には許可が必要です。
主な機能
クロールとJSレンダリング
深度、ドメイン、パスの制限を細かく設定できます。サイトマップの自動生成にも対応し、隠れたURLの発見やサイト構造の把握に使えます。
JavaScriptで描画されるページ向けに、待機時間を設定したJSレンダリングをサポートします。公式サイトでは、動的コンテンツの取得やPDF・JPG形式のスクリーンショット取得にも言及しています。SPAや遅延読み込みのあるページでも、レンダリング後のDOMから本文を抜き出せます。
MarkdownとJSONの出力
抽出結果はJSONとMarkdownでエクスポートできます。only_main_contentオプションでヘッダーやフッターを自動除外し、本文中心のデータを得られます。タグやセレクタで抽出範囲を絞ることも可能です。
OpenAI連携のプラグインも用意されており、生HTMLから意味のある構造データへ変換する処理を組み込めます。RAGパイプラインでは、Markdownをチャンク分割してベクトルDBへ投入する流れが一般的で、WaterCrawlの出力形式はその前提に沿っています。
リアルタイム監視とAPI
クロール進捗はServer-Sent Events(SSE)でリアルタイムに追跡できます。REST APIはOpenAPI仕様で公開され、Python、Node.js、Go、PHP向けの公式クライアントが提供されています。
DifyやN8Nとの連携プラグインもあり、ノーコードの自動化フローへ組み込みやすい構成です。AIエージェント基盤へ接続する際は、APIキー認証で安全に呼び出せます。
使い方の流れ
Dockerでセルフホスト
READMEに記載の手順で、ローカルに一式を立ち上げられます。
git clone https://github.com/watercrawl/watercrawl.git
cd watercrawl/docker
cp .env.example .env
docker compose up -d
起動後は http://localhost からWeb UIにアクセスします。本番環境ではMinIOのエンドポイント設定やデータベースの構成変更が必要です。Docker Hubには watercrawl/watercrawl イメージが公開され、最新版はv0.12.3(2026年5月リリース)です。
Pythonクライアントでの利用
クラウド版やセルフホスト版のAPIには、watercrawl-py パッケージから接続します。
from watercrawl import WaterCrawlAPIClient
client = WaterCrawlAPIClient("your_api_key")
result = client.scrape_url(
url="https://example.com",
page_options={
"exclude_tags": ["nav", "footer"],
"only_main_content": True,
},
)
単一URLの同期スクレイプから、深度やページ数を指定した非同期クロールまで、同じクライアントで扱えます。monitor_crawl_request で進捗を監視し、完了後にZIPで一括ダウンロードすることも可能です。
料金
セルフホストはオープンソースのため、ソフトウェア自体の利用料はかかりません。インフラ費用は自分で負担します。
公式クラウド(watercrawl.dev)には無料プランがあり、月1,000ページ分のクレジット、1日100ページ、チーム1席、最大深度2、同時クロール1件が含まれます。クレジットカード登録は不要です。有料プランはスタートアップ向けの年間プランから用意されています。
FirecrawlやCrawl4AIとの違い
AI向けWebクローラーには、FirecrawlやCrawl4AIなど複数の選択肢があります。
Crawl4AIはPythonライブラリとして動作し、GitHubで5万スター超を記録するLLM向けクローラーです。PlaywrightによるJSレンダリングとMarkdown生成に強みがあり、pipインストールで手軽に試せます。
FirecrawlはMarkdownやJSON出力に対応するAPI型のサービスで、サイト全体のクロールやLLMベースの構造化抽出が特徴です。セルフホスト版もありますが、クラウド利用が中心です。
WaterCrawl公式ブログの比較記事では、無料枠が月1,000ページ(Firecrawlは500ページ)である点、ScrapyとDjangoを基盤とするフルスタック構成である点、サイトマップ生成やクロール深度の細かい制御が可能な点が差別化要素として挙げられています(参考)。
用途で選ぶなら、Pythonスクリプト内に直接組み込みたい場合はCrawl4AI、マネージドAPIで手早く始めたい場合はFirecrawl、クロール制御とWeb UI、検索機能を一体で持つセルフホスト基盤が欲しい場合はWaterCrawlが向きます。
RAGパイプラインへの組み込み
典型的な流れは次のとおりです。WaterCrawlで対象サイトをクロールし、MarkdownまたはJSONを取得します。取得データをチャンク分割し、埋め込みモデルでベクトル化して、pgvectorやPineconeなどのベクトルDBへ格納します。最後にLLMが検索結果を参照して回答を生成します。
DifyのナレッジベースやN8Nのワークフローと連携すれば、定期クロールからインデックス更新までを自動化できます。Web検索機能を使えば、特定ドメインに限定せずインターネット全体から関連ページを集めることも可能です。
注意点
セルフホストではMinIO、データベース、Celeryワーカーなど複数コンテナの管理が必要です。localhost以外のドメインで運用する場合は、.env のMinIO設定を必ず更新してください。READMEでも本番デプロイ前の設定見直しが強調されています。
クロール対象サイトのrobots.txtと利用規約を確認し、適切なレート制限を設けることも欠かせません。WaterCrawlはレート制限機能を備えていますが、倫理的なスクレイピングは利用者側の責任です。
WaterCrawlは、WebからLLM向けデータを取り込む工程を一つの基盤にまとめたツールです。JSレンダリング、Markdown/JSON出力、Dockerでのワンコマンド起動、DifyやN8N連携まで揃っており、RAGやAIエージェントのデータ収集基盤として検討する価値があります。