unclecode/crawl4ai
主な特徴
- **LLM最適化**: RAGや微調整アプリケーション向けのスマートで簡潔なMarkdown生成
- **超高速パフォーマンス**: 競合他社と比較して6倍の速度でリアルタイム処理
- **柔軟なブラウザ制御**: セッション管理、プロキシ、カスタムフック機能
- **ヒューリスティックインテリジェンス**: 高価なモデルへの依存を減らす高度なアルゴリズム
- **完全オープンソース**: APIキー不要、Dockerとクラウド統合対応
- **アダプティブクローリング**: ウェブサイトのパターンを学習する革新的な機能(v0.7.0)
- **Virtual Scroll対応**: 無限スクロールページの完全サポート
- **リンクプレビュー**: 3層スコアリングによるインテリジェントなリンク分析
- **非同期URL Seeder**: 大規模なURL発見のための機能
- **20種類以上の抽出戦略**: CSS、XPath、LLM、正規表現ベースの抽出
リポジトリ解析: unclecode/crawl4ai
基本情報
- リポジトリ名: unclecode/crawl4ai
- 主要言語: Python
- スター数: 49,290
- フォーク数: 4,768
- 最終更新: 2025年(活発に開発中)
- ライセンス: Apache License 2.0
- トピックス: web-scraping, llm, ai, crawling, markdown, data-extraction, playwright, async, python
概要
一言で言うと
LLMとAIアプリケーション向けに最適化された、高速で柔軟性の高いオープンソースウェブクローラー・スクレイパーで、きれいなMarkdownを生成し、6倍の速度で動作する。
詳細説明
Crawl4AIは、GitHubで#1トレンドとなった人気のオープンソースプロジェクトで、LLM(大規模言語モデル)、AIエージェント、データパイプライン向けに特別に設計された高速ウェブクローリングツールです。従来のウェブスクレイピングツールとは異なり、AIアプリケーションに適したクリーンで構造化されたMarkdownを生成することに重点を置いています。
開発者が2023年に$16のSaaSツールに不満を持ったことがきっかけで開発され、完全にオープンソースでAPIキー不要、セルフホスト可能な代替ソリューションとして誕生しました。プロジェクトのビジョンは「データの民主化」で、個人がデータにアクセスし、自分のAIモデルをトレーニングできるようにすることを目指しています。
主な特徴
- LLM最適化: RAGや微調整アプリケーション向けのスマートで簡潔なMarkdown生成
- 超高速パフォーマンス: 競合他社と比較して6倍の速度でリアルタイム処理
- 柔軟なブラウザ制御: セッション管理、プロキシ、カスタムフック機能
- ヒューリスティックインテリジェンス: 高価なモデルへの依存を減らす高度なアルゴリズム
- 完全オープンソース: APIキー不要、Dockerとクラウド統合対応
- アダプティブクローリング: ウェブサイトのパターンを学習する革新的な機能(v0.7.0)
- Virtual Scroll対応: 無限スクロールページの完全サポート
- リンクプレビュー: 3層スコアリングによるインテリジェントなリンク分析
- 非同期URL Seeder: 大規模なURL発見のための機能
- 20種類以上の抽出戦略: CSS、XPath、LLM、正規表現ベースの抽出
使用方法
インストール
前提条件
- Python: >= 3.9
- OS: Windows、Linux、macOS対応
- 追加要件: Playwrightブラウザ(自動インストール)
インストール手順
# 方法1: pipインストール(推奨)
pip install -U crawl4ai
# プレリリース版を使用する場合
pip install crawl4ai --pre
# インストール後のセットアップ
crawl4ai-setup # ブラウザの自動セットアップ
# インストール確認
crawl4ai-doctor
# 方法2: ソースからインストール(開発者向け)
git clone https://github.com/unclecode/crawl4ai.git
cd crawl4ai
pip install -e . # 基本インストール
# オプション機能付きインストール
pip install -e ".[torch]" # PyTorch機能付き
pip install -e ".[transformer]" # Transformer機能付き
pip install -e ".[all]" # 全機能インストール
基本的な使い方
Hello World相当の例
import asyncio
from crawl4ai import AsyncWebCrawler
async def main():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://www.nbcnews.com/business"
)
print(result.markdown[:500]) # 最初の500文字を表示
if __name__ == "__main__":
asyncio.run(main())
実践的な使用例
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
from crawl4ai import DefaultMarkdownGenerator, PruningContentFilter
async def clean_content_extraction():
# クリーンなコンテンツ抽出の設定
crawler_config = CrawlerRunConfig(
excluded_tags=["nav", "footer", "aside"], # 不要なタグを除外
remove_overlay_elements=True,
markdown_generator=DefaultMarkdownGenerator(
content_filter=PruningContentFilter(
threshold=0.48,
threshold_type="fixed"
)
)
)
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://en.wikipedia.org/wiki/Apple",
config=crawler_config
)
print(f"フルMarkdown長: {len(result.markdown.raw_markdown)}")
print(f"フィットMarkdown長: {len(result.markdown.fit_markdown)}")
asyncio.run(clean_content_extraction())
高度な使い方
import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
from crawl4ai import JsonCssExtractionStrategy, LLMExtractionStrategy
import json
async def advanced_extraction():
# 構造化データ抽出(LLM不要)
schema = {
"name": "Product Listing",
"baseSelector": ".product-item",
"fields": [
{"name": "title", "selector": ".product-title", "type": "text"},
{"name": "price", "selector": ".price", "type": "text"},
{"name": "image", "selector": "img", "type": "attribute", "attribute": "src"}
]
}
browser_config = BrowserConfig(
headless=True,
java_script_enabled=True
)
crawler_config = CrawlerRunConfig(
extraction_strategy=JsonCssExtractionStrategy(schema),
# JavaScriptコード実行
js_code="""document.querySelectorAll('.load-more').forEach(btn => btn.click());""",
wait_for="() => document.querySelectorAll('.product-item').length > 20"
)
async with AsyncWebCrawler(config=browser_config) as crawler:
result = await crawler.arun(
url="https://example-shop.com/products",
config=crawler_config
)
products = json.loads(result.extracted_content)
print(f"抽出した商品数: {len(products)}")
# 複数URLの並列クローリング
urls = ["https://site1.com", "https://site2.com", "https://site3.com"]
results = await crawler.arun_many(urls, config=crawler_config)
for result in results:
if result.success:
print(f"{result.url}: {len(result.markdown)} 文字")
asyncio.run(advanced_extraction())
ドキュメント・リソース
公式ドキュメント
- README.md: プロジェクトの概要、クイックスタート、基本的な使用例
- docs.crawl4ai.com: 包括的なドキュメントサイト(v2リニューアル済み)
- CHANGELOG.md: 詳細なバージョン履歴と新機能の説明
- ROADMAP.md: 将来の開発計画(Question-Based Crawler、Knowledge-Optimal Crawlerなど)
サンプル・デモ
- quickstart.py: 基本的な使用例のコレクション
- adaptive_crawling/: アダプティブクローリングの高度な例
- amazon_product_extraction_*.py: EC商品情報抽出の実例
- crypto_analysis_example.py: 暗号通貨データ分析の例
- url_seeder_demo.py: URL発見機能のデモ
- docker_example.py: Docker API使用例
チュートリアル・ガイド
- Google Colab対応のインタラクティブノートブック
- CLI使用ガイド(
crwlコマンド) - Docker展開ガイド(ブラウザプール、APIゲートウェイ設定)
- MCP統合ガイド(Claude Codeとの連携)
- ベストプラクティスとパフォーマンス最適化ガイド
技術的詳細
アーキテクチャ
全体構造
Crawl4AIは非同期アーキテクチャを採用し、高パフォーマンスなウェブクローリングを実現しています。コアはAsyncWebCrawlerクラスで、Playwrightを使用したブラウザ制御、プラグ可能な抽出戦略、キャッシング、並列処理などを統合しています。
ディレクトリ構成
crawl4ai/
├── crawl4ai/ # メインパッケージ
│ ├── async_webcrawler.py # コアクローラー実装
│ ├── async_configs.py # 設定クラス定義
│ ├── extraction_strategy.py # 抽出戦略の実装
│ ├── markdown_generation_strategy.py # Markdown生成
│ ├── content_filter_strategy.py # コンテンツフィルタリング
│ ├── chunking_strategy.py # チャンキング戦略
│ ├── deep_crawling/ # ディープクローリング実装
│ ├── adaptive_crawler.py # アダプティブクローリング
│ └── browser_manager.py # ブラウザ管理
├── docs/ # ドキュメントとサンプル
│ ├── examples/ # 使用例コレクション
│ └── assets/ # ドキュメント用アセット
├── deploy/ # デプロイメント設定
│ └── docker/ # Docker関連ファイル
└── tests/ # テストスイート
├── async/ # 非同期テスト
└── browser/ # ブラウザテスト
主要コンポーネント
-
AsyncWebCrawler: メインクローラークラス
- 場所:
crawl4ai/async_webcrawler.py - 依存: BrowserManager、ExtractionStrategy、CacheContext
- インターフェース:
arun(),arun_many(),arun_batch()
- 場所:
-
ExtractionStrategy: 抽出戦略の基底クラス
- 場所:
crawl4ai/extraction_strategy.py - 実装: LLMExtractionStrategy、JsonCssExtractionStrategy、RegexExtractionStrategy
- インターフェース:
extract(),run()
- 場所:
-
MarkdownGenerationStrategy: Markdown生成戦略
- 場所:
crawl4ai/markdown_generation_strategy.py - 依存: ContentFilterStrategy
- インターフェース:
generate_markdown(),convert_to_markdown()
- 場所:
-
AdaptiveCrawler: アダプティブクローリング実装
- 場所:
crawl4ai/adaptive_crawler.py - 特徴: ウェブサイトパターンの学習、効率的な抽出
- インターフェース:
learn(),extract(),update_knowledge_base()
- 場所:
技術スタック
コア技術
- 言語: Python >= 3.9(非同期プログラミング、型ヒント活用)
- ブラウザ自動化: Playwright(Chromium、Firefox、WebKit対応)
- 非同期処理: asyncio、aiohttp、aiofiles
- 主要ライブラリ:
- playwright (>=1.49.0): ブラウザ自動化
- litellm (>=1.53.1): LLM統合(OpenAI、Anthropic等対応)
- beautifulsoup4 (~4.12): HTML解析
- lxml (~5.3): 高速XML/HTML処理
- rank-bm25 (~0.2): BM25アルゴリズムによる関連性スコアリング
- sentence-transformers (>=2.2.0): セマンティック検索
- pydantic (>=2.10): データバリデーション
開発・運用ツール
- ビルドツール: setuptools、wheel(pyproject.toml設定)
- テスト: pytest、包括的なテストスイート(async、browser、docker)
- CI/CD: GitHub Actions(自動テスト、リリース)
- デプロイ:
- Docker(マルチアーキテクチャ対応: AMD64/ARM64)
- FastAPI(REST API サーバー)
- JWT認証(APIセキュリティ)
設計パターン・手法
- Strategy Pattern: 抽出戦略、フィルタリング戦略、Markdown生成戦略で広範に使用
- Decorator Pattern: DeepCrawlDecoratorによる機能拡張
- Factory Pattern: BrowserManagerによるブラウザインスタンス生成
- Context Manager: AsyncWebCrawlerの
async with構文サポート - Chain of Responsibility: FilterChainによるURL/コンテンツフィルタリング
データフロー・処理フロー
- 初期化: AsyncWebCrawlerインスタンス作成、ブラウザプール初期化
- URL処理: URLの正規化、ロボット.txtチェック、キャッシュ確認
- ページ取得: Playwrightによるページロード、JavaScript実行
- コンテンツ抽出:
- HTML取得と前処理
- 指定された抽出戦略の適用
- メディア(画像、動画)の抽出
- Markdown生成:
- HTMLからMarkdownへの変換
- コンテンツフィルタリング(Pruning/BM25)
- リンクの番号付け参照リスト作成
- 後処理:
- メタデータ抽出
- キャッシュ保存
- 結果オブジェクト(CrawlResult)の生成
API・インターフェース
公開API
AsyncWebCrawler.arun()
- 目的: 単一URLの非同期クローリング
- 使用例:
result = await crawler.arun(
url="https://example.com",
config=CrawlerRunConfig(
cache_mode=CacheMode.BYPASS,
word_count_threshold=10,
excluded_tags=["nav", "footer"],
extraction_strategy=JsonCssExtractionStrategy(schema)
)
)
AsyncWebCrawler.arun_many()
- 目的: 複数URLの並列クローリング
- 使用例:
results = await crawler.arun_many(
urls=["url1", "url2", "url3"],
config=crawler_config,
max_concurrent=5
)
設定・カスタマイズ
設定ファイル
# BrowserConfig - ブラウザ設定
browser_config = BrowserConfig(
headless=True,
viewport={"width": 1920, "height": 1080},
user_agent="custom-agent",
proxy_config=ProxyConfig(server="http://proxy:8080")
)
# CrawlerRunConfig - クローリング実行設定
crawler_config = CrawlerRunConfig(
cache_mode=CacheMode.ENABLED,
js_code="// カスタムJavaScript",
wait_for="() => document.readyState === 'complete'",
extraction_strategy=CustomExtractionStrategy(),
markdown_generator=DefaultMarkdownGenerator()
)
拡張・プラグイン開発
カスタム抽出戦略の作成:
from crawl4ai import ExtractionStrategy
class CustomExtractionStrategy(ExtractionStrategy):
def extract(self, html: str, url: str, **kwargs) -> str:
# カスタム抽出ロジック
return extracted_data
カスタムフィルターの作成:
from crawl4ai.content_filter_strategy import ContentFilterStrategy
class CustomFilter(ContentFilterStrategy):
def filter_content(self, sections, **kwargs):
# カスタムフィルタリングロジック
return filtered_sections
パフォーマンス・スケーラビリティ
パフォーマンス特性
- ベンチマーク結果: 競合他社比6倍高速(公式ベンチマーク)
- 最適化手法:
- 非同期I/O処理による並列化
- ブラウザプールとページ事前ウォーミング
- インテリジェントキャッシング(TTL対応)
- BM25による効率的なコンテンツフィルタリング
- メモリアダプティブディスパッチャー
スケーラビリティ
- 並列処理:
arun_many()で数百URLの同時処理可能 - ブラウザプール: 複数ブラウザインスタンスの効率的管理
- レート制限: 組み込みのレート制限とバックプレッシャー制御
- 分散処理: Docker APIによる水平スケーリング対応
- メモリ管理: ストレステスト済み、大規模クローリング対応
制限事項
- メモリ使用: ブラウザインスタンスごとに約100-200MB
- 同時接続数: システムリソースに依存(推奨: 10-20並列)
- JavaScript実行: 複雑なSPAでは追加の待機時間が必要
- プロキシ制限: 一部のプロキシでPlaywrightの制限あり
評価・所感
技術的評価
強み
- 圧倒的な処理速度: 非同期アーキテクチャによる高速処理
- AI/LLM最適化: きれいなMarkdown生成、構造化データ抽出
- 高い柔軟性: プラグ可能なアーキテクチャ、豊富な設定オプション
- アクティブな開発: 頻繁なアップデート、コミュニティサポート
- 完全オープンソース: 透明性、カスタマイズ性、ベンダーロックインなし
改善の余地
- 学習曲線: 高度な機能を使いこなすには時間が必要
- ドキュメント: 日本語ドキュメントが不足
- エラーハンドリング: 一部のエッジケースでより詳細なエラー情報が必要
向いている用途
- AIデータパイプライン構築: RAG、ファインチューニング用データ収集
- 大規模ウェブスクレイピング: ニュース、EC、ソーシャルメディア
- リアルタイムデータ収集: 価格監視、在庫チェック
- 研究・分析: ウェブデータの体系的収集
- コンテンツ監視: ウェブサイトの変更検知
向いていない用途
- シンプルなスクレイピング: BeautifulSoupで十分な簡単なタスク
- 非ウェブデータ: APIやデータベースからの直接取得
- リソース制約環境: メモリやCPUが限られた環境
総評
Crawl4AIは、AI時代のウェブクローリングニーズに完璧に応えるツールです。特にLLMアプリケーション開発者にとって、きれいなMarkdown生成と高速処理は大きな価値があります。オープンソースで活発に開発されており、将来性も高く評価できます。初心者から上級者まで幅広く使える設計で、特にAI/MLプロジェクトでのデータ収集において第一選択となるツールです。