簡潔な回答
2026年にPythonでGoogle検索結果を取得するには?
PythonからSERP APIを呼び出し、返ってくるJSONを読み取ります。google.comを自分で取得してはいけません。Googleは2025年1月17日以降JavaScriptを必須としており、robots.txtで/searchを禁止しています。SerpCryptoでは、1つのrequests.getからhttps://serpcrypto.com/api/v1/searchがオーガニック検索結果、People Also Askなどを返し、2026年10月時点で$0.30/1K検索から1検索あたり1クレジットです。KYC不要、暗号資産で支払い。
必要なもの
| Python | 3.9以降 |
|---|---|
| パッケージ | 基本はrequests、表はpandas、非同期はhttpx |
| APIキー | SerpCryptoダッシュボードから取得し、SERPCRYPTO_API_KEY環境変数に保存 |
| エンドポイント | GET https://serpcrypto.com/api/v1/search |
| コスト | 1クレジット = 1回の成功した検索リクエストで、対応するすべてのエンジンで結果の1ページを返します。失敗したリクエストは課金されません |
| 最小パック | $7.50で10,000検索。クレジットは有効期限なし |
google.comへのrequests.getがもう動かないのはなぜですか?
検索結果が、素のHTTPクライアントが受け取るHTMLにもう含まれていないからです。2025年1月17日、Googleは検索にJavaScriptを必須とするようになりました。JavaScriptはボットからサービスを保護するのに役立つと述べ、JavaScriptをオフにしたユーザーからの検索は0.1%未満だったとTechCrunchが報じています。
2026年10月22日に確認したGoogleのrobots.txtには、すべてのUser-Agentに対してDisallow: /searchも記載されています。SERP APIが検索の実行とページの解析を担い、PythonコードはJSONだけを扱います。これがこのガイドの残りで使うアプローチです。
最初のリクエストはどうやって送りますか?
requestsをインストールし、APIキーを環境変数に入れ、国と言語を指定して検索クエリを送信します。レスポンスは検索結果ページのブロックごとに1つのキーを持つ辞書で、organic_resultsに順位付けされたリンクが入っています。
APIキーはソースコードに入れないでください。macOSとLinuxではシェルでexport SERPCRYPTO_API_KEY=...、Windows PowerShellでは$env:SERPCRYPTO_API_KEY="..."です。
import os
import requests
API = "https://serpcrypto.com/api/v1/search"
KEY = os.environ["SERPCRYPTO_API_KEY"]
resp = requests.get(
API,
headers={"Authorization": "Bearer " + KEY},
params={"engine": "google", "q": "best hiking boots", "gl": "us", "hl": "en"},
timeout=60,
)
resp.raise_for_status()
results = resp.json()
for item in results.get("organic_results", []):
print(item["position"], item["title"])
print(" ", item["link"])
for q in results.get("people_also_ask", []):
print("PAA:", q["question"])
結果をpandasのDataFrameに変換するには?
オーガニック検索結果ごとに1行を作り、検索クエリを隣に保持します。DataFrameを使えば、並べ替え、ドメインでの絞り込み、CSVやExcelへのエクスポートが簡単です。多くの結果で欠けているdateなどのフィールドは、エラーではなく空のセルになります。
import os
from urllib.parse import urlparse
import pandas as pd
import requests
API = "https://serpcrypto.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}
def organic_rows(query, gl="us", hl="en"):
params = {"engine": "google", "q": query, "gl": gl, "hl": hl}
resp = requests.get(API, headers=HEADERS, params=params, timeout=60)
resp.raise_for_status()
for r in resp.json().get("organic_results", []):
yield {
"query": query,
"position": r.get("position"),
"title": r.get("title"),
"domain": urlparse(r.get("link", "")).netloc,
"link": r.get("link"),
"snippet": r.get("snippet"),
}
queries = ["crm for small business", "invoice software", "time tracking app"]
df = pd.DataFrame([row for q in queries for row in organic_rows(q)])
print(df.groupby("domain").size().sort_values(ascending=False).head(10))
df.to_csv("serp_results.csv", index=False)
一度に多数の検索を実行するにはどうすればよいですか?
httpxとasyncioを使い、セマフォで同時実行中のリクエスト数を制限してください。アカウントには同時実行の上限があり、ダッシュボードに表示されます。上限を超えなければ429エラーを避けられます。まずは5など小さな数から始め、ダッシュボードに表示される上限に設定してください。
import asyncio
import os
import httpx
API = "https://serpcrypto.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}
LIMIT = asyncio.Semaphore(5)
async def search(client, query):
async with LIMIT:
resp = await client.get(API, params={"engine": "google", "q": query, "gl": "us", "hl": "en"})
resp.raise_for_status()
data = resp.json()
top = data.get("organic_results", [])[:3]
return query, [r["link"] for r in top]
async def main(queries):
async with httpx.AsyncClient(headers=HEADERS, timeout=60) as client:
for query, links in await asyncio.gather(*(search(client, q) for q in queries)):
print(query, links)
if __name__ == "__main__":
asyncio.run(main(["python web framework", "python orm", "python task queue"]))
10件を超える結果を取得して保存するにはどうすればよいですか?
page=2、page=3などのパラメータで次のページを、page=10までリクエストしてください。Googleは2025年9月にnum=100を尊重しなくなって以降、1ページあたり約10件のオーガニック検索結果を返すため、各ページが1回の検索と1クレジットになります。
各生レスポンスはJSONLファイルの1行として保存してください。生のJSONはすべてのブロックを保持するため、同じ検索に対して再度支払うことなく、後から新しい問いに答えられます。
import json
import os
import requests
API = "https://serpcrypto.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["SERPCRYPTO_API_KEY"]}
def fetch_pages(query, pages=3, path="serp.jsonl"):
with open(path, "a", encoding="utf-8") as out:
for page in range(1, pages + 1):
params = {"engine": "google", "q": query, "gl": "us", "hl": "en", "page": page}
resp = requests.get(API, headers=HEADERS, params=params, timeout=60)
resp.raise_for_status()
data = resp.json()
out.write(json.dumps(data, ensure_ascii=False) + "\n")
if not data.get("organic_results"):
break
fetch_pages("electric cargo bike", pages=3)
このコードを実行するにはいくらかかりますか?
これらの例の各呼び出しは1回の検索です。最初の例は1クレジット、DataFrameの例は3クレジット、JSONLの例は最大3クレジットです。失敗したリクエストには課金されません。
2026年10月時点で、10,000検索は$7.50、100,000検索は$56.25かかり、5,000,000検索では$0.30/1K検索に下がります。クレジットに有効期限はありません。$25でのチャージからBTC, USDT, USDC, ETH, SOL, LTCで支払い、本人確認書類のアップロードは不要です。料金をご覧ください。
PythonでのGoogle検索結果:よくある質問
Googleの検索結果ページにBeautifulSoupを使えますか?
確実には使えません。Googleは2025年1月以降JavaScriptを必須としているため、通常のクライアントが受け取るHTMLには検索結果が含まれておらず、Googleのrobots.txtは/searchを禁止しています。SERP APIは代わりに解析済みのフィールドをJSONで返します。
SerpCryptoの公式Pythonライブラリはありますか?
いいえ。APIは通常のHTTPSエンドポイントであるため、requestsまたはhttpxだけで十分です。このページおよびPythonドキュメントページにある例はコピー&ペーストで使えるコードであり、公開されたパッケージではありません。
別の国の結果を取得するにはどうすればよいですか?
glに国コードを、hlに言語を設定してください。たとえばフランスならgl=frとhl=frです。都市を指定するにはlocationを追加してください。ロケーションのページに一般的なコードの一覧があります。
エラーとリトライはどう扱えばよいですか?
raise_for_status()を呼び出し、429、502、504のレスポンスは待ち時間を徐々に延ばしながらリトライしてください。失敗したリクエストには課金されません。エラーのページに完全なリトライ関数があります。
同じコードでBingの結果を取得できますか?
はい。engineをbingに変更してください。レスポンスの形式はorganic_resultsとrelated_searchesを伴い、同じままです。
ソース (3)
- GoogleがGoogle検索にJavaScriptを要求し始める — TechCrunch (2025-01-17)
- google.com robots.txt — Google (read 2026-10-22)
- Google、ランクトラッカーにクエリあたり500〜1,000リクエストを強制 — PPC Land (2026-08-27)