Wie Google SERP Scrapers erkennt
Google investiert stark in den Schutz seiner Suchergebnisse vor automatisiertem Zugriff. Bevor Sie Blöcke vermeiden können, müssen Sie die Erkennungsmethoden verstehen, die Google verwendet. Jedes Verfahren zielt auf ein anderes Signal, und effektives SERP-Schrotten erfordert, alle gleichzeitig zu adressieren.
Für einen vollständigen Überblick über die SERP-Schrottarchitektur mit Proxies, siehe unsere SERP Schrott mit Proxies-Führung.
IP-basierte Erkennung
Die erste Verteidigungslinie ist die IP-Analyse. Google verfolgt das Abfragevolumen pro IP-Adresse und markiert diejenigen, die normale menschliche Suchmuster überschreiten. Spezifische Signale umfassen:
- Anforderungsfrequenz: Mehr als ein paar Suchanfragen pro Minute von einer einzigen IP-Triggerrate Begrenzung
- IP-Reputation: Bekannte Datencenter-IP-Bereiche erhalten sofortige Kontrolle
- Geographische Inkonsistenz: Ein IP aus Deutschland, das englischsprachige US-Ziel-Abfragen erstellt, hebt Flaggen
- ASN-Analyse: Google identifiziert IP-Blöcke zu Hosting-Providern vs ISPs
Browser Fingerprinting
Jenseits von IP-Adressen untersucht Google die Anfrage selbst für Zeichen der Automatisierung:
| Signal | Was Google prüft | Rote Flagge |
|---|---|---|
| Benutzer-Agent | Browser- und OS-Identifikationszeichenfolge | Fehlen, veraltet oder unvereinbar mit anderen Kopfzeilen |
| Akzeptieren Sie Kopfzeilen | Inhaltstypeinstellungen | Fehlende Akzept-Language oder nicht-Standard Akzeptierenswerte |
| TLS Fingerabdruck | SSL/TLS Handshake Eigenschaften | Fingerprint-Anpassung bekannter HTTP-Bibliotheken (Anfragen, urllib) |
| JavaScript Ausführung | Clientseitiges Skriptverhalten | Keine JavaScript-Ausführung (kopflose Erkennung) |
| Cookie-Verhalten | Akzeptanz von Cookies und Management | Anfragen ohne Cookies oder identische Cookie-Muster |
Für einen tieferen Blick auf diese Techniken lesen Sie unseren Artikel über wie Anti-Bot-Systeme Proxis erkennen.
Verhaltensanalyse
Google analysiert Muster über Anträge auf Automatisierung:
- Datum anfordern: Perfekt konsistente Intervalle zwischen Anfragen (z.B. genau 3 Sekunden auseinander) sind unnatürlich
- Suchmuster: Scraping Keywords alphabetisch oder in vorhersehbaren Sequenzen sieht automatisiert aus
- Sitzungsverhalten: Reale Benutzer durchsuchen Sie mehrere Seiten, klicken Sie auf Ergebnisse und verbringen Sie Zeit lesen — Scrapers nur holen SERPs
- Volumenmuster: Sudden Spikes in Abfragevolumen aus verwandten IPs schlagen koordiniertes Abkratzen vor
Die drei Ebenen der Anti-Block-Strategie
Die Vermeidung von Google-Blöcken erfordert einen geschichteten Ansatz. Keine einzige Technik reicht allein aus.
Ebene 1: Proxy Infrastructure
Ihre Proxy-Auswahl ist die Grundlage Ihrer Antiblock-Strategie. ProxyHat Wohnwagen bieten die IP-Diversity und das Vertrauensniveau, das für ein nachhaltiges SERP-Schrotten benötigt wird.
Layer 2: Konfiguration anfordern
Jede HTTP-Anfrage muss aussehen, wie es von einem echten Browser kommt. Kopfzeilen, Cookies und Timing müssen realistisch sein.
Ebene 3: Verhaltensmuster
Das Gesamtmuster Ihrer Abstreifungsaktivität muss natürliches Suchverhalten imitieren. Dies bedeutet randomisierte Verzögerungen, vielfältige Abfragesequenzen und entsprechende Anforderungsvolumina.
Residential Proxies: Ihre erste Verteidigung
Die wirkungsreichste einzelne Änderung, die Sie machen können, ist der Wechsel von Rechenzentrum zu Wohngebiete. Aus diesem Grund unterscheiden sich Wohn-IPs grundlegend von Googles Perspektive:
- Residential IPs gehören zu realen ISPs (Comcast, AT&T, BT, Deutsche Telekom), nicht Cloud-Anbietern
- Google kann Wohn-IP-Bereiche nicht blockieren, ohne legitime Benutzer zu blockieren
- Jede IP hat eine Browser-Geschichte und Ruf von seinem realen Benutzer gebaut
- Residential IPs unterstützen Geotargeting auf Stadtebene für standortgenaue SERPs
Proxy-Konfiguration für SERP Scraping
import requests
# ProxyHat residential proxy with automatic rotation
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
session = requests.Session()
session.proxies = {
"http": PROXY_URL,
"https": PROXY_URL,
}
# Each request automatically gets a new residential IP
response = session.get(
"https://www.google.com/search",
params={"q": "best proxy service", "num": 10, "hl": "en", "gl": "us"},
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
},
timeout=15,
)Refer ProxyHat Dokumentation für erweiterte Rotation und Session-Einstellungen.
Realistische Anfragen Header
Unvollständige oder inkonsistente Header sind einer der häufigsten Gründe, warum Scrapers blockiert werden. Hier ist ein komplettes, realistisches Headerset:
import random
# Rotate between realistic User-Agent strings
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Safari/605.1.15",
]
def get_headers():
ua = random.choice(USER_AGENTS)
headers = {
"User-Agent": ua,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Cache-Control": "max-age=0",
}
# Firefox has different Sec-Ch headers
if "Firefox" not in ua:
headers["Sec-Ch-Ua"] = '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"'
headers["Sec-Ch-Ua-Mobile"] = "?0"
headers["Sec-Ch-Ua-Platform"] = '"Windows"' if "Windows" in ua else '"macOS"'
return headersHalten Sie immer Ihre User-Agent-Strings mit aktuellen Browser-Versionen aktualisiert. Senden einer Chrome 90 User-Agent in 2026 ist eine sofortige rote Flagge.
Beschränken und Timing anfordern
Das Muster Ihrer Anfragen ist genauso wichtig wie die Anfragen selbst. Hier sind bewährte Timingstrategien:
Zufällige Verzögerungen
Verwenden Sie niemals feste Intervalle zwischen Anfragen. Stattdessen, randomisieren Verzögerungen, um menschliches Suchverhalten imitieren:
import time
import random
def human_delay():
"""Generate a realistic delay between searches."""
# Base delay: 3-8 seconds (normal browsing pace)
base = random.uniform(3, 8)
# Occasionally add longer pauses (simulating reading results)
if random.random() < 0.15:
base += random.uniform(10, 30)
# Rare very short delays (rapid refinement searches)
if random.random() < 0.05:
base = random.uniform(1, 2)
return base
# Usage in scraping loop
for keyword in keywords:
result = scrape_serp(keyword)
delay = human_delay()
time.sleep(delay)Angebotslisten
| Proxytyp | Sichere Anfragen/Min pro IP | Max Concurrent IPs |
|---|---|---|
| Wohngebiet (rotierend) | 1 | Unbegrenzt (Pool dreht) |
| Wohngebiet (stickische Sitzung) | 1 pro 30er Jahre | Basierend auf Poolgröße |
| Datencenter | 1 pro 60er Jahre | Limitiert durch IP-Anzahl |
Handhabung von CAPTCHAs und Blöcken
Selbst mit den besten Vorsichtsmaßnahmen, werden Sie gelegentlich auf Blöcke. Bauen Sie Ihren Schaber, um sie anmutig zu handhaben.
Blocks erkennen
def is_blocked(response):
"""Check if Google has blocked or challenged the request."""
# HTTP 429: Rate limited
if response.status_code == 429:
return "rate_limited"
# HTTP 503: Service unavailable (temporary block)
if response.status_code == 503:
return "service_unavailable"
text = response.text.lower()
# CAPTCHA detection
if "captcha" in text or "recaptcha" in text:
return "captcha"
# Unusual traffic message
if "unusual traffic" in text or "automated queries" in text:
return "unusual_traffic"
# Empty or suspicious results
if "did not match any documents" in text and len(text) < 5000:
return "empty_suspicious"
return NoneRetry Strategie
import time
import random
def scrape_with_retry(keyword, max_retries=3):
"""Scrape a SERP with automatic retry on blocks."""
for attempt in range(max_retries):
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
response = requests.get(
"https://www.google.com/search",
params={"q": keyword, "num": 10, "hl": "en", "gl": "us"},
headers=get_headers(),
proxies=proxies,
timeout=15,
)
block_type = is_blocked(response)
if block_type is None:
return parse_results(response.text)
if block_type == "rate_limited":
# Exponential backoff
wait = (2 ** attempt) * 5 + random.uniform(0, 5)
print(f"Rate limited. Waiting {wait:.1f}s (attempt {attempt + 1})")
time.sleep(wait)
elif block_type == "captcha":
# Switch to a new IP and wait
print(f"CAPTCHA detected. Rotating IP and waiting...")
time.sleep(random.uniform(10, 20))
else:
# Generic block: wait and retry
time.sleep(random.uniform(5, 15))
return None # All retries exhaustedGeografische Konsistenz
Eine subtile, aber wichtige Anti-Detektions-Maßnahme sorgt für geografische Konsistenz über Ihre Anforderungsparameter:
- Wenn Ihr Proxy-IP in den Vereinigten Staaten ist, setzen
gl=usundhl=en - Passen Sie den Accept-Language-Header zum Ziellokal
- Verwenden Sie eine Benutzer-Agent-String für eine OS/Browser-Kombination, die in diesem Land üblich ist
- Zeitzonenanpassende Anfragezeiten einstellen
ProxyHat geo-targeting Funktion lassen Sie sich aus bestimmten Ländern und Städten wählen, so dass es einfach ist, diese Konsistenz zu erhalten. Erfahren Sie mehr über die Verwendung von ortsorientierten Anfragen in unserem Leitfaden auf Schrott ohne Blockierung.
Node.js Anti-Block Implementierung
Hier ist die äquivalente Antiblockstrategie in Node.js implementiert:
const axios = require('axios');
const cheerio = require('cheerio');
const { HttpsProxyAgent } = require('https-proxy-agent');
const USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0',
];
function getRandomUA() {
return USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)];
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function scrapeWithRetry(keyword, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const agent = new HttpsProxyAgent('http://USERNAME:PASSWORD@gate.proxyhat.com:8080');
try {
const { data, status } = await axios.get('https://www.google.com/search', {
params: { q: keyword, num: 10, hl: 'en', gl: 'us' },
headers: {
'User-Agent': getRandomUA(),
'Accept': 'text/html,application/xhtml+xml',
'Accept-Language': 'en-US,en;q=0.9',
},
httpsAgent: agent,
timeout: 15000,
validateStatus: () => true,
});
if (status === 429) {
const wait = Math.pow(2, attempt) * 5000 + Math.random() * 5000;
console.log(`Rate limited. Waiting ${(wait/1000).toFixed(1)}s`);
await sleep(wait);
continue;
}
if (data.toLowerCase().includes('captcha')) {
console.log('CAPTCHA detected. Rotating IP...');
await sleep(10000 + Math.random() * 10000);
continue;
}
return cheerio.load(data);
} catch (err) {
console.log(`Attempt ${attempt + 1} failed: ${err.message}`);
await sleep(5000 + Math.random() * 10000);
}
}
return null;
}Erweiterte Techniken
Zufälligkeit von Quer
Schreibe keine Schlüsselwörter in alphabetischer oder sequentieller Reihenfolge. Schlagen Sie Ihre Keyword-Liste vor jedem Lauf:
import random
keywords = ["proxy service", "web scraping", "serp tracking", "seo tools"]
random.shuffle(keywords)
# Now scrape in random order
for kw in keywords:
scrape_with_retry(kw)Google Search Parameter
Verwenden Sie diese Parameter, um saubere, nicht personalisierte Ergebnisse zu erhalten:
| Parameter | Wert | Zweck |
|---|---|---|
pws | 0) | Deaktivieren Sie personalisierte Ergebnisse |
gl | Ländercode | Suche nach Land |
hl | Sprachencode | Schnittstellensprache einstellen |
num | 10-100 | Ergebnisse pro Seite |
filter | 0) | Deaktivieren Sie doppelte Filterung |
nfpr | 1 | Autokorrektion deaktivieren |
Verteilte Regelung
Für die groß angelegte SERP-Überwachung verteilen Sie auf Zeit Anfragen, um Burstmuster zu vermeiden. Anstatt 10.000 Keywords in einer Stunde abzukratzen, verteilten sie über 8-12 Stunden mit natürlichen Verkehrskurven (mehr Anfragen während der Geschäftszeiten, weniger in der Nacht).
Das Ziel ist nicht nur, Blöcke zu vermeiden – es ist, Ihren Abstreifungsverkehr von normalen Nutzer-Suchverhalten unauffällig zu machen. Jedes Detail ist wichtig.
Mehr zum Aufbau von zuverlässigen, großflächigen Abstreifrohren, siehe unsere komplette Führung für Bahnabstreifer und ProxyHat Web-Schrottlösungen.






