Anwendungsfälle

Proxy-Rotation für CAPTCHA-Scraping

Wenn ein Scraper nach wenigen hundert Anfragen plötzlich an jeder Seite ein CAPTCHA sieht, liegt das selten am Ziel selbst – es liegt an der IP. Genau hier setzt Proxy-Rotation an: Sie verteilt Anfragen auf viele Adressen, sodass keine einzelne IP ein verdächtiges Muster aufbaut. Die CAPTCHAs, die trotzdem erscheinen, lösen Sie mit CaptchaAI aus derselben Pipeline heraus. So verbinden Sie eine niedrige CAPTCHA-Rate mit einer verlässlichen Fallback-Lösung, statt sich auf eine einzelne Technik zu verlassen.

Kurz gefasst: Proxy-Rotation senkt die CAPTCHA-Rate, CaptchaAI löst die Abfragen, die trotzdem erscheinen – zwei Ebenen, eine Pipeline.

DSGVO: IP-Adressen und rechtssicheres Scraping

Bevor es um Technik geht, lohnt in der DACH-Region der Blick auf die Rechtslage. Beim Scraping über rotierende Proxys verarbeiten Sie fast immer IP-Adressen – und die gelten nach DSGVO als personenbezogene Daten. Klären Sie daher zwei Punkte, bevor ein Proxy-Pool produktiv läuft: ob Sie eine Rechtsgrundlage (etwa ein berechtigtes Interesse nach Art. 6 DSGVO) für die Datenerhebung haben und ob die Nutzungsbedingungen der Zielseite das automatisierte Auslesen erlauben.

Ein Residential-Proxy leitet Anfragen über die Anschlüsse echter Privatpersonen – prüfen Sie, dass Ihr Anbieter diese IPs rechtmäßig und mit Einwilligung bezieht. Für den Betrieb der Worker eignen sich europäische Anbieter wie Hetzner oder netcup, wenn Sie Datenflüsse innerhalb der EU halten möchten. Diese Prüfung ist Ihre Sorgfaltspflicht als Betreiber: CaptchaAI löst die CAPTCHA-Abfrage, trifft aber keine Aussage über die Zulässigkeit Ihres konkreten Vorhabens.

Warum Proxy-Rotation die CAPTCHA-Rate senkt

Websites lösen CAPTCHAs anhand des Anfrageverhaltens pro IP aus. Verteilt sich derselbe Traffic auf viele Adressen, sinkt die Wahrscheinlichkeit, dass eine einzelne IP als Bot eingestuft wird:

Faktor Einzelne IP Rotierende Proxys
Anfragen pro Minute ab 10 löst ein CAPTCHA aus auf mehrere IPs verteilt
IP-Reputation verschlechtert sich mit der Zeit frische IPs aus dem Pool
Sitzungsmuster verdächtige Muster sichtbar Muster über IPs verteilt
Geografische Konsistenz einzelner Standort natürliche geografische Vielfalt

Was das für Ihre Anfragerate bedeutet

Eine einzelne IP darf nur ein begrenztes Kontingent pro Minute schicken, bevor sie auffällt. Zehn rotierende Proxys vervielfachen dieses Budget, ohne dass eine einzelne Adresse das kritische Muster erreicht.

Proxy-Typen im Vergleich: Residential, Mobile, ISP, Rechenzentrum

Nicht jeder Proxy-Typ passt zu jedem Ziel. Als grobe Orientierung gilt: je aggressiver die Bot-Erkennung, desto eher lohnen sich Residential- oder Mobile-Adressen.

Typ Am besten geeignet für CAPTCHA-Rate Kosten
Residential anspruchsvolle Ziele (Google, Amazon) am niedrigsten $$$
Mobile extrem niedrige Erkennungsrate am niedrigsten $$$$
ISP/Static dauerhafte Sitzungen niedrig $$
Rechenzentrum hohe Volumina, tolerante Websites höher $

Wann Residential, wann Rechenzentrum?

Empfehlung: Für Ziele mit aggressiven CAPTCHA-Triggern setzen Sie auf Residential-Proxys. Für weniger stark geschützte Seiten reichen Rechenzentrums-Proxys – sie sind deutlich günstiger und schnell genug.

Grundlegende Proxy-Rotation in Python

Der Einstieg ist eine simple Zufallsauswahl aus einer Proxy-Liste. Erkennt die Antwort ein CAPTCHA, wird es direkt an CaptchaAI übergeben und der resultierende Token in dieselbe Sitzung eingefügt:

import requests
import random
import time

PROXIES = [
    "http://user:pass@proxy1.example.com:8080",
    "http://user:pass@proxy2.example.com:8080",
    "http://user:pass@proxy3.example.com:8080",
]

API_KEY = "YOUR_API_KEY"

def get_random_proxy():
    proxy = random.choice(PROXIES)
    return {"http": proxy, "https": proxy}

def scrape_with_rotation(url):
    proxy = get_random_proxy()
    session = requests.Session()
    session.proxies = proxy
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    })

    resp = session.get(url)

    # If CAPTCHA appears, solve it
    if "g-recaptcha" in resp.text or "captcha" in resp.text.lower():
        from bs4 import BeautifulSoup
        soup = BeautifulSoup(resp.text, "html.parser")
        rc = soup.find("div", class_="g-recaptcha")
        if rc:
            site_key = rc["data-sitekey"]
            token = solve_captcha(site_key, url)
            resp = session.post(url, data={"g-recaptcha-response": token})

    return resp.text

def solve_captcha(site_key, page_url):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY, "method": "userrecaptcha",
        "googlekey": site_key, "pageurl": page_url
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if result.text.startswith("OK|"): return result.text.split("|")[1]
        raise Exception(result.text)
    raise TimeoutError()

Hinweis: Der Token muss in dieselbe Sitzung zurückfließen, aus der die Seite geladen wurde. Wird er über eine andere IP eingereicht, weisen viele Websites ihn ab.

Proxys nach Erfolgsquote gewichten

Nicht jeder Proxy im Pool ist gleich gut. Erfassen Sie pro Proxy, wie oft er zu einem CAPTCHA führt, und bevorzugen Sie die Adressen mit der höchsten Erfolgsquote:

from collections import defaultdict
import random

class SmartProxyRotator:
    def __init__(self, proxies):
        self.proxies = proxies
        self.captcha_count = defaultdict(int)
        self.success_count = defaultdict(int)

    def get_proxy(self):
        # Prefer proxies with lower CAPTCHA rates
        scored = []
        for proxy in self.proxies:
            total = self.captcha_count[proxy] + self.success_count[proxy]
            if total == 0:
                score = 0.5  # Unknown proxy, neutral score
            else:
                score = self.success_count[proxy] / total
            scored.append((proxy, score))

        # Weight selection by score
        scored.sort(key=lambda x: x[1], reverse=True)
        top_proxies = scored[:max(len(scored) // 2, 1)]
        proxy = random.choice(top_proxies)[0]
        return proxy

    def report_success(self, proxy):
        self.success_count[proxy] += 1

    def report_captcha(self, proxy):
        self.captcha_count[proxy] += 1

# Usage
rotator = SmartProxyRotator(PROXIES)

def scrape(url):
    proxy = rotator.get_proxy()
    resp = requests.get(url, proxies={"http": proxy, "https": proxy})

    if "captcha" in resp.text.lower():
        rotator.report_captcha(proxy)
        # Solve CAPTCHA...
    else:
        rotator.report_success(proxy)

    return resp.text

Proxy-Rotation in Selenium einrichten

Für JavaScript-lastige Ziele rotieren Sie den Proxy pro Browser-Sitzung statt pro Anfrage:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

def create_driver_with_proxy(proxy_url):
    options = Options()
    options.add_argument(f"--proxy-server={proxy_url}")
    options.add_argument("--disable-blink-features=AutomationControlled")
    return webdriver.Chrome(options=options)

# Rotate proxy per session
proxy = random.choice(PROXIES)
driver = create_driver_with_proxy(proxy)
driver.get("https://example.com")

Cloudflare Challenge mit Proxy lösen

Cloudflare Challenge ist der Sonderfall: Hier muss der Proxy an CaptchaAI übergeben werden, weil das erzeugte cf_clearance-Cookie an die lösende IP gebunden ist. Verwenden Sie danach exakt denselben Proxy für alle Folgeanfragen:

proxy = "http://user:pass@proxy.example.com:8080"

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": API_KEY,
    "method": "cloudflare_challenge",
    "pageurl": "https://example.com",
    "proxy": proxy,
    "proxytype": "HTTP"
})
task_id = resp.text.split("|")[1]

# Poll for cf_clearance cookie
# Use the same proxy for subsequent requests

Der Ablauf hat dadurch drei feste Schritte:

  • Proxy und pageurl an CaptchaAI übergeben und die Challenge lösen lassen.
  • Das zurückgegebene cf_clearance-Cookie in Ihre Sitzung übernehmen.
  • Alle Folgeanfragen über denselben Proxy senden, damit das Cookie gültig bleibt.

Praxistipps für einen stabilen Proxy-Pool

  1. Proxy-Region zum Ziel passend wählen – für deutschsprachige Zielseiten DACH- oder EU-IPs verwenden, damit Sie dieselben lokalisierten Inhalte erhalten wie ein regionaler Nutzer.
  2. Eine Sitzung pro Proxy – Sitzungen nicht über mehrere Proxys hinweg wiederverwenden.
  3. Rate-Limiting pro Proxy – maximal 5–10 Anfragen pro Minute je IP.
  4. CAPTCHA-Raten überwachen – erfassen, welche Proxys häufiger CAPTCHAs auslösen, und diese aussortieren.
  5. Sticky Sessions nutzen – denselben Proxy für mehrstufige Abläufe beibehalten.
  6. Proxy-Fehler abfangen – bei Verbindungsfehlern mit einem anderen Proxy erneut versuchen.

Typische Fehler und ihre Behebung

Problem Lösung
Alle Proxys lösen CAPTCHAs aus auf Residential-Proxys wechseln, Anfragerate senken
Timeout-Fehler beim Proxy langsame Proxys aus dem Pool entfernen, Timeout erhöhen
Unterschiedliche Inhalte je Proxy manche Websites liefern geospezifische Inhalte – normalisieren
CAPTCHA-Token funktioniert nicht mit Proxy Token aus derselben Sitzung/IP verwenden

Häufige Fragen

Welche Anfragerate pro Proxy ist sicher?

Als Richtwert gelten 5–10 Anfragen pro Minute und IP. Höhere Raten je Adresse sind der häufigste Grund, warum eine Rotation trotzdem CAPTCHAs auslöst. Verteilen Sie das Volumen lieber auf mehr Proxys, statt einzelne IPs stärker zu belasten.

Ist ein CAPTCHA-Token an die Proxy-IP gebunden?

Bei den meisten Typen nicht – ein reCAPTCHA- oder Turnstile-Token ist unabhängig von der IP gültig, mit der Sie es angefordert haben. Die Ausnahme ist Cloudflare Challenge: Das cf_clearance-Cookie ist IP-gebunden, deshalb müssen Lösung und Folgeanfragen über denselben Proxy laufen.

Was kostet ein sinnvoller Proxy-Pool im Vergleich zu CaptchaAI?

Ein rotierender Residential-Pool kostet je nach Anbieter oft mehr pro Monat als der CaptchaAI-Zugang selbst. CaptchaAI beginnt bei BASIC (15 $/Monat, 5 Threads) mit unbegrenzten Lösungen pro Thread und rechnet pro gleichzeitigem Thread ab – nicht pro Lösung. Proxys und Solver ergänzen sich also: Proxys senken die CAPTCHA-Rate, CaptchaAI übernimmt den Rest.

Warum erscheinen trotz Rotation weiter CAPTCHAs?

Meist liegt es an zu wenigen oder zu schlecht bewerteten Proxys, an einer zu hohen Rate pro IP oder an Rechenzentrums-Adressen auf einem anspruchsvollen Ziel. Wechseln Sie auf Residential-Proxys, senken Sie die Rate und gewichten Sie den Pool nach Erfolgsquote (siehe das Beispiel weiter oben).

Verwandte Leitfäden

Kommentare sind für diesen Artikel deaktiviert.