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
pageurlan 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
- 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.
- Eine Sitzung pro Proxy – Sitzungen nicht über mehrere Proxys hinweg wiederverwenden.
- Rate-Limiting pro Proxy – maximal 5–10 Anfragen pro Minute je IP.
- CAPTCHA-Raten überwachen – erfassen, welche Proxys häufiger CAPTCHAs auslösen, und diese aussortieren.
- Sticky Sessions nutzen – denselben Proxy für mehrstufige Abläufe beibehalten.
- 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).