Snel antwoord
Hoe krijg ik in 2026 Google-zoekresultaten in Python?
Roep een SERP-API aan vanuit Python en lees de JSON die het teruggeeft; haal google.com niet zelf op, want Google vereist sinds 17 januari 2025 JavaScript en zijn robots.txt staat /search niet toe. Met SerpCrypto geeft één requests.get naar https://serpcrypto.com/api/v1/search organische resultaten, People Also Ask en meer, voor één credit per zoekopdracht vanaf US$ 0,30/1K zoekopdrachten per oktober 2026. Zonder KYC; betalen met crypto.
Wat je nodig hebt
| Python | 3.9 of nieuwer |
|---|---|
| Packages | requests voor de basis; pandas voor tabellen; httpx voor async |
| API-sleutel | Uit je SerpCrypto-dashboard, opgeslagen in de omgevingsvariabele SERPCRYPTO_API_KEY |
| Endpoint | GET https://serpcrypto.com/api/v1/search |
| Kosten | 1 credit = 1 geslaagde zoekopdracht, die één pagina met resultaten oplevert op elke ondersteunde engine. Een mislukte zoekopdracht wordt niet in rekening gebracht |
| Kleinste pack | 10.000 zoekopdrachten voor US$ 7,50; credits verlopen nooit |
Waarom werkt requests.get op google.com niet meer?
Omdat de resultaten niet meer in de HTML staan die een gewone HTTP-client ontvangt. Op 17 januari 2025 begon Google JavaScript vereist te maken voor Search; Google zei dat JavaScript helpt zijn diensten tegen bots te beschermen en dat minder dan 0,1% van de zoekopdrachten afkomstig was van gebruikers met JavaScript uit, zoals TechCrunch berichtte.
Google's robots.txt, gelezen op 22 oktober 2026, vermeldt ook Disallow: /search voor alle user agents. Een SERP-API regelt het uitvoeren van de zoekopdracht en het parsen van de pagina, en je Python-code heeft alleen met JSON te maken. Dat is de aanpak in de rest van deze gids.
Hoe doe ik de eerste request?
Installeer requests, zet je sleutel in een omgevingsvariabele en stuur de zoekopdracht met een land en een taal. De response is een dictionary met één sleutel per blok van de resultatenpagina; organic_results bevat de gerangschikte links.
Houd de sleutel buiten je broncode. Op macOS en Linux export SERPCRYPTO_API_KEY=... in de shell; op 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"])
Hoe zet ik de resultaten om naar een pandas DataFrame?
Maak één rij per organisch resultaat en houd de zoekopdracht ernaast. Met een DataFrame kun je makkelijk sorteren, filteren op domein of exporteren naar CSV en Excel. Ontbrekende velden, zoals date bij de meeste resultaten, worden lege cellen in plaats van fouten.
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)
Hoe voer ik veel zoekopdrachten tegelijk uit?
Gebruik httpx met asyncio en beperk het aantal gelijktijdige requests met een semaphore. Je account heeft een concurrency-limiet, die je in het dashboard ziet; blijf eronder om 429-fouten te voorkomen. Begin met een klein aantal, bijvoorbeeld 5, en zet het op de limiet die je dashboard toont.
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"]))
Hoe krijg ik meer dan 10 resultaten en sla ik ze op?
Vraag de volgende pagina's op met page=2, page=3 enzovoort, tot page=10. Elke pagina is één zoekopdracht en één credit, omdat Google sinds het in september 2025 stopte met het respecteren van num=100 ongeveer 10 organische resultaten per pagina levert.
Sla elke ruwe response op als één regel in een JSONL-bestand. Ruwe JSON bewaart elk blok, zodat je later nieuwe vragen kunt beantwoorden zonder opnieuw voor dezelfde zoekopdrachten te betalen.
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)
Wat kost het om deze code uit te voeren?
Elke call in deze voorbeelden is één zoekopdracht. Het eerste voorbeeld kost één credit, het DataFrame-voorbeeld drie en het JSONL-voorbeeld tot drie. Een mislukte request wordt niet in rekening gebracht.
10.000 zoekopdrachten kosten US$ 7,50 en 100.000 zoekopdrachten kosten US$ 56,25, per oktober 2026; het tarief daalt naar US$ 0,30/1K zoekopdrachten bij 5.000.000 zoekopdrachten. Credits verlopen nooit. Je betaalt in BTC, USDT, USDC, ETH, SOL, LTC uit een US$ 25-top-up, zonder ID te uploaden. Zie pricing.
Google-resultaten in Python: veelgestelde vragen
Kan ik BeautifulSoup gebruiken op Google-zoekresultatenpagina's?
Niet betrouwbaar. Google vereist sinds januari 2025 JavaScript, dus de HTML die een gewone client ontvangt bevat de resultaten niet, en Google's robots.txt staat /search niet toe. Een SERP-API geeft de geparseerde velden als JSON terug.
Is er een officiële Python-bibliotheek voor SerpCrypto?
Nee. De API is een gewoon HTTPS-endpoint, dus requests of httpx is alles wat je nodig hebt. De voorbeelden op deze pagina en op de Python-documentatiepagina zijn copy-paste-code, geen gepubliceerd package.
Hoe krijg ik resultaten voor een ander land?
Zet gl op de landcode en hl op de taal, bijvoorbeeld gl=fr en hl=fr voor Frankrijk. Voeg location toe voor een stad. De locations-pagina vermeldt veelgebruikte codes.
Hoe ga ik om met errors en retries?
Roep raise_for_status() aan en probeer 429-, 502- en 504-responses opnieuw na een groeiende vertraging. Mislukte requests worden niet in rekening gebracht. De errors-pagina bevat een volledige retry-functie.
Kan ik met dezelfde code Bing-resultaten krijgen?
Ja. Verander engine in bing; de response behoudt dezelfde vorm, met organic_results en related_searches.
Bronnen (3)
- Google begint JavaScript vereist te maken voor Google Search — TechCrunch (2025-01-17)
- google.com robots.txt — Google (read 2026-10-22)
- Google dwingt rank trackers tot 500 tot 1.000 requests per query — PPC Land (2026-08-27)