5.

Google Custom Search JSON API 完全ガイド (cx/料金/Bing比較)

編集
この記事の要点
  • Google Custom Search JSON API = Google 検索結果をプログラムから取得できる唯一の公式 API
  • 前提: Google Cloud プロジェクト + API キー + Programmable Search Engine (旧 CSE) の cx ID の3点が必須
  • 料金: 無料 100 クエリ/日、超過分は $5 / 1000 クエリ、1日最大1万クエリ
  • エンドポイント: https://www.googleapis.com/customsearch/v1?key=KEY&cx=CX&q=KEYWORD
  • 画像検索は searchType=image、サイト指定は siteSearch、PSE の設定で「Web 全体」検索も可能

Custom Search API とは

Google Custom Search JSON API は、Google が公式に提供する唯一の検索 API です。通常の google.com をスクレイピングするのは規約違反なので、自動化したい場合はこれが正規ルートです。

もともとは「自社サイト内検索」用に提供された Custom Search Engine (CSE、現 Programmable Search Engine) を API 経由で呼ぶ仕組みで、設定により Web 全体を検索することもできます。

セットアップ手順 (3 ステップ)

ステップ1: Programmable Search Engine を作成

  1. programmablesearchengine.google.com にアクセス
  2. 「追加」をクリック
  3. 名前を入力
  4. 検索対象:
    • 特定サイト内 → 「検索するサイト」に example.com を入力
    • Web 全体 → 「ウェブ全体を検索」を ON
  5. 作成後、検索エンジン ID (cx) をコピー(例: 017576662512468239146:omuauf_lfve

ステップ2: Google Cloud で API キーを取得

  1. Google Cloud Console でプロジェクト作成
  2. 「APIs & Services」→「Library」→ Custom Search API を有効化
  3. 「Credentials」→「Create credentials」→「API key」
  4. キーを取得(例: AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXX
  5. セキュリティのため HTTP referrer 制限 / IP 制限を設定推奨

ステップ3: 課金有効化(無料枠を超える場合)

無料 100 クエリ/日を超えるなら、Google Cloud で請求先アカウントの紐付けと、CSE 管理画面で Custom Search Site Restricted JSON API 課金を有効化。

基本的な呼び出し

curl "https://www.googleapis.com/customsearch/v1?key=API_KEY&cx=CX_ID&q=Laravel+tutorial"

レスポンス例:

{
  "kind": "customsearch#search",
  "queries": {
    "request": [{
      "totalResults": "12300000",
      "searchTerms": "Laravel tutorial",
      "count": 10,
      "startIndex": 1,
      "language": "lang_ja"
    }]
  },
  "searchInformation": {
    "searchTime": 0.42,
    "totalResults": "12300000"
  },
  "items": [
    {
      "kind": "customsearch#result",
      "title": "Laravel Tutorial - 初心者向け",
      "link": "https://example.com/laravel",
      "displayLink": "example.com",
      "snippet": "Laravel は PHP のフレームワーク...",
      "pagemap": { ... }
    }
  ]
}

主なクエリパラメータ

パラメータ説明
keyAPI キーAIza...
cx検索エンジン ID017576...
q検索キーワードLaravel+tutorial
num1ページの件数 (1〜10)10
start取得開始位置 (1始まり、最大91)11 (2ページ目)
lr言語制限lang_ja
gl地域 (国コード)jp
hlUI 言語ja
searchTypeimage で画像検索image
siteSearch特定サイト限定/除外example.com
dateRestrict期間 (d1=1日, m1=1月)m6
fileTypeファイル形式pdf
safeセーフサーチactive

Python で呼ぶ

import requests

API_KEY = 'YOUR_API_KEY'
CX = 'YOUR_CX_ID'

def google_search(query, start=1, num=10, **kwargs):
    params = {
        'key': API_KEY,
        'cx': CX,
        'q': query,
        'num': num,
        'start': start,
        **kwargs,
    }
    r = requests.get('https://www.googleapis.com/customsearch/v1', params=params, timeout=10)
    r.raise_for_status()
    return r.json()

# 通常検索
res = google_search('Laravel tutorial', lr='lang_ja', gl='jp')
for item in res.get('items', []):
    print(item['title'], '-', item['link'])

# 画像検索
res = google_search('猫', searchType='image', num=5)
for item in res.get('items', []):
    print(item['link'], item['image']['width'], 'x', item['image']['height'])

# 100件取得 (10件×10ページ)
all_items = []
for page in range(10):
    start = page * 10 + 1
    res = google_search('Python', start=start)
    all_items.extend(res.get('items', []))
    if 'nextPage' not in res.get('queries', {}):
        break

PHP で呼ぶ

<?php
function googleSearch(string $query, array $extra = []): array {
    $params = array_merge([
        'key' => getenv('GCS_API_KEY'),
        'cx'  => getenv('GCS_CX'),
        'q'   => $query,
        'num' => 10,
    ], $extra);
    $url = 'https://www.googleapis.com/customsearch/v1?' . http_build_query($params);
    $json = file_get_contents($url);
    return json_decode($json, true);
}

$res = googleSearch('Laravel', ['lr' => 'lang_ja', 'gl' => 'jp']);
foreach ($res['items'] ?? [] as $it) {
    echo $it['title'] . ' - ' . $it['link'] . PHP_EOL;
}

料金体系 (2026 年時点)

項目料金
無料枠100 クエリ / 日
有料$5 / 1000 クエリ
1日上限10,000 クエリ
1リクエスト最大件数10件
取得可能な最大件数 / クエリ100件 (start=91 まで)

大量に検索したい場合は 1 万クエリ/日 = 月最大 30 万クエリ = 月 $1,500 がプラン上限となります。それ以上は Custom Search Site Restricted JSON API を別途検討するか、SerpAPI / Bing API を併用。

Bing Search API との比較

項目Google Custom SearchBing Web Search v7
料金$5 / 1000$3 / 1000〜(S1〜S6 階層)
無料枠100/日月 1000 (F1)
1日上限10,000事実上無し
1リクエスト最大10件50件
サイト指定○ (siteSearch)○ (site:演算子)
提供終了予定無し2025/8/11 終了 → Azure AI Foundry 移行

よくあるエラー

HTTPエラー原因と対処
400Invalid Valuecx ID 誤り / start > 91
403Daily Limit Exceeded無料枠 100 超え → 課金有効化 or 翌日
403API key not validキー誤り / Custom Search API 未有効化
429Rate Limit Exceeded短時間多発 → スリープ + バックオフ

FAQ

Q: 通常の Google 検索結果と完全に同じになる?
A: ほぼ同じですが、パーソナライズが効かない分、若干順位が異なります。リアルユーザーの結果と完全一致は保証されません。

Q: 100件以上取得したい
A: API 仕様上 1 クエリで取得できるのは最大 100 件です。それ以上はキーワードを分割するか、SerpAPI 等を併用してください。

Q: 自社サイト内検索だけに使える?
A: いいえ、PSE の「ウェブ全体を検索」を ON にすれば一般 Web 検索として使えます。

Q: 商用利用 OK か
A: 利用規約の範囲内で OK です。ただし結果を加工せず再配布することには制限あり (検索結果の再販禁止)。

編集
Post Share
子ページ
  1. JSON API
同階層のページ
  1. YouTube Data API (v3)
  2. Twitter API
  3. Facebook API
  4. Google Trends
  5. Google Custom Search API
  6. App Store Connect API
  7. Revit API

最近更新/作成されたページ