CAPTCHAs beim Scraping behandeln

CAPTCHA-Typen, Präventionsstrategien, die effektiver sind als die Lösung, und die kritische Rolle der Proxies in CAPTCHA Vermeidung. Codebeispiele für Erkennung und Routing.

CAPTCHAs beim Scraping behandeln

Warum CAPTCHAs Sind das größte Hindernis des Schrapers

CAPTCHAs gibt es, um Menschen von Bots zu unterscheiden, und sie sind immer effektiver. Wenn Ihr Abstreifer auf eine CAPTCHA stößt, bedeutet das, dass die Zielseite automatisiertes Verhalten erkannt hat – Ihre Anforderungsfrequenz war zu hoch, Ihre IP hat geringes Vertrauen, oder Ihr Browser Fingerabdruck sah verdächtig aus. Die beste CAPTCHA Strategie ist Prävention, nicht zu lösen.

Dieser Leitfaden umfasst die Arten von CAPTCHAs, die Sie treffen werden, warum Prävention effektiver und billiger ist als die Lösung, und wie Proxies spielen eine entscheidende Rolle bei der Vermeidung von CAPTCHAs ganz.

Dieser Artikel ist Teil unseres Kompletter Leitfaden für Web Scraping Proxies Serie. Zum Verständnis von Erkennungssystemen siehe Wie Anti-Bot-Systeme Proxies erkennen.

Arten von CAPTCHAs in 2026

Arten von CAPTCHAs in 2026
TypWie es funktioniertSchwierigkeit zu Bypass
reCAPTCHA v2 (Checkbox)Klicken Sie auf "Ich bin kein Roboter" + optionale Bild-HerausforderungMittel
reCAPTCHA v3 (nicht sichtbar)Scores Verhalten 0.0-1.0 ohne BenutzerinteraktionHart
HCaptchaHerausforderungen der Bildauswahl (ähnlich reCAPTCHA v2)Mittel
Cloudflare TurnstileBrowser-Herausforderung, meist unsichtbarHart
Kundenspezifisches Bild CAPTCHAsSite-spezifische Herausforderungen (verzerrter Text, Rätsel)Variabel
Nachweis der ArbeitBrowser muss eine Hash berechnen (Cloudflare Under Attack)Mittel

Unsichtbare CAPTCHAs Sind die Real Threat

Die gefährlichsten CAPTCHAs für Kratzer sind die, die Sie nie sehen. ReCAPTCHA v3 und Cloudflare Turnstile führen Sie im Hintergrund, analysieren Sie Mausbewegungen, Scroll-Verhalten, Tippmuster und Browser-Umgebung. Sie weisen eine Treuhandnote zu, ohne eine Herausforderung zu zeigen — und wenn die Partitur zu niedrig ist, wird die Anfrage still gesperrt oder umgeleitet.

Prävention gegen Lösen: Warum Prävention gewinnt

Prävention gegen Lösen: Warum Prävention gewinnt
AnsatzKosten pro CAPTCHAGeschwindigkeitZuverlässigkeitSkalierbarkeit
Prävention (keine CAPTCHAs ausgelöst)$0SofortHöchstAusgezeichnet.
Lösungen von CAPTCHA$1-3 pro 1.00010-60 Sekunden85-95%Moderation
KI-basierte Autolösung$2-5 pro 1.0005-30 Sekunden70-90%Unternehmen
Im Maßstab spart Prävention sowohl Geld als auch Zeit. Das Lösen von 100.000 CAPTCHAs pro Tag kostet $100-500 und fügt Stunden Latenz hinzu. Sie zu verhindern, kostet nichts extra über die richtige Proxy und Anfrage-Management.

Vorbeugung Strategie 1: Verwenden Sie hochqualitative Residential Proxies

Die einzige effektivste CAPTCHA-Präventionsmaßnahme nutzt Wohn-Proxies mit hohen Treuhandpunkten. Wohn-IPs werden von ISPs echten Haushalten zugeordnet, so dass Websites Ihre Anfragen nicht leicht von echten Nutzerverkehr unterscheiden können.

import requests
# Residential proxy — high trust score, fewer CAPTCHAs
PROXY = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
def scrape_with_residential(url: str) -> str:
    """Use residential proxies to avoid triggering CAPTCHAs."""
    session = requests.Session()
    session.proxies = {"http": PROXY, "https": PROXY}
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/120.0.0.0 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
        "Accept-Encoding": "gzip, deflate, br",
    })
    resp = session.get(url, timeout=30)
    return resp.text

ProxyHat's Wohnpool bietet IPs von echten ISPs in 190+ Länder, gibt jeder Anfrage die höchstmögliche Treuhand-Score. Vgl. Residential vs Datacenter Proxies for Scraping für einen detaillierten Vergleich.

Präventionsstrategie 2: Realistische Anforderungsmuster

CAPTCHAs werden oft durch robotische Verhaltensmuster ausgelöst, nicht nur IP-Reputation. Machen Sie Ihre Schaber aussehen human:

Implementierung von Python

import requests
import random
import time
PROXY = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
USER_AGENTS = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 Safari/605.1.15",
]
REFERRERS = [
    "https://www.google.com/",
    "https://www.bing.com/",
    "https://duckduckgo.com/",
    None,  # Direct visit
]
def human_like_scrape(urls: list[str]) -> list[str]:
    """Scrape with realistic human behavior patterns."""
    results = []
    session = requests.Session()
    session.proxies = {"http": PROXY, "https": PROXY}
    for url in urls:
        # Randomize headers per request
        headers = {
            "User-Agent": random.choice(USER_AGENTS),
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Language": "en-US,en;q=0.9",
            "Accept-Encoding": "gzip, deflate, br",
            "Connection": "keep-alive",
            "Upgrade-Insecure-Requests": "1",
        }
        referrer = random.choice(REFERRERS)
        if referrer:
            headers["Referer"] = referrer
        try:
            resp = session.get(url, headers=headers, timeout=30)
            results.append(resp.text)
        except requests.RequestException:
            results.append(None)
        # Human-like delays: 1-5 seconds with occasional longer pauses
        if random.random() < 0.1:
            time.sleep(random.uniform(5, 15))  # 10% chance of long pause
        else:
            time.sleep(random.uniform(1, 4))
    return results

Node.js Implementierung

const HttpsProxyAgent = require('https-proxy-agent');
const fetch = require('node-fetch');
const agent = new HttpsProxyAgent('http://USERNAME:PASSWORD@gate.proxyhat.com:8080');
const USER_AGENTS = [
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36',
  'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
];
function randomDelay() {
  const isLongPause = Math.random() < 0.1;
  const ms = isLongPause
    ? 5000 + Math.random() * 10000
    : 1000 + Math.random() * 3000;
  return new Promise(r => setTimeout(r, ms));
}
async function humanLikeScrape(urls) {
  const results = [];
  for (const url of urls) {
    const headers = {
      'User-Agent': USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)],
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Language': 'en-US,en;q=0.9',
    };
    try {
      const res = await fetch(url, { agent, headers, timeout: 30000 });
      results.push(await res.text());
    } catch {
      results.push(null);
    }
    await randomDelay();
  }
  return results;
}

Prävention Strategie 3: Intelligente IP Rotation

Die Art, wie Sie IPs drehen, beeinflusst die CAPTCHA-Raten. Aggressive Rotation (neue IP jede Anfrage) kann tatsächlich erhöhen CAPTCHAs auf einigen Seiten, weil eine Reihe von Anfragen von verschiedenen IPs auf den gleichen Session-Pfad erscheint verdächtig.

import requests
import uuid
def create_session_for_site(site_id: str):
    """Create a sticky session that maintains the same IP per site.
    This avoids the suspicious pattern of different IPs accessing the same flow."""
    session_id = uuid.uuid5(uuid.NAMESPACE_URL, site_id).hex[:8]
    proxy = f"http://USERNAME-session-{session_id}:PASSWORD@gate.proxyhat.com:8080"
    session = requests.Session()
    session.proxies = {"http": proxy, "https": proxy}
    return session
# Same IP for all requests to a specific product section
session = create_session_for_site("example.com-electronics")
page1 = session.get("https://example.com/electronics?page=1")
page2 = session.get("https://example.com/electronics?page=2")
page3 = session.get("https://example.com/electronics?page=3")
# Different IP for a different section
session2 = create_session_for_site("example.com-clothing")
clothes1 = session2.get("https://example.com/clothing?page=1")

Für mehr Rotationsmuster siehe Proxy-Drehstrategien für großschalige Schrapierung.

Präventionsstrategie 4: Respect Rate Limits

CAPTCHAs sind oft die Eskalation nach der Ratenbegrenzung. Wenn Sie die Geschwindigkeitsgrenzsignale richtig handhaben, sehen Sie selten CAPTCHAs:

import requests
import time
PROXY = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
CAPTCHA_INDICATORS = [
    "captcha",
    "recaptcha",
    "hcaptcha",
    "challenge",
    "verify you are human",
    "please complete the security check",
]
def is_captcha_page(html: str) -> bool:
    """Detect if the response is a CAPTCHA challenge page."""
    html_lower = html.lower()
    return any(indicator in html_lower for indicator in CAPTCHA_INDICATORS)
def scrape_with_captcha_detection(urls: list[str]) -> list[dict]:
    results = []
    session = requests.Session()
    session.proxies = {"http": PROXY, "https": PROXY}
    captcha_count = 0
    backoff = 2.0
    for url in urls:
        try:
            resp = session.get(url, timeout=30)
            if resp.status_code == 200 and not is_captcha_page(resp.text):
                results.append({"url": url, "status": "success", "body": resp.text})
                captcha_count = 0
                backoff = max(backoff * 0.9, 1.0)  # Reduce backoff on success
            elif is_captcha_page(resp.text) or resp.status_code == 403:
                captcha_count += 1
                results.append({"url": url, "status": "captcha"})
                if captcha_count >= 3:
                    # Too many CAPTCHAs — increase backoff significantly
                    backoff = min(backoff * 3, 60)
                    print(f"CAPTCHA streak: {captcha_count}. Backing off to {backoff:.0f}s")
                else:
                    backoff = min(backoff * 1.5, 30)
        except requests.RequestException as e:
            results.append({"url": url, "status": "error", "error": str(e)})
        time.sleep(backoff)
    return results

Für umfassende Ratengrenzstrategien siehe Schrott-Beschränkungen Erklärt.

Wenn Sie CAPTCHAs aushändigen müssen: Erkennung und Routing

Auch bei perfekter Prävention sind einige CAPTCHAs unvermeidbar. Erstellen Sie die Erkennung in Ihre Pipeline, so dass Sie CAPTCHA-Seiten für besonderes Handling Routen können:

import requests
from enum import Enum
PROXY = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
class ResponseType(Enum):
    SUCCESS = "success"
    CAPTCHA = "captcha"
    BLOCKED = "blocked"
    ERROR = "error"
def classify_response(resp: requests.Response) -> ResponseType:
    """Classify a response to determine next action."""
    if resp.status_code == 403:
        return ResponseType.BLOCKED
    if resp.status_code == 429:
        return ResponseType.BLOCKED
    if resp.status_code == 200:
        html = resp.text.lower()
        captcha_signals = ["captcha", "recaptcha", "hcaptcha", "cf-challenge"]
        if any(s in html for s in captcha_signals):
            return ResponseType.CAPTCHA
        return ResponseType.SUCCESS
    return ResponseType.ERROR
def scrape_with_routing(urls: list[str]) -> dict:
    """Scrape URLs and route based on response classification."""
    session = requests.Session()
    session.proxies = {"http": PROXY, "https": PROXY}
    results = {"success": [], "captcha": [], "blocked": [], "error": []}
    for url in urls:
        try:
            resp = session.get(url, timeout=30)
            response_type = classify_response(resp)
            results[response_type.value].append(url)
            if response_type == ResponseType.CAPTCHA:
                # Route to CAPTCHA queue for manual or service-based solving
                print(f"CAPTCHA detected: {url}")
            elif response_type == ResponseType.BLOCKED:
                # Rotate IP and retry
                print(f"Blocked: {url}")
        except requests.RequestException:
            results["error"].append(url)
    print(f"Success: {len(results['success'])}, "
          f"CAPTCHAs: {len(results['captcha'])}, "
          f"Blocked: {len(results['blocked'])}")
    return results

CAPTCHA Prevention Checkliste

  • Benutzen Sie Wohn-Proxies. Sie haben die höchsten Treuhandpunkte und lösen die wenigsten CAPTCHAs aus. ProxyHat Wohnwagen bieten Millionen von sauberen IPs.
  • Setzen Sie realistische Kopfzeilen. Senden Sie immer User-Agent, Akzeptieren, Akzeptieren-Sprache und andere Standard-Browser-Header.
  • Fügen Sie menschliche Verzögerungen hinzu. Zufällige 1-5 zweite Verzögerungen zwischen Anfragen mit gelegentlichen längeren Pausen.
  • Bewahren Sie Sitzungen richtig. Verwenden Sie Cookies und konsistente IPs für entsprechende Anfragen über klebrige Sitzungen.
  • Respect robots.txt. Websites, die robots.txt-Verstöße erkennen eskalieren zu CAPTCHAs schneller.
  • Überwachen Sie die CAPTCHA-Raten. Wenn Ihre CAPTCHA Rate über 5% liegt, muss etwas in Ihrem Ansatz fixiert werden.
  • Vermeiden Sie Schrott während der Stoßzeiten. Anti-Bot-Systeme sind aggressiver während des Hochverkehrs.
  • Benutzer-Agenten richtig drehen. Verwenden Sie aktuelle, realistische Browser-Strings. Mischen Sie keine mobilen und Desktop-UAs auf der gleichen Sitzung.

Für Proxy-Setup in Ihrer bevorzugten Sprache, siehe Verwendung von Proxies in Python, Verwendung von Proxies in Node.js, oder Proxies in Go verwenden. Erkunden ProxyHat für Web Scraping zu beginnen.

Häufig gestellte Fragen

Können Proxies helfen, CAPTCHAs zu vermeiden?

Ja, deutlich. Hochwertige Wohn-Proxie haben saubere IP-Reputationen, die selten CAPTCHAs auslösen. Datacenter IPs werden häufiger markiert, weil sie bekannte automatisierte Quellen sind. Die Kombination von Wohn-Proxies mit richtigen Anforderungsmustern beseitigt die CAPTCHAs für die meisten Ziele praktisch.

Was ist der günstigste Umgang mit CAPTCHAs im Maßstab?

Prävention. Die Investition in Wohngebiete und richtige Abstreifmuster kostet weit weniger als CAPTCHA Lösungsdienstleistungen im Maßstab. Wenn Sie CAPTCHAs lösen müssen, kosten Drittanbieter-Dienste $1-3 pro 1.000, aber hinzufügen Sie 10-60 Sekunden Latenz pro Anfrage.

Helfen kopflose Browser mit CAPTCHAs?

Sie helfen mit unsichtbaren CAPTCHAs (reCAPTCHA v3, Turnstile) durch die Bereitstellung einer realen Browser-Umgebung mit JavaScript-Ausführung. Sie sind jedoch langsamer und ressourcenintensiver. Verwenden Sie sie nur für Ziele, die spezifisch eine Browser-Level-Verifikation erfordern.

Woher weiß ich, ob ich CAPTCHA-Seiten bekomme?

Überprüfen Sie die Antwort HTML für CAPTCHA Indikatoren: "captcha", "recaptcha", "hcaptcha", "Herausforderung", oder "verify you are human". Achten Sie auch auf unerwartete 403 Antworten und redirects, um URLs herauszufordern. Erstellen Sie eine automatisierte Erkennung in Ihre Abstreifpipeline.

Warum bekomme ich CAPTCHAs immer noch mit Wohn-Proxies?

Normalerweise wegen Anforderung Muster, nicht IP-Qualität. Häufige Ursachen: zu viele Anfragen pro Minute, fehlende Browser-Header, Cookie-Handling-Probleme oder Schrottmuster, die zu systematisch sind. Slow down, add jitter und verwenden Sie klebrige Sitzungen für verwandte Anfragen.

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