[入門] Crawl4AI:LLM・RAG向けWebスクレイピングの始め方
Crawl4AIは、LLM(大規模言語モデル)やRAGシステムに特化したオープンソースのWebスクレイピングフレームワークです。従来のスクレイピングツールと異なり、AIが扱いやすいMarkdown形式での出力や、LLMを活用した構造化データ抽出に対応しています。本記事では、Crawl4AIの特徴と基本的な使い方を解説します。
3行まとめ
- Crawl4AIはLLM・RAG向けに最適化されたオープンソースのWebスクレイピングツール
- クリーンなMarkdown出力と構造化データ抽出が標準機能
- 57,000以上のGitHub Starを獲得し、AI開発者コミュニティで急速に普及中
Crawl4AIとは?
Crawl4AIは、WebコンテンツをAIが扱いやすい形式に変換することに特化したPython製のスクレイピングフレームワークです。2025年12月の最新版(v0.7.8)では、Docker対応やリアルタイム監視ダッシュボードなど、本番環境での運用を意識した機能が強化されています。
開発背景
従来のスクレイピングツール(BeautifulSoup、Scrapy)は汎用的な用途には優れていますが、LLMやRAGシステムとの統合には以下のような課題がありました:
- HTML構造をそのまま取得するため、AIには不要なノイズが多い
- データのクリーニングや構造化に手作業が必要
- LLMのコンテキストウィンドウに合わせたチャンク分割が困難
Crawl4AIは、これらの課題を解決するために「AIファースト」の設計思想で開発されました。
従来のスクレイピングツールとの違い
| 項目 | BeautifulSoup | Scrapy | Crawl4AI |
|---|---|---|---|
| 主な用途 | シンプルな解析 | 大規模スクレイピング | LLM/RAG向けデータ準備 |
| 出力形式 | HTML/テキスト | 構造化データ | Markdown + 構造化JSON |
| AIノイズ除去 | ❌ 手動 | ❌ 手動 | ✅ 自動(Fit Markdown) |
| LLM統合 | ❌ 非対応 | ❌ 非対応 | ✅ ネイティブ対応 |
| 非同期処理 | ❌ | ✅ | ✅(Playwrightベース) |
| JavaScript対応 | ❌ | △(追加ライブラリ必要) | ✅(標準対応) |
| 学習コスト | 低 | 高 | 中 |
Crawl4AIの特徴的な機能
1. Fit Markdown機能
ヒューリスティックなフィルタリングにより、ナビゲーションバーや広告などのノイズを自動除去し、本文だけをクリーンなMarkdownで出力します。
2. LLM駆動の構造化抽出
LLM(OpenAI、Claude、Ollama対応)を活用して、Webページから構造化されたJSONデータを自動抽出できます。
3. チャンキング戦略
トピックベース、正規表現、文レベルなど、複数のチャンキング手法に対応し、LLMのトークン制限に最適化されたデータ分割が可能です。
インストール
Crawl4AIはPython 3.10以上で動作します。
標準インストール
pip install -U crawl4ai
# 初期セットアップ(Playwrightのブラウザをインストール)
crawl4ai-setup
Dockerでの利用
docker pull unclecode/crawl4ai:latest
docker run -p 8000:8000 unclecode/crawl4ai:latest
Docker版では、REST APIエンドポイントやリアルタイム監視ダッシュボードが利用できます。
基本的な使い方
1. シンプルなMarkdown取得
最もシンプルな使用例です。指定したURLのコンテンツをクリーンなMarkdownで取得します。
import asyncio
from crawl4ai import AsyncWebCrawler
async def simple_crawl():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(url="https://example.com")
print(result.markdown)
asyncio.run(simple_crawl())
2. 構造化データの抽出(LLMなし)
LLMを使わずに、CSSセレクタやXPathで構造化データを抽出できます。
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy
import asyncio
async def extract_articles():
# 抽出するデータのスキーマを定義
schema = {
"name": "Article List",
"baseSelector": "article.post",
"fields": [
{"name": "title", "selector": "h2.title", "type": "text"},
{"name": "author", "selector": ".author", "type": "text"},
{"name": "date", "selector": "time", "type": "attribute", "attribute": "datetime"},
{"name": "url", "selector": "a.read-more", "type": "attribute", "attribute": "href"}
]
}
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://blog.example.com",
extraction_strategy=JsonCssExtractionStrategy(schema)
)
print(result.extracted_content)
asyncio.run(extract_articles())
3. LLMを活用した構造化抽出
OpenAIやOllamaなどのLLMを使用して、より柔軟な構造化抽出が可能です。
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import LLMExtractionStrategy
from pydantic import BaseModel, Field
import asyncio
# 抽出したいデータの構造をPydanticモデルで定義
class Product(BaseModel):
name: str = Field(description="製品名")
price: float = Field(description="価格(数値)")
description: str = Field(description="製品の説明")
async def llm_extraction():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://shop.example.com/products",
extraction_strategy=LLMExtractionStrategy(
provider="ollama/llama3.2", # または "openai/gpt-4o-mini"
schema=Product.model_json_schema(),
instruction="このページから全ての製品情報を抽出してください"
)
)
print(result.extracted_content)
asyncio.run(llm_extraction())
RAGシステムへの統合
Crawl4AIは、RAG(Retrieval-Augmented Generation)システムとの統合に最適化されています。
RAGパイプラインの構築例
from crawl4ai import AsyncWebCrawler
from crawl4ai.chunking_strategy import TopicBasedChunking
import asyncio
async def rag_pipeline():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://docs.example.com",
chunking_strategy=TopicBasedChunking(
max_chunk_size=1000 # トークン数に応じて調整
)
)
# チャンク化されたMarkdownを取得
chunks = result.chunks
# ここからベクトル化してMilvus/ChromaDB等に保存
for chunk in chunks:
# embedding = embed_model.encode(chunk.content)
# vector_db.insert(embedding, chunk.metadata)
print(f"Chunk {chunk.index}: {chunk.content[:100]}...")
asyncio.run(rag_pipeline())
実際のRAG構成例
多くのプロジェクトで、以下のような構成が採用されています:
- Crawl4AI: Webコンテンツの収集とクリーニング
- Milvus / ChromaDB: ベクトルデータベース
- OpenAI / Ollama: LLMによる応答生成
公式ドキュメントには、Milvusとの統合例が詳しく紹介されています。
高度な機能
1. プロキシとセッション管理
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
async def advanced_crawl():
browser_config = BrowserConfig(
headless=True,
proxy="http://proxy.example.com:8080",
proxy_auth={"username": "user", "password": "pass"}
)
crawl_config = CrawlerRunConfig(
cache_mode="enabled", # キャッシュを有効化
wait_for="css:.content-loaded" # 特定の要素が読み込まれるまで待機
)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(
url="https://example.com",
config=crawl_config
)
print(result.markdown)
asyncio.run(advanced_crawl())
2. ブラウザプール(v0.7.7以降)
v0.7.7では、3層構造のブラウザプール(Permanent / Hot / Cold)が導入され、大規模なスクレイピング処理の効率が大幅に向上しました。
3. リアルタイム監視
Docker版では、Webベースのダッシュボードでスクレイピングの進捗をリアルタイムで監視できます。
まとめ
Crawl4AIは、従来のスクレイピングツールとは異なり、「AIが扱いやすいデータを作る」ことに特化した次世代のフレームワークです。
Crawl4AIが向いているケース:
- RAGシステムの知識ベース構築
- LLMのファインチューニング用データ収集
- AI Agentへのリアルタイム情報供給
- 定期的なドキュメントクローリング
従来ツールが向いているケース:
- シンプルな一回限りのスクレイピング
- 既存の安定したパイプライン
- AI統合が不要なデータ収集
LLMやRAGシステムを活用したプロジェクトでは、Crawl4AIを導入することで開発効率を大幅に向上させることができます。無料かつオープンソースなので、まずは試してみることをお勧めします。
Discussion