Wie man Google-Sperren beim SERP Scraping vermeidet

Erfahren Sie, wie Google SERP-Schrotter erkennt und wie man Blöcke mit Wohn-Proxies, realistischen Headern, randomisierten Timings und Retry-Strategien mit Codebeispielen vermeiden kann.

Wie man Google-Sperren beim SERP Scraping vermeidet

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:

Browser Fingerprinting
SignalWas Google prüftRote Flagge
Benutzer-AgentBrowser- und OS-IdentifikationszeichenfolgeFehlen, veraltet oder unvereinbar mit anderen Kopfzeilen
Akzeptieren Sie KopfzeilenInhaltstypeinstellungenFehlende Akzept-Language oder nicht-Standard Akzeptierenswerte
TLS FingerabdruckSSL/TLS Handshake EigenschaftenFingerprint-Anpassung bekannter HTTP-Bibliotheken (Anfragen, urllib)
JavaScript AusführungClientseitiges SkriptverhaltenKeine JavaScript-Ausführung (kopflose Erkennung)
Cookie-VerhaltenAkzeptanz von Cookies und ManagementAnfragen 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 headers
Halten 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

Angebotslisten
ProxytypSichere Anfragen/Min pro IPMax Concurrent IPs
Wohngebiet (rotierend)1Unbegrenzt (Pool dreht)
Wohngebiet (stickische Sitzung)1 pro 30er JahreBasierend auf Poolgröße
Datencenter1 pro 60er JahreLimitiert 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 None

Retry 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 exhausted

Geografische 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=us und hl=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:

Google Search Parameter
ParameterWertZweck
pws0)Deaktivieren Sie personalisierte Ergebnisse
glLändercodeSuche nach Land
hlSprachencodeSchnittstellensprache einstellen
num10-100Ergebnisse pro Seite
filter0)Deaktivieren Sie doppelte Filterung
nfpr1Autokorrektion 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.

Bereit loszulegen?

Zugang zu über 50 Mio. Residential-IPs in über 148 Ländern mit KI-gesteuerter Filterung.

Preise ansehenResidential Proxies
← Zurück zum Blog