Apify Website Content Crawlerで実現する、LLM向けWebスクレイピングの完全ガイド

LLMを活用したAIアプリケーションの開発において、最新の外部情報をどう取り込むかは大きな課題です。この記事では、Webサイトから効率的にデータを収集し、LLMが扱いやすい形式で出力できる「Apify Website Content Crawler」の仕組みと活用法を、初心者にも分かりやすく段階的に解説します。実際のコード例や設定方法、コスト目安まで網羅し、すぐに実践できる内容をお届けします。

目次

  1. Apify Website Content Crawlerとは
  2. 第1段階:クローリング(Webページの検出とダウンロード)
  3. 第2段階:HTMLの処理(ノイズ除去と内容抽出)
  4. 第3段階:出力形式への変換と保存
  5. LLMエコシステムとの統合方法
  6. コスト目安と料金体系
  7. 実践:初心者向けセットアップ手順
  8. よくある失敗例と注意点
  9. まとめ:次に試すべきこと

Apify Website Content Crawlerとは

Apify Website Content Crawlerは、LLM(大規模言語モデル)向けにWebサイトから高品質なテキストコンテンツを抽出するために特別に設計されたツールです。単なるスクレイピングツールではなく、RAG(Retrieval Augmented Generation)システムやベクトルデータベースへの統合を前提とした「AIファースト」な設計が特徴です。^1

主な特徴

  • LangChain、LlamaIndex、Haystackなどの主要LLMフレームワークとの直接統合^1
  • Markdown、HTML、プレーンテキストなど、LLMが扱いやすい形式での出力^3
  • JavaScript実行が必要な動的Webサイトにも対応^4
  • ナビゲーション、フッター、広告などの不要要素を自動除去^1
  • 6,000以上のプリビルトActorsを持つApifyエコシステムの一部^5

このツールは「Actor」と呼ばれるApifyのサーバーレスプログラムとして実装されており、設定して実行ボタンを押すだけで使い始められます。^7


第1段階:クローリング(Webページの検出とダウンロード)

Website Content Crawlerは、開始URL(Start URLs)から始まり、同じドメイン内のリンクを再帰的にたどってページを自動探索します。^1

基本的な動作

開始URLがhttps://example.com/blog/の場合、以下のように動作します:

  • 取得されるhttps://example.com/blog/article-1https://example.com/blog/section/article-2など
  • スキップされるhttps://example.com/docs/something-elseなど、開始URLの範囲外のページ

この仕組みにより、ドキュメントサイトやブログなど、特定のセクション全体を効率的にクローリングできます。^1

クローラータイプの選択

Webサイトの特性に応じて、3種類のクローラーから選択可能です:^1

クローラータイプ特徴適した用途
適応的クローラー(デフォルト)静的ページではHTTPリクエスト、動的ページではFirefoxブラウザを自動切り替え多様なサイト構成に対応
ヘッドレスブラウザ(Firefox + Playwright)JavaScript実行、アンチスクレイピング対策に対応。CAPTCHA検出と自動リトライ機能付き^1モダンなWebアプリケーション
Raw HTTPクライアント最速・最低コストだが、JavaScriptに非対応^1静的HTMLサイト

クローリング制御オプション

細かい制御が可能な設定項目:^1

  • URL除外パターン(globs)https://{store,docs}.example.com/**のようなパターンで特定URL範囲をスキップ
  • 最大ページ数(maxCrawlPages):デフォルト20ページ。0に設定すると開始URLのみ取得
  • サイトマップ活用:Webサイトのサイトマップを使用して、より多くのURLを自動発見
  • 最大クローリング深度:リンクをたどる階層の深さを制限^4

第2段階:HTMLの処理(ノイズ除去と内容抽出)

ダウンロードしたHTMLから、価値のあるコンテンツのみを抽出し、ナビゲーション、ヘッダー、フッター、モーダル、クッキー警告などの不要な要素を自動削除します。^1

動的コンテンツの読み込み制御

ヘッドレスブラウザを使用する場合の高度な制御:^1

待機時間の設定
ページ読み込み後、指定秒数待つことでJavaScriptの実行完了を確保します。^8

// Puppeteerでの実装例
await page.goto(targetUrl, { 
  waitUntil: 'networkidle0' // JavaScriptレンダリングを待つ 
});

スクロール高さの設定
無限スクロール対応ページの場合、指定した高さまでスクロールして隠れていたコンテンツも取得します。^1

クリック可能要素の展開
有効化すると、DOMの折りたたまれた要素を自動クリックして展開内容を表示します。^1

HTMLの変換と除去

より粒度の細かい制御が可能です:^1

  • CSSセレクタによる要素削除Remove HTML elementsオプションでナビゲーション、ヘッダー、フッター、スクリプト、インライン画像などを自動削除
  • CSSセレクタによる要素抽出Extract HTML elementsを指定して、特定要素のコンテンツのみを保持^9
  • クッキー警告の自動削除Remove cookie warningsオプションで自動除去^1
  • HTMLトランスフォーマーの選択:ページの複雑度を削減し、重要コンテンツのみを抽出^1

ファイルダウンロード機能

リンク先のドキュメントファイルも自動ダウンロード可能です:^1

  • 対応形式:PDF、DOC、DOCX、XLS、XLSX、CSV
  • 単一ファイルダウンロードの最大時間:1時間
  • 最小ダウンロード速度設定:KB/s単位で設定でき、それ以下になると自動中止

第3段階:出力形式への変換と保存

処理済みのHTMLを、LLMが扱いやすい複数の形式に変換します。^1

利用可能な出力形式

形式特徴用途
Markdown見出し、コードブロック、リスト、スタイル情報を保持。LLM向けに最適^1RAGシステム、ベクトルDB
プレーンテキストすべての書式情報を削除した純粋なテキスト^1シンプルなテキスト分析
HTML完全なHTML構造を保持^1デバッグ、詳細な構造が必要な場合
スクリーンショットページの視覚的な確認用^1デバッグ

メタデータの抽出

各ページについて以下の情報が自動抽出されます:^1

  • 著者情報
  • ページタイトル
  • メタディスクリプション
  • 言語コード
  • Canonical URL
  • 公開日時

出力データ構造

JSON形式の出力例:^1

{
  "url": "https://example.com/article",
  "text": "抽出されたプレーンテキスト(ナビゲーション、メニュー等を除去)",
  "markdown": "# 見出し\n\nMarkdown形式に変換されたコンテンツ",
  "html": "<html>処理済みHTML</html>",
  "metadata": {
    "author": "著者名",
    "title": "ページタイトル",
    "description": "メタディスクリプション",
    "languageCode": "ja",
    "canonicalUrl": "https://example.com/article",
    "publishedDate": "2025-01-15"
  },
  "crawl": {
    "loadedUrl": "https://example.com/article",
    "loadedTime": "2025-11-17T08:39:00Z",
    "referrerUrl": "https://example.com/",
    "depth": 1
  }
}

LLMエコシステムとの統合方法

Website Content Crawlerは、主要なLLMフレームワークと直接統合できるよう設計されています。^1

LangChain統合

Python実装例^2

import os
from langchain.indexes import VectorstoreIndexCreator
from langchain_apify import ApifyWrapper
from langchain_core.documents import Document
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# APIキーの設定
os.environ["OPENAI_API_KEY"] = "あなたのOpenAI APIキー"
os.environ["APIFY_API_TOKEN"] = "あなたのApify APIトークン"

# Apify Wrapperの初期化
apify = ApifyWrapper()
llm = ChatOpenAI(model="gpt-4o-mini")

# Website Content Crawlerを実行してドキュメントを取得
loader = apify.call_actor(
    actor_id="apify/website-content-crawler",
    run_input={
        "startUrls": [{"url": "https://docs.example.com/"}],
        "maxCrawlPages": 10,
        "crawlerType": "cheerio"
    },
    dataset_mapping_function=lambda item: Document(
        page_content=item["text"] or "",
        metadata={"source": item["url"]}
    ),
)

# ベクトルデータベースの初期化
index = VectorstoreIndexCreator(
    embedding=OpenAIEmbeddings()
).from_loaders([loader])

# クエリの実行
query = "What is LangChain?"
result = index.query_with_sources(query, llm=llm)
print("answer:", result["answer"])
print("source:", result["sources"])

このコードにより、WebサイトのコンテンツをLangChainのベクトルデータベースに直接流し込め、ChatGPT風の質問回答システムが構築できます。^1

LlamaIndex統合

同様にLlamaIndexでも、Apify統合を通じて外部データをLLMアプリケーションに接続可能です。^1

from llama_index.core import Document
from llama_index.readers.apify import ApifyActor

reader = ApifyActor("<My Apify API token>")
documents = reader.load_data(
    actor_id="apify/website-content-crawler",
    run_input={
        "startUrls": [{"url": "https://docs.llamaindex.ai/en/latest/"}]
    },
    dataset_mapping_function=lambda item: Document(
        text=item.get("text"),
        metadata={"url": item.get("url")},
    ),
)

ベクトルデータベース統合(Pinecone、Qdrant)

PineconeやQdrant統合Actorを通じて、クローリング結果を直接ベクトルデータベースにアップロード可能です。増分更新対応で、変更部分のみ再埋め込みができます。^1

カスタムGPTへのエクスポート

JSONフォーマットでエクスポート後、カスタムGPTにアップロードして、Webサイトの内容をGPTの知識ベースとして活用できます。^1


コスト目安と料金体系

Website Content Crawlerの使用料は、Apifyプラットフォーム上でのCompute Units(CU)に基づきます。^11^13

Compute Unitとは

1 CU = 1GBメモリで1時間実行した場合に相当します。^12

計算式

CU = メモリ(GB) × 実行時間(時間)

  • 4GBメモリで15分実行 → 1 CU(4 × 0.25 = 1)
  • 1GBメモリで30分実行 → 0.5 CU(1 × 0.5 = 0.5)

料金プラン

プラン月額料金CU単価特徴
Free\$0\$0.3/CU月\$5のクレジット付与^13
Starter\$39\$0.3/CU\$39のクレジット付与^13
Scale\$199\$0.25/CU\$199のクレジット付与、優先サポート^13
Business\$999\$0.2/CU\$999のクレジット付与、専任マネージャー^13

概算コスト

Webサイトの複雑度により変動しますが、以下が目安です:

  • ヘッドレスブラウザ使用時:1,000ページあたり\$0.5~\$5^1
  • Raw HTTPクローラー使用時:1,000ページあたり\$0.2^1

無料プランでは、毎月\$5のクレジット付与と無制限のApify Proxyアクセスが可能で、テストや低容量用途に十分です。^13


実践:初心者向けセットアップ手順

ここからは、実際にWebsite Content Crawlerを使い始める手順を解説します。

ステップ1:Apifyアカウントの作成

  1. Apify公式サイト無料アカウントを作成^6
  2. メールアドレスで登録(クレジットカード不要)^5
  3. ダッシュボードにアクセス

ステップ2:Website Content Crawlerの実行

  1. Apify Storeで「Website Content Crawler」を検索^5
  2. Try for free」をクリック^5
  3. Start URLsに対象URLを入力:
{
  "startUrls": [
    {"url": "https://docs.example.com/"}
  ],
  "maxCrawlPages": 20,
  "crawlerType": "adaptive"
}
  1. Start」ボタンをクリックして実行^6

ステップ3:結果の確認

実行完了後、Datasetタブで結果を確認できます。JSON、CSV、Excel形式でエクスポート可能です。^1

ステップ4:API経由での実行(Python)

Python SDK実装例^5

from apify_client import ApifyClient

# APIトークンで初期化
client = ApifyClient("あなたのAPIトークン")

# Actorを実行
run = client.actor("apify/website-content-crawler").call(
    run_input={
        "startUrls": [{"url": "https://example.com"}],
        "maxCrawlPages": 100,
        "crawlerType": "adaptive"
    }
)

# 結果を取得
items = client.dataset(run["defaultDatasetId"]).list_items().items
for item in items:
    print(f"URL: {item['url']}")
    print(f"Text: {item['text'][:200]}...")

よくある失敗例と注意点

Webスクレイピングを成功させるために、以下の点に注意しましょう。

法的・倫理的リスク

  • 利用規約の確認:スクレイピング対象サイトの利用規約を必ず確認し、禁止されていないか確認^14
  • robots.txtの遵守:サイトのrobots.txtファイルでクローリングが許可されているか確認^14
  • APIの優先利用:サイトがAPIを提供している場合は、そちらを優先的に利用^15

技術的な失敗例

大量リクエストによるサーバー負荷^14

  • 問題:一度に大量のリクエストを送ると、サーバーに負荷がかかりIPブロックされる
  • 対策:適切な間隔(数秒)を設けてリクエストを送る。ApifyではmaxConcurrency設定で制御可能^1

動的コンテンツの読み込み失敗^8

  • 問題:JavaScriptで読み込まれるコンテンツが取得できない
  • 対策:ヘッドレスブラウザを使用し、waitUntil: 'networkidle0'で待機^8

ページ構造の変更^16

  • 問題:サイトのHTML構造が変わると、スクレイピングが機能しなくなる
  • 対策:定期的にスクリプトを確認し、必要に応じて調整。Website Content Crawlerは汎用的な抽出を行うため、影響を受けにくい^1

LLM向けデータ準備のベストプラクティス

高品質なデータの確保^18

  • データのクリーニングと前処理を徹底する
  • ノイズの多いデータは性能低下の原因になる^20

適切なテキスト形式の選択^21

  • Markdown形式はLLMとの相性が良い^10
  • 構造化データが必要な場合はJSON形式を選択^23

データの多様性とバランス^24

  • 偏ったデータは学習に悪影響を与える
  • 複数ソースからのデータを統合してバランスを取る^24

まとめ:次に試すべきこと

Apify Website Content Crawlerは、Webサイトからのデータ収集→ノイズ除去→LLM向け形式への変換という一連のワークフローを自動化し、RAGシステムやベクトルデータベースとの統合を簡単に実現します。^1

この記事の要点

  1. 3段階の処理フロー:クローリング→HTML処理→出力変換により、高品質なデータを自動抽出^1
  2. LLMエコシステムとの直接統合:LangChain、LlamaIndex、Pinecone、Qdrantなど主要フレームワークとシームレスに連携^2
  3. 柔軟なクローラー設定:静的サイトから動的サイトまで、サイト特性に応じた最適な抽出方法を選択可能^4
  4. コスト効率の良さ:無料プランから始められ、使用量に応じた柔軟な料金体系^13
  5. 初心者でも使いやすい:GUIベースの設定とプリビルトツールで、プログラミング知識がなくても利用可能^5

次のステップ

Step 1:無料アカウントで試す
Apify公式サイトで無料アカウントを作成し、Website Content Crawlerを実行してみましょう。^5

Step 2:LangChainとの統合を実装
上記のPythonコード例を参考に、実際にRAGシステムを構築してみてください。^2

Step 3:カスタムGPTに統合
抽出したデータをカスタムGPTの知識ベースとして活用し、独自のAIアシスタントを作成しましょう。^1

Step 4:定期実行の自動化
Apifyのスケジューラー機能を使って、定期的にWebサイトの最新情報を取得する仕組みを構築できます。^6

これらのステップを通じて、最新情報にアクセスできるLLMアプリケーションを効率的に構築できるようになります。まずは無料プランで小さく始めて、徐々に規模を拡大していくことをお勧めします。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール