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

Top100 結果を 1 コールで収集

Google の仕様変更に追従しつつ上位 100 件を 1 コールで取得する運用を作る。

SERP API

KPI 例

  • 1 クエリあたり件数
  • 取得コスト
  • 失敗率

Google 検索の Top100 を 1 回で取得する実装は、2025 年 9 月 10 日以降に前提が変わりました。Bright Data の現行 docs では、Google の num 仕様変更により、Top100 は SERP の /request ではなく Scrapers の Google SERP 100 Results を使う構成が案内されています。

誰の課題か

  • SEO チームが、上位 100 件を毎回同じ方式で取得したい
  • 分析担当が、ページング処理を自前で持ちたくない
  • 運用担当が、Google 側の仕様変更の影響を最小化したい

推奨製品セット

製品役割使いどころ
ScrapersTop100 の取得本体Google の 1..10 ページ相当を 1 ジョブで取得する
SERP API通常の単ページ取得Top10 や日常の確認用
API Access認証方式Trigger、Progress、Snapshot を呼ぶ
  • 2025-09-10 以降は、Top100 を /requestnum=100 前提で書かないようにします。
  • Bright Data の現行ガイドでは、Dataset ID gd_mfz5x93lmsjjjylob を使う方式が案内されています。

最小実装イメージ

curl

curl -X POST "https://api.brightdata.com/datasets/v3/trigger?dataset_id=gd_mfz5x93lmsjjjylob&include_errors=true" \
  -H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[{
        "url": "https://www.google.com/",
        "keyword": "bright data",
        "language": "en",
        "country": "US",
        "start_page": 1,
        "end_page": 10
      }]'

Python

import os
import time
import requests
 
API_KEY = os.environ["BRIGHTDATA_API_KEY"]
DATASET_ID = "gd_mfz5x93lmsjjjylob"
 
trigger = requests.post(
    f"https://api.brightdata.com/datasets/v3/trigger?dataset_id={DATASET_ID}&include_errors=true",
    headers={"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"},
    json=[{
        "url": "https://www.google.com/",
        "keyword": "bright data",
        "language": "en",
        "country": "US",
        "start_page": 1,
        "end_page": 10,
    }],
    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={"Authorization": f"Bearer {API_KEY}"},
        timeout=60,
    )
    progress.raise_for_status()
    status = progress.json()["status"]
    if status == "ready":
        break
    time.sleep(5)
 
result = requests.get(
    f"https://api.brightdata.com/datasets/v3/snapshot/{snapshot_id}?format=json",
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)
result.raise_for_status()
rows = result.json()
 
print("rows:", len(rows))
  • start_page: 1end_page: 10 が Top100 相当です。
  • これは非同期ワークフローなので、Trigger 後に snapshot_id を使って進捗確認と結果取得を行います。

運用ポイント

  • Top100 は通常の 1 ページ取得よりペイロードが大きいため、非同期前提で設計します。
  • 単純な順位監視だけなら Top10 で足りることも多いので、用途ごとに深さを分けます。
  • include_paginated_html が必要な場合だけ有効化し、不要な HTML 取得でデータ量を増やさないようにします。
  • num=100 前提の古い実装が残っていないか、2025-09-10 以降のコードは必ず見直します。

関連リンク