CAPTCHAs sind der häufigste Blocker in Web-Scraping-Workflows. Wenn eine Zielseite ein reCAPTCHA, Cloudflare Turnstile oder ein Bild-CAPTCHA bereitstellt, bleibt Ihr Scraper stehen. Die API von CaptchaAI löst diese Herausforderungen automatisch, sodass Ihr Scraper weiter läuft.
So funktioniert die CAPTCHA-Blockierung beim Scraping
Websites lösen CAPTCHAs basierend auf Verhaltenssignalen aus:
| Signal | Auslöser |
|---|---|
| Anfragepreis | Zu viele Anfragen von einer IP |
| Fehlende Kekse | Keine Sitzungs- oder Präferenzcookies |
| Bot-ähnliche Header | Fehlende Accept-Language, Referer |
| JavaScript-Browser-Signalprofil | Keine JS-Ausführung oder Headless-Browser erkannt |
| IP-Reputation | Rechenzentrums- oder Proxy-IP markiert |
Bei Auslösung gibt die Website anstelle des Seiteninhalts eine CAPTCHA-Aufforderung zurück. Ihr Scraper muss das Problem lösen und den Token einreichen, um fortzufahren.
Anforderungen
| Anforderung | Einzelheiten |
|---|---|
| CaptchaAI API-Schlüssel | Auscaptchaai.com |
| Python 3.7+ oder Node.js 16+ | Für Codebeispiele |
requests / axios |
HTTP-Client-Bibliothek |
| Ziel-Site-URL | Die Seite, die das CAPTCHA bereitstellt |
| CAPTCHA-Site-Schlüssel | Aus der Seitenquelle extrahiert |
Schritt 1: Identifizieren Sie den CAPTCHA-Typ
Ermitteln Sie vor der Lösung, welches CAPTCHA die Website verwendet. Überprüfen Sie die Seitenquelle:
reCAPTCHA v2:
<div class="g-recaptcha" data-sitekey="6Le-wvkS..."></div>
reCAPTCHA v3:
<script src="https://www.google.com/recaptcha/api.js?render=6Le-wvkS..."></script>
Cloudflare Turnstile:
<div class="cf-turnstile" data-sitekey="0x4AAAAA..."></div>
Jeder Typ erfordert einen anderen method-Parameter bei der Übermittlung an CaptchaAI.
Schritt 2: Extrahieren Sie den Site-Schlüssel
Python (mit Anfragen + BeautifulSoup)
from bs4 import BeautifulSoup
import requests
page = requests.get("https://example.com/protected-page", headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
soup = BeautifulSoup(page.text, "html.parser")
# reCAPTCHA v2
recaptcha_div = soup.find("div", class_="g-recaptcha")
if recaptcha_div:
site_key = recaptcha_div["data-sitekey"]
print(f"reCAPTCHA v2 site key: {site_key}")
Node.js (mit Cheerio)
const axios = require("axios");
const cheerio = require("cheerio");
const { data } = await axios.get("https://example.com/protected-page");
const $ = cheerio.load(data);
const siteKey = $(".g-recaptcha").attr("data-sitekey");
console.log("Site key:", siteKey);
Schritt 3: Senden Sie das CAPTCHA an CaptchaAI
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_KEY = "6Le-wvkS..."
PAGE_URL = "https://example.com/protected-page"
# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": SITE_KEY,
"pageurl": PAGE_URL
})
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
task_id = resp.text.split("|")[1]
print(f"Task submitted: {task_id}")
# Poll for result
while True:
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|"):
token = result.text.split("|")[1]
print(f"Solved! Token: {token[:50]}...")
break
raise Exception(f"Solve error: {result.text}")
Node.js
const axios = require("axios");
const API_KEY = "YOUR_API_KEY";
const SITE_KEY = "6Le-wvkS...";
const PAGE_URL = "https://example.com/protected-page";
// Submit
const submitResp = await axios.get("https://ocr.captchaai.com/in.php", {
params: {
key: API_KEY,
method: "userrecaptcha",
googlekey: SITE_KEY,
pageurl: PAGE_URL,
},
});
const taskId = submitResp.data.split("|")[1];
// Poll
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
while (true) {
await sleep(5000);
const result = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: taskId },
});
if (result.data === "CAPCHA_NOT_READY") continue;
if (result.data.startsWith("OK|")) {
const token = result.data.split("|")[1];
console.log("Token:", token.substring(0, 50));
break;
}
throw new Error(`Error: ${result.data}`);
}
Schritt 4: Senden Sie das Token an die Zielsite
Sobald Sie das Token haben, senden Sie es mit den Formulardaten, die die Site erwartet:
Python
# Submit the solved token with the form
form_data = {
"g-recaptcha-response": token,
"username": "user@example.com",
"password": "password123"
}
response = requests.post(PAGE_URL, data=form_data, headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})
print(f"Status: {response.status_code}")
Schritt 5: Erstellen Sie eine wiederverwendbare Scraper-Funktion
Wickeln Sie die Lösungslogik in eine wiederverwendbare Funktion ein:
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_captcha(site_key, page_url, method="userrecaptcha"):
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": method,
"googlekey": site_key,
"pageurl": page_url
})
if not resp.text.startswith("OK|"):
raise Exception(resp.text)
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("CAPTCHA solve timed out")
# Use in your scraper
def scrape_page(url, site_key):
token = solve_captcha(site_key, url)
response = requests.post(url, data={"g-recaptcha-response": token})
return response.text
Fehlerbehebung
| Fehler | Ursache | Beheben |
|---|---|---|
ERROR_WRONG_USER_KEY |
Ungültiger API-Schlüssel | Überprüfen Sie Ihren Schlüssel im Dashboard von captchaai.com |
ERROR_ZERO_BALANCE |
Keine Mittel | Fügen Sie Ihrem Konto Guthaben hinzu |
ERROR_CAPTCHA_UNSOLVABLE |
Die Herausforderung konnte nicht gelöst werden | Überprüfen Sie, ob der Site-Schlüssel und die URL korrekt sind |
CAPCHA_NOT_READY (Schleifen für immer) |
Langsame Lösung oder falsche Parameter | Timeout erhöhen; Überprüfen Sie, ob der Site-Schlüssel mit der Seite übereinstimmt |
| Token von der Website abgelehnt | Token abgelaufen oder falscher Site-Schlüssel | Token innerhalb von 120 Sekunden verwenden; Bestätigen Sie den Site-Schlüssel |
Best Practices
- Benutzeragenten rotieren – Verwenden Sie realistische Browser-Benutzeragentenzeichenfolgen
- Verzögerungen hinzufügen – Platzanfragen im Abstand von 2–5 Sekunden, um Ratenbeschränkungen zu vermeiden
- Verwenden Sie Proxys – Rotieren Sie private Proxys, um Anfragen zu verteilen
- Verwaltung von Cookies – Behalten Sie Sitzungscookies für alle Anfragen bei
- Cache-Tokens – Einige Token funktionieren für mehrere Anfragen innerhalb ihres Gültigkeitsfensters
FAQ
Funktioniert das mit Cloudflare-geschützten Websites?
Ja. Verwenden Sie method=turnstile für Turnstile-CAPTCHAs oder method=cloudflare_challenge für vollständige Cloudflare-Challenge-Seiten. SehenSo umgehen Sie Cloudflare Turnstile.
Benötige ich einen Headless-Browser?
Nicht immer. Für einfache Formularübermittlungen mit reCAPTCHA funktionieren einfache HTTP-Anfragen. Kombinieren Sie für JavaScript-lastige Websites CaptchaAI mit Selenium oder Puppeteer.
Wie viel kostet es, 10.000 Seiten zu durchsuchen?
Bei den Tarifen von CaptchaAI kostet das Lösen von 10.000 reCAPTCHA v2-Herausforderungen etwa 10 US-Dollar. Bild-CAPTCHAs sind noch günstiger.
Kann ich CAPTCHAs parallel lösen?
Ja. Senden Sie mehrere Aufgaben gleichzeitig und fragen Sie jedes Ergebnis ab. Siehe CAPTCHAs parallel lösen.
Verwandte Leitfäden
- Selenium CAPTCHA-Handhabung mit Python
- Puppeteer CAPTCHA-Lösung mit Node.js
- Geschützte Webseiten scrapen