powered by TechFeed
表示モード
ハウツー

PythonでRAG用データセットを作るWebクローリングパイプライン — 静的・動的ページ両対応、robots.txt考慮まで一気通貫

6月20日、MarkTechPostが「Crawlee for Python: Build a Web Crawling Pipeline with Robots Handling, Link Graphs, and RAG Chunk Export」と題した記事を公開した。この記事では、PythonのCrawleeを使ってWebクローリングパイプラインを構築し、RAG用データセットとして出力するまでの一連の実装手順について詳しく紹介されている。

6月20日、MarkTechPostが「Crawlee for Python: Build a Web Crawling Pipeline with Robots Handling, Link Graphs, and RAG Chunk Export」と題した記事を公開した。この記事では、PythonのCrawleeを使ってWebクローリングパイプラインを構築し、RAG用データセットとして出力するまでの一連の実装手順について詳しく紹介されている。


RAGシステムの品質は、インプットデータの品質に直結する。Webから構造化されたテキストチャンクを取得するパイプラインを自力で作るのは意外と手間がかかるが、Crawlee for Pythonはその工程をかなり整理してくれる。本チュートリアルはその全体像を、実際に動くコードで示している。

構成の全体像

このチュートリアルは以下のフェーズで構成されている。

  1. Crawleeランタイムの環境セットアップ(Pydantic・Playwright含む)
  2. ローカルデモサイトの生成(クロール対象として使う疑似ECサイト)
  3. BeautifulSoupCrawlerによる静的HTMLクロール
  4. ParselCrawlerによるCSS/XPathベースの精密抽出
  5. PlaywrightCrawlerによるJavaScriptレンダリング対応クロール
  6. リンクグラフ生成・RAGチャンク出力などの後処理

最大のポイント:3種のクローラーを使い分ける設計

このチュートリアルの核心は、用途に応じた3つのクローラーの使い分けにある。

BeautifulSoupCrawler(静的HTML)

高速な再帰HTMLクロール向け。ページタイトル、メタデータ、テキストプレビュー、発リンク、製品属性、ドキュメントの見出し、コードブロック、ブログタグを抽出する。

ParselCrawler(CSS/XPath精密抽出)

製品詳細ページなど、構造が決まっているページへの精密なデータ抽出に使う。ParselはScrapyでも採用されているライブラリで、CSSセレクタとXPathの両方が使える。

PlaywrightCrawler(JS描画ページ)

ヘッドレスChromiumでJavaScriptをレンダリングし、動的に生成されたDOM要素を待機してからデータを取得する。フルページスクリーンショットの保存も行う。PlaywrightはMicrosoft製のブラウザ自動化ライブラリで、Selenium的な用途に加えクロール・テスト用途でも広く使われている。

環境セットアップの実装

Colab環境での動作を前提に、Pydanticのバージョン固定(>=2.11,<2.12)とPlaywrightのインストールを自動化している。セットアップ完了を示すセンチネルファイルで二重インストールを防ぐ設計になっている点が実用的だ。

sh(
    f'{sys.executable} -m pip install -q -U '
    f'"pydantic>=2.11,<2.12" '
    f'"crawlee[all]" '
    f'pandas matplotlib networkx nest_asyncio beautifulsoup4 parsel'
)
sh(f'{sys.executable} -m playwright install --with-deps chromium', check=False)

セットアップ後にColabランタイムが自動再起動するため、os.kill(os.getpid(), 9)でプロセスを落とす処理も含まれている。

クロール対象のデモサイト生成

外部サイトをスクレイピングせずに済むよう、チュートリアル内でローカルの疑似ECサイトを生成する。このアプローチは学習用として理にかなっている。

生成されるサイトには以下が含まれる。

  • 製品詳細ページ(価格・評価・在庫・JSON-LDメタデータ付き)
  • ドキュメントページ・ブログ記事
  • JavaScriptレンダリングが必要なカタログページ
  • robots.txt/admin/ディレクトリをDisallow)
  • 内部リンクによる再帰クロール用の構造

製品データのサンプルは以下のように定義されている。

PRODUCTS = [
    {
        "sku": "CRW-303",
        "name": "RAG Extraction Bundle",
        "category": "ai-data",
        "price": 199.0,
        "rating": 4.9,
        "stock": 13,
        "features": ["clean text chunks", "metadata capture", "JSONL export"],
        "related": ["CRW-101", "CRW-505"],
    },
    ...
]

robots.txtハンドリングとリンクグラフ

robots.txtDisallowルールを自動で尊重する機能はCrawlee側が担う。/admin/配下のページはクロール対象から除外される。

クロール後は**NetworkXでページ間のリンクグラフを生成**し、可視化する処理も含まれる。どのページがハブになっているかを把握するのに使える。

RAGチャンク出力

収集したテキストをRAGパイプラインに流し込みやすい形に整形して出力する。具体的にはJSONLフォーマットでのエクスポートで、チャンク単位のテキストとメタデータ(URL、ページタイトル等)がセットになる構造だ。元記事ではこの出力形式の詳細な用途について明示的な言及はないが、JSONLはLangChainやLlamaIndexをはじめとする主要RAGフレームワークが広くサポートしている標準的な形式である。

RAGパイプラインにおけるWebクロールの位置づけ

RAGはベクトルDBへの格納・検索を組み合わせてLLMの回答精度を高める手法だが、その前段となるデータ収集・前処理の質が最終的な精度を大きく左右する。本チュートリアルが扱うのはまさにその前処理工程であり、「クロールして終わり」ではなくRAGデータセットとして使える形に持っていくところまでカバーしている点が実用的だ。RAGの基本的な仕組みについてはRetrieval-Augmented Generation(RAG)の概要(AWS解説)も参考になる。静的・動的ページの両方に対応し、robots.txtも考慮した設計になっており、Google ColabとローカルPython環境の両方で動作する。

詳細はCrawlee for Python: Build a Web Crawling Pipeline with Robots Handling, Link Graphs, and RAG Chunk Exportを参照していただきたい。