Hızlı yanıt
2026'da Python'da Google arama sonuçlarını nasıl alırım?
Python'dan bir SERP API çağırın ve döndürdüğü JSON'u okuyun; google.com'u kendiniz çekmeyin, çünkü Google 17 Ocak 2025'ten beri JavaScript gerektiriyor ve robots.txt dosyası /search izin vermiyor. SerpCrypto ile bir requests.get ile https://serpcrypto.com/api/v1/search arası çağrı, organik sonuçları, People Also Ask ve daha fazlasını, Ekim 2026 itibarıyla $0,30/1K arama üzerinden arama başına bir krediyle döndürür. KYC yok; kripto ile ödeme.
İhtiyacınız olanlar
| Python | 3.9 veya daha yeni |
|---|---|
| Paketler | Temel işlemler için requests; tablolar için pandas; async için httpx |
| API anahtarı | SerpCrypto kontrol panelinizden, SERPCRYPTO_API_KEY ortam değişkeninde saklanır |
| Endpoint | GET https://serpcrypto.com/api/v1/search |
| Maliyet | 1 kredi = desteklenen herhangi bir motorda bir sayfa sonuç döndüren 1 başarılı arama isteği. Başarısız olan istek ücretlendirilmez |
| En küçük paket | $7,50 için 10.000 arama; krediler süresi dolmaz |
google.com üzerinde requests.get neden artık çalışmıyor?
Çünkü sonuçlar artık düz bir HTTP istemcisinin aldığı HTML içinde değil. 17 Ocak 2025'te Google, Search için JavaScript gerektirmeye başladı; JavaScript'in hizmetlerini botlardan korumaya yardımcı olduğunu ve aramaların %0,1'den azının JavaScript kapalı kullanıcılardan geldiğini, TechCrunch'ın bildirdiğine göre, söyledi.
22 Ekim 2026'da okunan Google'ın robots.txt dosyası da tüm user agent'lar için Disallow: /search listeliyor. Aramayı çalıştırmayı ve sayfayı ayrıştırmayı bir SERP API üstlenir, Python kodunuz yalnızca JSON ile ilgilenir. Bu rehberin geri kalanında kullanılan yaklaşım budur.
İlk isteği nasıl yaparım?
requests'i kurun, anahtarınızı bir ortam değişkenine koyun ve sorguyu bir ülke ve bir dille gönderin. Yanıt, sonuç sayfasının her bloğu için bir anahtar içeren bir sözlüktür; organic_results sıralanmış bağlantıları tutar.
Anahtarı kaynak kodunuzun dışında tutun. macOS ve Linux'ta kabukta export SERPCRYPTO_API_KEY=...; Windows PowerShell'de $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"])
Sonuçları bir pandas DataFrame'e nasıl dönüştürürüm?
Her organik sonuç için bir satır oluşturun ve sorguyu yanında tutun. Bir DataFrame sıralamayı, alan adına göre filtrelemeyi veya CSV ve Excel'e dışa aktarmayı kolaylaştırır. Eksik alanlar, örneğin çoğu sonuçta date, hata yerine boş hücrelere dönüşür.
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)
Aynı anda çok sayıda arama nasıl yapabilirim?
httpx ile asyncio kullanın ve semaphore ile eşzamanlı istek sayısını sınırlayın. Hesabınızın bir eşzamanlılık sınırı vardır ve bu sınır dashboard'da gösterilir; altında kalmak 429 hatalarını önler. 5 gibi küçük bir sayıyla başlayın ve dashboard'da gösterilen sınıra ayarlayın.
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'dan fazla sonucu nasıl alırım ve nasıl kaydederim?
Sonraki sayfaları page=2, page=3 ve benzeri şekilde page=10'ye kadar isteyin. Her sayfa bir arama ve bir kredidir, çünkü Google num=100 parametresini Eylül 2025'te dikkate almayı bıraktığından beri sayfa başına yaklaşık 10 organik sonuç sunuyor.
Her ham yanıtı bir JSONL dosyasında tek bir satır olarak kaydedin. Ham JSON tüm blokları korur, böylece aynı aramalar için tekrar ödeme yapmadan daha sonra yeni soruları yanıtlayabilirsiniz.
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)
Bu kodu çalıştırmanın maliyeti nedir?
Bu örneklerdeki her çağrı bir aramadır. İlk örnek bir krediye, DataFrame örneği üç krediye, JSONL örneği ise en fazla üç krediye mal olur. Başarısız bir istek için ücret alınmaz.
Ekim 2026 itibarıyla 10.000 arama maliyeti $7,50 ve 100.000 arama maliyeti $56,25; oran 5.000.000 arama seviyesinde $0,30/1K arama'e düşer. Krediler asla sona ermez. Kimlik yükleme olmadan $25 ile yapılan bir bakiye yüklemesinden BTC, USDT, USDC, ETH, SOL, LTC ile ödeme yaparsınız. Fiyatlandırmaya bakın.
Python'da Google sonuçları: sık sorulan sorular
Google sonuç sayfalarında BeautifulSoup kullanabilir miyim?
Güvenilir şekilde olmaz. Google Ocak 2025'ten beri JavaScript gerektiriyor, bu yüzden düz bir istemcinin aldığı HTML sonuçları içermiyor ve Google'ın robots.txt dosyası /search iznini vermiyor. Bir SERP API bunun yerine ayrıştırılmış alanları JSON olarak döndürür.
SerpCrypto için resmi bir Python kütüphanesi var mı?
Hayır. API düz bir HTTPS endpoint'idir, bu yüzden ihtiyacınız olan tek şey requests veya httpx. Bu sayfadaki ve Python dokümanları sayfasındaki örnekler kopyala-yapıştır koddur, yayımlanmış bir paket değildir.
Başka bir ülke için sonuçları nasıl alabilirim?
gl parametresini ülke koduna ve hl parametresini dile ayarlayın; örneğin Fransa için gl=fr ve hl=fr. Bir şehir için location ekleyin. Konumlar sayfası yaygın kodları listeler.
Hataları ve yeniden denemeleri nasıl ele alırım?
raise_for_status() çağrısını yapın, ardından 429, 502 ve 504 yanıtlarını artan bir gecikmeyle yeniden deneyin. Başarısız istekler için ücret alınmaz. Hatalar sayfasında tam bir yeniden deneme fonksiyonu vardır.
Aynı kodla Bing sonuçlarını alabilir miyim?
Evet. engine parametresini bing olarak değiştirin; yanıt organic_results ve related_searches ile aynı yapıyı korur.
Kaynaklar (3)
- Google, Google Arama için JavaScript zorunluluğu getirmeye başlıyor — TechCrunch (2025-01-17)
- google.com robots.txt — Google (read 2026-10-22)
- Google, sıralama takipçilerini sorgu başına 500 ila 1.000 isteğe zorluyor — PPC Land (2026-08-27)