プログラマー向けモードで表示中ビジネスユーザー向けへ
Bright Data 学習ポータル
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 直ダウンロードだけに頼らず、外部ストレージ配送も前提にしたほうが安全です。
  • 保持期間や削除条件は、アーカイブ目的でも社内ポリシーに合わせて定義する必要があります。

関連リンク