タイトル: Google Custom Search API
SEOタイトル: Google Custom Search JSON API 完全ガイド (cx/料金/Bing比較)
| この記事の要点 |
|
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 を作成
- programmablesearchengine.google.com にアクセス
- 「追加」をクリック
- 名前を入力
- 検索対象:
- 特定サイト内 → 「検索するサイト」に
example.comを入力 - Web 全体 → 「ウェブ全体を検索」を ON
- 特定サイト内 → 「検索するサイト」に
- 作成後、検索エンジン ID (cx) をコピー(例:
017576662512468239146:omuauf_lfve)
ステップ2: Google Cloud で API キーを取得
- Google Cloud Console でプロジェクト作成
- 「APIs & Services」→「Library」→ Custom Search API を有効化
- 「Credentials」→「Create credentials」→「API key」
- キーを取得(例:
AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXX) - セキュリティのため 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": { ... }
}
]
}
主なクエリパラメータ
| パラメータ | 説明 | 例 |
|---|---|---|
key | API キー | AIza... |
cx | 検索エンジン ID | 017576... |
q | 検索キーワード | Laravel+tutorial |
num | 1ページの件数 (1〜10) | 10 |
start | 取得開始位置 (1始まり、最大91) | 11 (2ページ目) |
lr | 言語制限 | lang_ja |
gl | 地域 (国コード) | jp |
hl | UI 言語 | ja |
searchType | image で画像検索 | 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 Search | Bing 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 | エラー | 原因と対処 |
|---|---|---|
| 400 | Invalid Value | cx ID 誤り / start > 91 |
| 403 | Daily Limit Exceeded | 無料枠 100 超え → 課金有効化 or 翌日 |
| 403 | API key not valid | キー誤り / Custom Search API 未有効化 |
| 429 | Rate Limit Exceeded | 短時間多発 → スリープ + バックオフ |
FAQ
Q: 通常の Google 検索結果と完全に同じになる?
A: ほぼ同じですが、パーソナライズが効かない分、若干順位が異なります。リアルユーザーの結果と完全一致は保証されません。
Q: 100件以上取得したい
A: API 仕様上 1 クエリで取得できるのは最大 100 件です。それ以上はキーワードを分割するか、SerpAPI 等を併用してください。
Q: 自社サイト内検索だけに使える?
A: いいえ、PSE の「ウェブ全体を検索」を ON にすれば一般 Web 検索として使えます。
Q: 商用利用 OK か
A: 利用規約の範囲内で OK です。ただし結果を加工せず再配布することには制限あり (検索結果の再販禁止)。