🕷️

[入門] 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構成例

多くのプロジェクトで、以下のような構成が採用されています:

  1. Crawl4AI: Webコンテンツの収集とクリーニング
  2. Milvus / ChromaDB: ベクトルデータベース
  3. 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