プログラマー向けモードで表示中ビジネスユーザー向けへ
Bright Data 学習ポータル
UC-CRAWL-002CrawlLv3

SEO 監査・サイト構造分析

サイト構造・内部リンク網・メタ情報を収集し、SEO 改善案を導出する。

Crawl API

KPI 例

  • 被リンク密度
  • 孤立ページ率
  • 重複率

SEO 監査では、数ページを目視確認するだけでは内部リンクの偏りや更新漏れを見つけにくくなります。Crawl API を使うと、複数 URL をまとめて収集し、後段でタイトルや見出し、リンク先、構造化データの有無を監査しやすい形に整えられます。

誰の課題か

  • 中規模以上のサイトを定期監査したい SEO 担当者
  • サイト移設や IA 変更前後で、内部リンク構造の差分を見たい開発チーム
  • サイトマップだけでは把握しきれない公開ページ群を、実クロールで確認したい運用担当

推奨製品セット

構成要素役割このユースケースでの使い方
Crawl API広域クロール対象 URL 群を投入して監査元データを作る
API Access認証方式自動ジョブや CI から同一の呼び出し形にする
Webhook または API ダウンロード結果取得監査バッチの完了後にまとめて取り込む
  • Crawl API Overview では SEO audits and site structure analysis が明示的な用途です。
  • 実際の SEO 判定ロジックは自前実装でもよく、Crawl API はその元データ収集を担います。

最小実装イメージ

1. HTML と構造化フィールドを含めてジョブを起動する

curl -X POST "https://api.brightdata.com/datasets/v3/trigger?dataset_id=$CRAWL_DATASET_ID&include_errors=true&custom_output_fields=page_html,ld_json" \
  -H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {"url":"https://example.com/"},
    {"url":"https://example.com/category/"},
    {"url":"https://example.com/blog/"}
  ]'
  • 監査用途では Markdown より page_htmlld_json のほうが使いやすい項目があります。
  • 必要な出力だけを指定し、不要なフィールドを増やしすぎないほうが後処理が軽くなります。

2. 取得結果から簡単な監査 CSV を作る

import csv
import os
import time
import requests
from bs4 import BeautifulSoup
 
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=page_html,ld_json",
    headers={**headers, "Content-Type": "application/json"},
    json=[
        {"url": "https://example.com/"},
        {"url": "https://example.com/category/"},
        {"url": "https://example.com/blog/"},
    ],
    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()
 
with open("seo_audit.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["url", "title", "h1_count", "has_ld_json"])
    for row in rows:
        html = row.get("page_html", "")
        soup = BeautifulSoup(html, "html.parser")
        title = soup.title.string.strip() if soup.title and soup.title.string else ""
        h1_count = len(soup.find_all("h1"))
        has_ld_json = bool(row.get("ld_json"))
        writer.writerow([row.get("url", ""), title, h1_count, has_ld_json])
  • この例では、取得した HTML から最低限の監査指標だけを抜き出しています。
  • canonical、meta description、内部リンク数などは同じ流れで追加できます。

運用ポイント

  • SEO 監査は 1 回で終わらないため、同じ URL 群を定期的に再実行し、差分比較できる保存形式にしておくと有効です。
  • 監査指標は「タイトル欠損」「H1 重複」「構造化データ有無」など、改善アクションに直結するものから始めるほうが運用しやすくなります。
  • サイト全体を広げすぎるとノイズが増えるため、対象ドメイン、監査対象パス、除外方針を先に定義しておくべきです。
  • 長いジョブは snapshot_id で追跡し、完了通知や外部保存を使って集計バッチに渡す構成が安定します。

関連リンク