UC-CRAWL-001CrawlLv3Lv4
AI / LLM 学習データ収集
ドメイン横断クロールで Markdown / JSON 化し、RAG・学習データの前処理に投入する。
Crawl API
KPI 例
- 対象 URL 数
- 抽出成功率
- トークン効率
AI / LLM 向けの学習データ収集では、HTML をただ保存するだけでは後工程が重くなります。Bright Data の Crawl API は、複数 URL をジョブとして投入し、Markdown や構造化フィールドで取り出せるため、RAG や学習データの前処理ラインに載せやすいのが利点です。
誰の課題か
- ドキュメントサイト、ブログ、ヘルプセンターをまとめて収集したい AI エンジニア
- 自前クローラでは URL 管理、再実行、出力整形の負荷が高いデータ基盤チーム
- LLM にそのまま渡せる Markdown を優先しつつ、必要に応じて HTML や JSON 系の出力も残したいチーム
推奨製品セット
| 構成要素 | 役割 | このユースケースでの使い方 |
|---|---|---|
| Crawl API | クロール実行の中心 | URL 群を投入し、snapshot_id を受け取る |
| API Access | 認証方式 | Authorization: Bearer $BRIGHTDATA_API_KEY で呼び出す |
| Webhook または外部ストレージ | 結果配送 | 大きいジョブをポーリングし続けずに受け取る |
- 公式 Overview では、Crawl API は AI training data collection を主用途の 1 つとして挙げています。
- Quick Start では、API ベースの収集で
snapshot_idを受け取り、後から結果を取得する流れが示されています。
最小実装イメージ
1. crawl ジョブを起動する
curl -X POST "https://api.brightdata.com/datasets/v3/trigger?dataset_id=$CRAWL_DATASET_ID&include_errors=true&custom_output_fields=markdown" \
-H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{"url":"https://example.com/docs/getting-started"},
{"url":"https://example.com/docs/authentication"}
]'CRAWL_DATASET_IDには Crawl API 用 dataset ID を入れます。custom_output_fields=markdownを使うと、後段の RAG 前処理に載せやすい出力を優先できます。
2. 完了を待って結果を取得する
import os
import time
import requests
api_key = os.environ["BRIGHTDATA_API_KEY"]
dataset_id = os.environ["CRAWL_DATASET_ID"]
headers = {"Authorization": f"Bearer {api_key}"}
trigger = requests.post(
f"https://api.brightdata.com/datasets/v3/trigger?dataset_id={dataset_id}&include_errors=true&custom_output_fields=markdown",
headers={**headers, "Content-Type": "application/json"},
json=[
{"url": "https://example.com/docs/getting-started"},
{"url": "https://example.com/docs/authentication"},
],
timeout=60,
)
trigger.raise_for_status()
snapshot_id = trigger.json()["snapshot_id"]
while True:
progress = requests.get(
f"https://api.brightdata.com/datasets/v3/progress/{snapshot_id}",
headers=headers,
timeout=60,
)
progress.raise_for_status()
status = progress.json()["status"]
if status == "ready":
break
if status == "failed":
raise RuntimeError(f"snapshot failed: {snapshot_id}")
time.sleep(10)
result = requests.get(
f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json",
headers=headers,
timeout=120,
)
result.raise_for_status()
print(result.text[:1000])- Quick Start のとおり、Crawl API は
snapshot_idを返し、あとで取得する非同期フローが基本です。 - 大量件数では API 直ダウンロードより Webhook や外部ストレージ配送のほうが運用しやすくなります。
運用ポイント
- 学習データ用途では、まず
markdownを試し、原文検証や再抽出が必要なページだけ HTML 系出力を追加するほうが扱いやすいです。 snapshot_id、投入 URL、実行日時、出力形式を保存しておくと、学習データ更新時の差分追跡がしやすくなります。- Crawl API Overview では scheduler support と webhook delivery が案内されているため、定期更新や継続収集はジョブ前提で組むのが自然です。
- 公開情報を対象にしても、取得範囲、保持期間、削除条件、利用規約確認の手順は先に決めておく必要があります。