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

検索結果の構造化データ収集

検索結果を JSON / HTML で取得し、分析パイプラインへ投入する。

SERP API

KPI 例

  • 取得件数/日
  • クエリ成功率
  • 取得コスト

検索結果が欲しいだけなのに、通常のスクレイピングで HTML を取り、広告枠や順位を自前で解析し始めると、実装も保守も重くなります。SERP API は、検索結果ページを扱う専用入口として使うのが自然です。順位監視、ブランド保護、広告調査のように、検索結果を継続的に追う用途で特に効きます。

誰の課題か

  • 日次や週次で検索結果を追いたい SEO 担当者
  • 検索面から競合やブランド露出を観測したいマーケティングチーム
  • 検索結果を JSON として保存し、後段の集計や分析に流したいデータエンジニア

「検索結果の順位や URL を追いたい」のに Web Unlocker や Browser API から入ると、必要以上に実装が重くなります。検索結果専用の API に寄せることで、要件と製品の対応が明確になります。

推奨製品セット

製品役割このページでの使い方
SERP API検索結果取得の中核クエリ、言語、ロケーションを指定して結果を取る
API Access認証方式Bearer トークンでリクエストする
  • まずは 1 クエリを安定して取得し、保存形式を決めてからバッチ化します。
  • 検索エンジンやクエリによって返るフィールドは変わるため、保存対象は「自分が実際に確認した項目」だけに絞ります。

最小実装イメージ

curl で 1 クエリを確認する

curl -X POST https://api.brightdata.com/request \
  -H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "zone": "serp_api1",
    "payload": {
      "engine": "google",
      "q": "bright data api",
      "language": "ja",
      "location": "Tokyo",
      "num": 10
    }
  }'
  • zone には SERP API 用の zone を使います。
  • 最初は 1 クエリ、少件数で返り値を確認し、必要なフィールドだけを抜き出します。

Python で最低限の保存に落とす

import csv
import os
import requests
 
API_KEY = os.getenv("BRIGHTDATA_API_KEY")
ENDPOINT = "https://api.brightdata.com/request"
 
def fetch_serp(query: str) -> dict:
    response = requests.post(
        ENDPOINT,
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json",
        },
        json={
            "zone": "serp_api1",
            "payload": {
                "engine": "google",
                "q": query,
                "language": "ja",
                "location": "Tokyo",
                "num": 10,
            },
        },
        timeout=60,
    )
    response.raise_for_status()
    return response.json()
 
data = fetch_serp("bright data api")
 
with open("serp_snapshot.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["query", "rank", "title", "url"])
    for item in data.get("organic", []):
        writer.writerow([
            "bright data api",
            item.get("rank"),
            item.get("title"),
            item.get("link"),
        ])

この例では organic だけを見ていますが、実際には広告枠や画像枠など別の配列が返ることがあります。保存対象をむやみに増やさず、用途に必要なものだけを固定します。

運用ポイント

  • SERP API 用 zone は、他の取得系 API と分けて管理します。検索結果収集と一般ページ取得では、失敗パターンも運用指標も違うためです。
  • ページングや件数は最初から大きくせず、取得頻度と保存件数の両方で上限を決めます。
  • HTML が欲しいのか、順位や URL のような構造化項目が欲しいのかを先に決めます。後者なら SERP API を優先し続けるべきです。
  • リトライ時は、429 や 5xx を機械的に再送するだけでなく、クエリ数や実行タイミングも見直します。
  • レポート用データと学習用データを同じテーブルに混ぜず、スナップショット日時を必ず持たせます。

関連リンク