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 を機械的に再送するだけでなく、クエリ数や実行タイミングも見直します。
- レポート用データと学習用データを同じテーブルに混ぜず、スナップショット日時を必ず持たせます。