はじめに
Web 上の情報をプログラムから収集する際、Python から Google の検索結果をデータとして取得したい場面があります。これまでは Google の Custom Search JSON API がその選択肢の 1 つでしたが、状況が変わりました。
Custom Search JSON API は新規受付を終了しており、これから使い始めることはできません。また、既存ユーザー向けにも 2027 年 1 月 1 日での提供終了が予定されています。そのため、本記事ではこの API の取得手順ではなく、現在も新規に利用できる代替手段を中心に、Python から検索結果を取得する方法を解説します。
- Google の検索結果を API で取得する手段の現状(終了したものと、今使えるもの)
- SerpApi の料金・無料枠と、課金がカウントされる仕組み
- Python から検索結果を JSON で取得する実装(基本・URL 一括収集・デスクトップ検索ツール)
- 実務での注意点と、他の代替サービスとの使い分け
新規ユーザーが使える「無料・公式・Google の Web 検索そのもの」の API は、現状では提供されていません。プログラムから Google の検索結果をデータとして取得したい場合は、第三者の SERP API を利用するのが現実的です。本記事では、その中から Python の実装例として SerpApi を中心に取り上げ、無料枠の範囲で試せる手順を解説します。
Google 検索結果を API で取得する: 現状整理
最初に、検索結果をプログラムから取得する手段の現状を整理します。用途によって選ぶべきものが異なります。
終了・新規利用ができないもの
かつて広く使われていた次の 2 つは、現在は新規に利用できません。
- Google Custom Search JSON API
-
新規顧客への提供が終了しており、既存ユーザー向けにも 2027 年 1 月 1 日に提供終了が予定されています。仕様面でも、結果は設定したサイトや検索エンジンのインデックスに制限され、Google.com 全体の結果をそのまま返すものではありません。
参考: Custom Search JSON API(Google for Developers)
“The following pricing applies only to existing Custom Search JSON API customers until the service discontinuation on January 1, 2027. This API is not available for new customers.”
(以下の料金は、2027 年 1 月 1 日のサービス終了まで既存顧客にのみ適用されます。この API は新規顧客には提供されません。)
https://developers.google.com/custom-search/v1/overview - Bing Search API
-
Microsoft が 2025 年 8 月 11 日に提供を終了しました。Web 検索・画像・ニュースなどのサブ API もすべて終了しており、旧エンドポイントは応答しません。過去には「Google の無料枠が足りなければ Bing を併用」という選択肢が紹介されることもありましたが、現在は利用できません。
参考: Bing Search APIs Retiring(Microsoft Learn)
“Bing Search APIs will be retired on August 11, 2025.”
(Bing Search API は 2025 年 8 月 11 日に提供終了します。)
https://learn.microsoft.com/en-us/lifecycle/announcements/bing-search-api-retirement
今使えるもの(用途別)
現在新規に利用できる手段は、用途によって分かれます。
- 自分のサイトに検索窓を設置したい場合
-
Programmable Search Engine のウィジェット(埋め込み UI)は引き続き無料で利用できます。終了が予定されているのは JSON API(プログラムからデータを取得する側)であり、サイト内検索の UI を埋め込む用途とは別物です。サイト内検索をより高機能にしたい場合は、Google 公式の後継である Vertex AI Search も選択肢になりますが、Google Cloud の構成が前提で、サイト内検索寄りの位置づけです。
- プログラムから検索結果をデータとして取得したい場合(本記事の主題)
-
第三者の SERP API が現実的な選択肢です。ドメイン制限なしに Google の検索結果を構造化 JSON で取得でき、proxy やリトライ処理も API 側で管理されます。本記事では、その代表例として SerpApi を中心に解説します。
なお、検索結果を取得・解析する行為は、用途によっては各サービスの利用規約や法令に関わります。SEO の順位調査や競合調査といった一般的な用途は広く行われていますが、利用するサービスの規約は事前に確認することをおすすめします。
SerpApi とは
SerpApi は、検索エンジンの結果(SERP)を構造化された JSON で取得できる第三者の API サービスです。Google の検索結果ページを取得・解析し、オーガニック検索結果やタイトル・URL・スニペットなどを整形済みのデータとして返します。proxy の管理やリトライ処理は API 側で吸収されるため、利用者は検索クエリを投げてデータを受け取ることに集中できます。
SerpApi は Google・Bing・YouTube など多数の検索エンジンに対応し、Python をはじめ複数言語の公式クライアントライブラリが提供されています。本記事では Google 検索の結果取得を例に解説します。
料金と無料枠
SerpApi は有償の従量制サービスですが、動作確認に使える無料枠が用意されています。無料プランは月 250 検索まで、最初の有料プランは月 25 ドルで 1,000 検索です。料金は改定される場合があるため、利用前に公式の料金ページで最新の条件を確認することをおすすめします。
無料枠の数え方には、把握しておきたい仕様があります。消費対象となるのは成功した検索のみで、キャッシュ・エラー・失敗した検索はカウントされません。また、結果が 100 件でも 0 件でも、1 回の検索として 1 件分が消費されます。開発中にエラーが続いても、その失敗分は無料枠を消費しない点は安心材料です。
Google Custom Search との違い
冒頭で触れたとおり、Google Custom Search JSON API は新規利用ができず、結果も設定したサイトやインデックスに制限されます。これに対して第三者の SERP API は、ドメイン制限なしに Google.com の結果を返し、レート上限も高く、PAA や AI Overview などのリッチな要素も取得できます。Custom Search JSON API からの移行先として、これらの API が利用できます。一方で、これらは有償の第三者サービスであり、無料枠を超えると課金される点は意識しておく必要があります。
SerpApi の準備
利用までの手順は、アカウント作成、API キーの取得、ライブラリの導入の 3 ステップです。
API キーの取得
SerpApi の公式サイト(serpapi.com)でアカウントを作成すると、ダッシュボードから API キーを取得できます。API キーは認証情報のため、コードに直接書き込まず、環境変数で管理することをおすすめします。シェルで次のように設定します。
export SERPAPI_KEY="あなたのAPIキー"Python からはos.getenv("SERPAPI_KEY")で読み込みます。これにより、ソースコードを共有・公開する際に API キーが漏れるのを防げます。
ライブラリのインストール
SerpApi の Python ライブラリには、現在 2 つのパッケージがあります。新しい公式パッケージserpapiと、従来のgoogle-search-resultsです。SerpApi は、新しいserpapiパッケージを推奨される利用方法として案内しており、これはレガシーのgoogle-search-resultsモジュールとは別物です。本記事では推奨されるserpapiを使用します。
pip install serpapiなお、古いgoogle-search-resultsと新しいserpapiの両方を同時にインストールすると問題が起きる場合があるため、新しいライブラリへ移行する際は、いったんgoogle-search-resultsをアンインストールしてからserpapiを入れることが案内されています。インポート名が紛らわしいため、既存環境で動かす場合はどちらが入っているかを確認しておくとよいでしょう。
動作確認
準備ができたら、最小構成で接続を確認します。engineにgoogle、qに検索キーワードを指定します。日本向けの結果を取得したい場合は、UI 言語hl・国gl・ドメインgoogle_domainを指定します。
import os
import serpapi
# 環境変数から API キーを読み込む
client = serpapi.Client(api_key=os.getenv("SERPAPI_KEY"))
results = client.search({
"engine": "google",
"q": "Python 自動化",
"hl": "ja", # 結果の言語
"gl": "jp", # 国(日本)
"google_domain": "google.co.jp",
})
# 取得結果(辞書のように扱える)
print(results)client.search()が返すオブジェクトは辞書のように扱え、results["organic_results"]にオーガニック検索結果のリストが入ります。これが取得できれば準備は完了です。
参考: serpapi(PyPI 公式パッケージ)
“This package … is the recommended way to access the SerpApi service from Python.”
(このパッケージは、Python から SerpApi を利用する際の推奨方法です。)
https://pypi.org/project/serpapi/
Python 実装: 検索結果を取得する
ここからは、SerpApi を使った実践的なコードを 3 段階で紹介します。いずれもインストールしたserpapiパッケージと、環境変数の API キーを利用します。
基本: 検索結果を取得して表示する
まずは検索を実行し、オーガニック検索結果のタイトルと URL、スニペットを取り出して表示します。results["organic_results"]に結果のリストが入っているため、ループで必要な項目を取り出します。
import os
import serpapi
client = serpapi.Client(api_key=os.getenv("SERPAPI_KEY"))
def main():
try:
results = client.search({
"engine": "google",
"q": "Python 自動化",
"hl": "ja",
"gl": "jp",
"google_domain": "google.co.jp",
"num": 10, # 取得件数
})
# オーガニック検索結果を取り出す
organic_results = results.get("organic_results", [])
if not organic_results:
print("検索結果が見つかりませんでした。")
return
for i, item in enumerate(organic_results, start=1):
title = item.get("title", "(タイトルなし)")
link = item.get("link", "")
snippet = item.get("snippet", "")
print(f"[{i}] {title}")
print(f" URL: {link}")
print(f" {snippet}\n")
except serpapi.HTTPError as e:
print(f"API エラーが発生しました: {e}")
except serpapi.TimeoutError as e:
print(f"タイムアウトしました: {e}")
if __name__ == "__main__":
main()item.get("link")のようにgetで取り出すと、特定のキーが存在しない結果が混じってもエラーになりにくくなります。serpapi.HTTPErrorとserpapi.TimeoutErrorを捕捉しておくと、API キーの誤りや通信の問題に気付きやすくなります。
応用: 上位サイトの URL を一括収集する
取得した検索結果から URL だけを集めれば、情報収集の起点として使えます。次のコードは、上位の URL をリストにまとめて返します。収集した URL は、CSV に書き出したり後続の処理に渡したりできます。
import os
import serpapi
client = serpapi.Client(api_key=os.getenv("SERPAPI_KEY"))
def collect_links(query, num=10):
results = client.search({
"engine": "google",
"q": query,
"hl": "ja",
"gl": "jp",
"google_domain": "google.co.jp",
"num": num,
})
links = []
for item in results.get("organic_results", []):
link = item.get("link")
if link:
links.append(link)
return links
if __name__ == "__main__":
keyword = input("検索キーワードを入力してください: ")
for url in collect_links(keyword):
print(url)複数キーワードを順に処理したい場合は、リストをループで回してcollect_linksを呼び出します。その際は、後述のスループット上限に配慮し、リクエストの間隔を空けることをおすすめします。
発展: Tkinter でデスクトップ検索ツールを作る
最後に、Python 標準の GUI ライブラリtkinterで、デスクトップに常駐する検索バーを作成します。キーワードを入力すると、上位の検索結果をブラウザのタブで開きます。ウィンドウを最前面に固定しておくと、作業中に素早く検索できます。
import os
import tkinter as tk
import webbrowser
import serpapi
client = serpapi.Client(api_key=os.getenv("SERPAPI_KEY"))
def run_search(event=None):
"""検索を実行し、上位結果をブラウザで開く"""
query = entry.get()
if not query:
return
try:
results = client.search({
"engine": "google",
"q": query,
"hl": "ja",
"gl": "jp",
"google_domain": "google.co.jp",
"num": 5,
})
organic_results = results.get("organic_results", [])
if organic_results:
for item in organic_results:
link = item.get("link")
if link:
webbrowser.open(link)
else:
print("結果が見つかりませんでした。")
entry.delete(0, tk.END)
except serpapi.HTTPError as e:
print(f"API エラー: {e}")
except serpapi.TimeoutError as e:
print(f"タイムアウト: {e}")
# メインウィンドウの作成
root = tk.Tk()
root.title("My Search Bar")
root.geometry("400x80")
# ウィンドウを常に最前面に表示する
root.attributes("-topmost", True)
# 半透明にする(0.1〜1.0 で調整)
root.attributes("-alpha", 0.9)
# 入力フォーム
entry = tk.Entry(root, width=40, font=("Meiryo", 12))
entry.pack(side=tk.LEFT, padx=10, pady=20)
entry.bind("<Return>", run_search) # Enter キーで検索
# 検索ボタン
btn = tk.Button(root, text="検索", command=run_search, bg="#4285F4", fg="white")
btn.pack(side=tk.LEFT, padx=5)
root.mainloop()webbrowser.open()を使うと、Windows・Mac・Linux を問わず、既定のブラウザで URL が開きます。ブラウザのパスを指定する必要はありません。検索結果を一度に複数開くため、開く件数(num)は少なめにしておくと扱いやすくなります。
検索部分を関数として分離しておくと、将来別の API へ移す場合も、入力欄まわりのコードを再利用できます。
実務での注意点
SerpApi を実務で使う際に、押さえておきたい点を整理します。
無料枠の上限:
無料プランは月あたりの検索数に上限があります。定期実行する処理では、消費数を監視し、上限を超える場合は有料プランや実行頻度の調整を検討します。
成功した検索のみが消費対象:
エラーや失敗した検索は無料枠を消費しません。開発中の試行錯誤で枠が大きく減る心配は小さいといえます。
スループットの制限:
プランごとに 1 時間あたりのリクエスト上限が設けられています。大量のキーワードを処理する場合は、リクエストの間隔を空けて分散させることをおすすめします。超過時は HTTP 429 が返るため、serpapi.HTTPErrorで捕捉してリトライ間隔を調整します。
ロケーションの指定:
検索結果は言語・国・地域によって変わります。hl・gl・google_domain、必要に応じてlocationを指定し、目的に合った結果を取得します。
利用規約と用途:
SEO の順位調査や競合調査などは一般的な用途ですが、取得したデータの扱いは利用規約や法令に関わります。利用前にサービスの規約を確認し、適法な範囲で利用することが前提になります。
参考: serpapi-python(公式ドキュメント)
“Unsuccessful requests raise serpapi.HTTPError or serpapi.TimeoutError exceptions.”
(失敗したリクエストは serpapi.HTTPError または serpapi.TimeoutError の例外を送出します。)
https://serpapi-python.readthedocs.io/
他の代替サービスとの使い分け
SerpApi 以外にも、用途や予算に応じて選べる SERP API があります。主な選択肢を整理します。
SerpApi は多数の検索エンジンに対応し、SDK やドキュメントが充実している一方、1 検索あたりの単価は高めです。Google だけを低コストで扱いたい場合は、Serper が月 2,500 検索の無料枠を持ち、Google に特化して高速・低価格な点で導入しやすい選択肢です。大量の順位チェックなどスケールが必要な場合は、DataForSEO が非同期キューで 1,000 件あたり 0.60 ドル程度と低コストですが、認証や非同期処理の実装にやや手間がかかります。
Google の結果に必ずしもこだわらない、あるいは独立したインデックスを使いたい場合は Brave Search API も候補です。Brave は約 300 億ページの独立インデックスを持ち、Google や Bing に依存しません。ただし 2026 年 2 月に無料枠を廃止し、月 5 ドルのクレジット(約 1,000 検索相当)を超えると従量課金される方式へ移行しています。
| サービス | 対象 | 無料枠の例 | 向いている用途 |
|---|---|---|---|
| SerpApi | 複数エンジン | 月 250 検索 | 多エンジン・リッチな結果・成熟した SDK |
| Serper | Google 中心 | 月 2,500 検索 | 低コストで Google の順位チェック |
| DataForSEO | 複数エンジン | 少額クレジット | 大量処理・SEO データとの統合 |
| Brave Search API | 独立インデックス | 月 5 ドルのクレジット | Google 非依存・独立インデックス |
自サイトに検索窓を置く用途であれば、これらの SERP API ではなく、Programmable Search Engine のウィジェットや、Google 公式の Vertex AI Search が適します。目的が「サイト内検索の設置」か「検索結果のデータ取得」かで、選ぶべき手段が分かれます。
なお、Google の検索結果を取得する第三者 API の多くは、検索結果をスクレイピングして提供しており、各検索エンジンの利用規約に関わる論点があります。実際に Google は SerpApi に対して法的措置を取っており、独自インデックスを持つ Brave のようなサービスはこうした懸念が小さいという違いがあります。利用にあたっては、各サービスの規約と自分の用途の適法性を確認することをおすすめします。
まとめ
本記事では、新規利用ができなくなった Google Custom Search API に代えて、Python から Google の検索結果をデータとして取得する現行の方法を、SerpApi を中心に解説しました。あわせて、料金や注意点、他の代替サービスとの使い分けも整理しました。
- Custom Search JSON API は新規利用不可で、2027 年 1 月に提供終了
- Bing Search API は 2025 年 8 月に提供終了済み
- 検索結果をデータ取得するなら第三者の SERP API が現実的
- SerpApi は
serpapiパッケージで数行から実装できる - 無料枠は成功した検索のみ消費し、失敗分は対象外
- ロケーション指定と利用規約の確認が実務上のポイント
- 用途次第で Serper・DataForSEO・Brave なども選択肢
以上、最後までお読みいただきありがとうございました。
