UC-CRAWL-005CrawlLv3
コンテンツ移行・アーカイブ
サイト移行やアーカイブ用途で、大量コンテンツを構造化して取得する。
Crawl API
KPI 例
- 取得件数
- 欠損率
- スキーマ適合率
サイト移行やアーカイブでは、移行対象ページの把握と取得結果の保全が先に必要です。Crawl API を使うと、対象 URL 群をジョブとしてまとめて処理し、HTML や Markdown を後から再取得できるため、移行前の棚卸しと証跡保存を同じ流れで進めやすくなります。
誰の課題か
- CMS 更改前に、どの公開ページを残すか整理したい Web 運用チーム
- 旧サイトの公開情報をアーカイブとして保管したい情報管理担当
- 移行漏れを減らすため、取得元 URL と保存物を追跡したい開発チーム
推奨製品セット
| 構成要素 | 役割 | このユースケースでの使い方 |
|---|---|---|
| Crawl API | 対象ページ収集 | 移行元 URL 群を投入して結果を保存する |
| API Access | 認証方式 | バッチや移行スクリプトから呼び出す |
| 外部ストレージまたは API ダウンロード | 保存先 | 移行前証跡やアーカイブ保管に使う |
- Crawl API Overview では content migration and archiving が代表用途として挙がっています。
- この用途では、再取得可能な
snapshot_idと保存先の管理が重要です。
最小実装イメージ
1. HTML と Markdown を意識してジョブを起動する
curl -X POST "https://api.brightdata.com/datasets/v3/trigger?dataset_id=$CRAWL_DATASET_ID&include_errors=true&custom_output_fields=page_html,markdown" \
-H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{"url":"https://example.com/"},
{"url":"https://example.com/blog/"},
{"url":"https://example.com/help/"}
]'- 移行元の見た目確認には HTML、本文比較や検索用には Markdown が使いやすい組み合わせです。
- 保存先を Webhook や外部ストレージにする場合でも、起点は同じ非同期ジョブです。
2. 取得結果をローカル保存用に整える
import json
import os
import time
from pathlib import Path
import requests
api_key = os.environ["BRIGHTDATA_API_KEY"]
dataset_id = os.environ["CRAWL_DATASET_ID"]
headers = {"Authorization": f"Bearer {api_key}"}
output_dir = Path("archive_export")
output_dir.mkdir(exist_ok=True)
trigger = requests.post(
f"https://api.brightdata.com/datasets/v3/trigger?dataset_id={dataset_id}&include_errors=true&custom_output_fields=page_html,markdown",
headers={**headers, "Content-Type": "application/json"},
json=[
{"url": "https://example.com/"},
{"url": "https://example.com/blog/"},
{"url": "https://example.com/help/"},
],
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)
rows = requests.get(
f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json",
headers=headers,
timeout=120,
).json()
(output_dir / "snapshot.json").write_text(
json.dumps(rows, ensure_ascii=False, indent=2),
encoding="utf-8",
)
for index, row in enumerate(rows, start=1):
stem = f"{index:03d}"
(output_dir / f"{stem}.md").write_text(row.get("markdown", ""), encoding="utf-8")
(output_dir / f"{stem}.html").write_text(row.get("page_html", ""), encoding="utf-8")snapshot.jsonを 1 本残しておくと、移行後に元データを追い直しやすくなります。- Markdown と HTML を分けて保存すると、検索用途と検証用途を分離できます。
運用ポイント
- 移行では「全取得」より「何を残すか」を先に決めるほうが重要です。対象 URL 一覧と除外ルールを先に固めるべきです。
- 取得結果だけでなく、
snapshot_id、実行日、保存先を記録しておくと、移行後の照合や監査で役立ちます。 - 大きいアーカイブは API 直ダウンロードだけに頼らず、外部ストレージ配送も前提にしたほうが安全です。
- 保持期間や削除条件は、アーカイブ目的でも社内ポリシーに合わせて定義する必要があります。