# Cara mendapatkan hasil pencarian Google di Python (2026)

> Cara mendapatkan hasil pencarian Google di Python pada 2026: mengapa requests gagal, lalu kode uji untuk requests, pandas, httpx async, dan JSONL.

- URL: https://serpcrypto.com/id/guides/google-search-results-python/
- Terakhir diperbarui: 2026-10-22
- Penerbit: SerpCrypto (https://serpcrypto.com)

Mengambil google.com dengan requests tidak lagi menjadi opsi pada 2025. Panduan ini menjelaskan alasannya, lalu memberikan kode Python singkat yang sudah dicek sintaksisnya untuk mendapatkan hasil yang sama sebagai JSON melalui SERP API.

**Jawaban singkat — Bagaimana cara mendapatkan hasil pencarian Google di Python pada 2026?**

Panggil SERP API dari Python dan baca JSON yang dikembalikannya; jangan mengambil google.com sendiri, karena Google mewajibkan JavaScript sejak 17 Januari 2025 dan robots.txt-nya melarang `/search`. Dengan **SerpCrypto**, satu `requests.get` hingga `https://serpcrypto.com/api/v1/search` mengembalikan hasil organik, People Also Ask, dan lainnya, dengan satu kredit per pencarian mulai US$0,30/1K pencarian per Oktober 2026. Tanpa KYC; bayar dengan kripto.

## Yang Anda butuhkan

| Atribut | Nilai |
| --- | --- |
| Python | 3.9 atau lebih baru |
| Paket | `requests` untuk dasar; `pandas` untuk tabel; `httpx` untuk async |
| API key | Dari dashboard SerpCrypto Anda, disimpan di variabel environment `SERPCRYPTO_API_KEY` |
| Endpoint | `GET https://serpcrypto.com/api/v1/search` |
| Biaya | 1 kredit = 1 permintaan pencarian yang berhasil, yang mengembalikan satu halaman hasil di mesin mana pun yang didukung. Permintaan yang gagal tidak dikenai biaya |
| Paket terkecil | 10.000 pencarian untuk US$7,50; kredit tidak pernah kedaluwarsa |

## Mengapa requests.get ke google.com tidak berfungsi lagi?

Karena hasilnya tidak lagi ada di HTML yang diterima klien HTTP biasa. Pada 17 Januari 2025, Google mulai mewajibkan JavaScript untuk Search; Google menyatakan JavaScript membantunya melindungi layanan dari bot dan bahwa kurang dari 0,1% pencarian berasal dari pengguna yang menonaktifkan JavaScript, seperti dilaporkan TechCrunch.

robots.txt Google, yang dibaca pada 22 Oktober 2026, juga mencantumkan `Disallow: /search` untuk semua user agent. SERP API menangani menjalankan pencarian dan mem-parsing halaman, dan kode Python Anda hanya berurusan dengan JSON. Itulah pendekatan yang digunakan di sisa panduan ini.

## Bagaimana cara membuat permintaan pertama?

Instal requests, simpan API key Anda di variabel environment, dan kirim kueri dengan negara dan bahasa. Responsnya adalah dictionary dengan satu kunci per blok halaman hasil; `organic_results` berisi tautan yang diperingkat.

Jauhkan API key dari kode sumber Anda. Di macOS dan Linux, `export SERPCRYPTO_API_KEY=...` di shell; di Windows PowerShell, `$env:SERPCRYPTO_API_KEY="..."`.

*Permintaan pertama dengan 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"])

```

## Bagaimana cara mengubah hasilnya menjadi pandas DataFrame?

Buat satu baris per hasil organik dan simpan kuerinya di sebelahnya. DataFrame memudahkan untuk mengurutkan, memfilter menurut domain, atau mengekspor ke CSV dan Excel. Field yang tidak ada, seperti `date` pada sebagian besar hasil, menjadi sel kosong alih-alih error.

*Beberapa kueri ke dalam satu 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)

```

## Bagaimana cara menjalankan banyak pencarian sekaligus?

Gunakan httpx dengan asyncio dan batasi jumlah permintaan yang sedang berjalan dengan semaphore. Akun Anda memiliki batas konkurensi yang ditampilkan di dashboard; tetap di bawahnya agar terhindar dari error `429`. Mulai dari jumlah kecil, misalnya 5, lalu setel ke batas yang ditampilkan dashboard Anda.

*Pencarian asinkron dengan httpx dan semaphore*

```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"]))

```

## Bagaimana cara mendapatkan lebih dari 10 hasil dan menyimpannya?

Minta halaman berikutnya dengan `page=2`, `page=3`, dan seterusnya, hingga `page=10`. Setiap halaman adalah satu pencarian dan satu kredit, karena Google telah menyajikan sekitar 10 hasil organik per halaman sejak berhenti mematuhi `num=100` pada September 2025.

Simpan setiap respons mentah sebagai satu baris dalam file JSONL. JSON mentah menyimpan semua blok, sehingga Anda bisa menjawab pertanyaan baru nanti tanpa membayar lagi untuk pencarian yang sama.

*Halaman 1 sampai 3 disimpan sebagai 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)

```

## Berapa biaya untuk menjalankan kode ini?

Setiap panggilan dalam contoh ini adalah satu pencarian. Contoh pertama membutuhkan satu kredit, contoh DataFrame tiga kredit, dan contoh JSONL hingga tiga kredit. Permintaan yang gagal tidak dikenai biaya.

10.000 pencarian berbiaya US$7,50 dan 100.000 pencarian berbiaya US$56,25, per Oktober 2026; tarif turun menjadi US$0,30/1K pencarian pada 5.000.000 pencarian. Kredit tidak pernah kedaluwarsa. Anda membayar dengan BTC, USDT, USDC, ETH, SOL, LTC dari top-up US$25, tanpa unggah ID. Lihat [harga](https://serpcrypto.com/id/pricing/).

## Hasil pencarian Google dalam Python: pertanyaan umum

### Bisakah saya menggunakan BeautifulSoup pada halaman hasil Google?

Tidak andal. Google mewajibkan JavaScript sejak Januari 2025, sehingga HTML yang diterima klien biasa tidak memuat hasil, dan robots.txt Google melarang `/search`. SERP API mengembalikan field yang sudah diurai sebagai JSON.

### Apakah ada library Python resmi untuk SerpCrypto?

Tidak. API ini adalah endpoint HTTPS biasa, jadi `requests` atau `httpx` sudah cukup. Contoh di halaman ini dan di [halaman dokumentasi Python](https://serpcrypto.com/id/docs/python/) adalah kode siap tempel, bukan paket yang diterbitkan.

### Bagaimana cara mendapatkan hasil untuk negara lain?

Setel `gl` ke kode negara dan `hl` ke bahasa, misalnya `gl=fr` dan `hl=fr` untuk Prancis. Tambahkan `location` untuk kota tertentu. [Halaman lokasi](https://serpcrypto.com/id/docs/locations/) mencantumkan kode yang umum dipakai.

### Bagaimana cara menangani error dan percobaan ulang?

Panggil `raise_for_status()`, lalu coba ulang respons `429`, `502`, dan `504` setelah jeda yang makin lama. Permintaan yang gagal tidak dikenai biaya. [Halaman error](https://serpcrypto.com/id/docs/errors/) berisi fungsi percobaan ulang lengkap.

### Bisakah saya mendapatkan hasil Bing dengan kode yang sama?

Bisa. Ubah `engine` menjadi `bing`; bentuk respons tetap sama, dengan `organic_results` dan `related_searches`.

## Sumber

1. [Google mulai mewajibkan JavaScript untuk Google Search](https://techcrunch.com/2025/01/17/google-begins-requiring-javascript-for-google-search/) — TechCrunch (2025-01-17)
2. [robots.txt google.com](https://www.google.com/robots.txt) — Google (read 2026-10-22)
3. [Google memaksa rank tracker menjadi 500 hingga 1.000 permintaan per kueri](https://ppc.land/google-forces-rank-trackers-into-500-to-1-000-requests-per-query/) — PPC Land (2026-08-27)

---

SerpCrypto: SerpCrypto adalah SERP API untuk developer dan AI agent yang mengembalikan hasil pencarian Google dan Bing dalam format JSON, dibayar dengan kripto tanpa unggah identitas. Kredit pencarian prabayar mulai dari US$0,30/1K pencarian tidak pernah kedaluwarsa. Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan kripto.
