# PythonでGoogle検索結果を取得する方法（2026年）

> 2026年にPythonでGoogle検索結果を取得する方法：素のrequestsが失敗する理由を解説し、requests、pandas、非同期httpx、ページネーション、JSONLファイルでテスト済みのコードを紹介します。

- URL: https://serpcrypto.com/ja/guides/google-search-results-python/
- 最終更新: 2026-10-22
- 発行者: SerpCrypto (https://serpcrypto.com)

requestsでgoogle.comを取得する方法は2025年に選択肢ではなくなりました。このガイドではその理由を説明し、SERP APIを通じて同じ結果をJSONで取得する、構文チェック済みの短いPythonコードを紹介します。

**簡潔な回答 — 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="..."`です。

*requestsで最初のリクエスト*

```python
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`などのフィールドは、エラーではなく空のセルになります。

*複数の検索クエリを1つのDataFrameに*

```python
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など小さな数から始め、ダッシュボードに表示される上限に設定してください。

*httpxとセマフォによる非同期検索*

```python
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はすべてのブロックを保持するため、同じ検索に対して再度支払うことなく、後から新しい問いに答えられます。

*1〜3ページ目をJSONLとして保存*

```python
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で支払い、本人確認書類のアップロードは不要です。[料金](https://serpcrypto.com/ja/pricing/)をご覧ください。

## PythonでのGoogle検索結果：よくある質問

### Googleの検索結果ページにBeautifulSoupを使えますか？

確実には使えません。Googleは2025年1月以降JavaScriptを必須としているため、通常のクライアントが受け取るHTMLには検索結果が含まれておらず、Googleのrobots.txtは`/search`を禁止しています。SERP APIは代わりに解析済みのフィールドをJSONで返します。

### SerpCryptoの公式Pythonライブラリはありますか？

いいえ。APIは通常のHTTPSエンドポイントであるため、`requests`または`httpx`だけで十分です。このページおよび[Pythonドキュメントページ](https://serpcrypto.com/ja/docs/python/)にある例はコピー＆ペーストで使えるコードであり、公開されたパッケージではありません。

### 別の国の結果を取得するにはどうすればよいですか？

`gl`に国コードを、`hl`に言語を設定してください。たとえばフランスなら`gl=fr`と`hl=fr`です。都市を指定するには`location`を追加してください。[ロケーションのページ](https://serpcrypto.com/ja/docs/locations/)に一般的なコードの一覧があります。

### エラーとリトライはどう扱えばよいですか？

`raise_for_status()`を呼び出し、`429`、`502`、`504`のレスポンスは待ち時間を徐々に延ばしながらリトライしてください。失敗したリクエストには課金されません。[エラーのページ](https://serpcrypto.com/ja/docs/errors/)に完全なリトライ関数があります。

### 同じコードでBingの結果を取得できますか？

はい。`engine`を`bing`に変更してください。レスポンスの形式は`organic_results`と`related_searches`を伴い、同じままです。

## ソース

1. [GoogleがGoogle検索にJavaScriptを要求し始める](https://techcrunch.com/2025/01/17/google-begins-requiring-javascript-for-google-search/) — TechCrunch (2025-01-17)
2. [google.com robots.txt](https://www.google.com/robots.txt) — Google (read 2026-10-22)
3. [Google、ランクトラッカーにクエリあたり500〜1,000リクエストを強制](https://ppc.land/google-forces-rank-trackers-into-500-to-1-000-requests-per-query/) — PPC Land (2026-08-27)

---

SerpCrypto: SerpCryptoは、開発者とAIエージェント向けのSERP APIで、GoogleとBingの検索結果をJSONで返し、身分証明書のアップロードなしで暗号資産で支払えます。前払いの検索クレジットは$0.30/1K検索から購入でき、有効期限はありません。KYC不要 — 身分証明書もセルフィーも書類も不要。暗号資産で支払い。
