Wenn Ihr Scraper auf eine reCAPTCHA v2-Herausforderung trifft, stoppt der Workflow. Die Seite wartet darauf, dass ein Mensch das Kontrollkästchen oder das Bildraster löst, bevor die von Ihnen benötigten Daten bereitgestellt werden. Der schnellste Weg, das Scraping fortzusetzen, besteht darin, das CAPTCHA an eine Solver-API weiterzuleiten: Extrahieren Sie den Sitekey und die Seiten-URL und senden Sie sie an CaptchaAI senden, Sie ein gültiges Token und fügen Sie es wieder in die Seite ein.
Diese Anleitung zeigt den vollständigen Ablauf mit funktionierendem Code für Python (Selenium + Anfragen) und Node.js (Puppeteer).
So funktioniert der Workflow
Jedes reCAPTCHA v2-Widget verfügt über zwei Parameter, die Ihr Scraper benötigt:
googlekey– der öffentliche Sitekey, der in den HTML-Code der Seite eingebettet istpageurl– die URL, unter der das CAPTCHA erscheint
Ihr Scraper sendet diese an die CaptchaAI-API, wartet auf ein gelöstes Token und fügt das Token zurück in das g-recaptcha-response-Feld der Seite ein (oder ruft die Callback-Funktion auf). Das Backend der Zielseite überprüft das Token anhand von Google und lässt die Anfrage durch.
Python: Selen + CaptchaAI
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
# Step 1: Open the page with Selenium
driver = webdriver.Chrome()
driver.get("https://example.com/protected-page")
# Step 2: Extract the sitekey
sitekey = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
page_url = driver.current_url
# Step 3: Submit to CaptchaAI
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": 1
}).json()
task_id = response["request"]
# Step 4: Poll for result
token = None
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
if result.get("request") != "CAPCHA_NOT_READY":
raise RuntimeError(f"Solve failed: {result['request']}")
# Step 5: Inject the token and submit
driver.execute_script(
f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)
# Check for callback
callback = driver.execute_script(
'var el = document.querySelector(".g-recaptcha"); '
'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
driver.execute_script(f'{callback}("{token}");')
else:
driver.find_element(By.CSS_SELECTOR, "form").submit()
# Step 6: Scrape the data
print(driver.page_source[:500])
driver.quit()
Node.js: Puppenspieler + CaptchaAI
const puppeteer = require("puppeteer");
async function scrapeWithCaptcha(url) {
const browser = await puppeteer.launch({ headless: "new" });
const page = await browser.newPage();
await page.goto(url, { waitUntil: "networkidle2" });
// Extract sitekey
const sitekey = await page.$eval(".g-recaptcha", (el) => el.dataset.sitekey);
// Submit to CaptchaAI
const submitRes = await fetch(
`https://ocr.captchaai.com/in.php?${new URLSearchParams({
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: sitekey,
pageurl: url,
json: 1,
})}`
);
const { request: taskId } = await submitRes.json();
// Poll for result
let token;
for (let i = 0; i < 40; i++) {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(
`https://ocr.captchaai.com/res.php?${new URLSearchParams({
key: "YOUR_API_KEY",
action: "get",
id: taskId,
json: 1,
})}`
);
const data = await res.json();
if (data.status === 1) {
token = data.request;
break;
}
if (data.request !== "CAPCHA_NOT_READY")
throw new Error(`Solve failed: ${data.request}`);
}
// Inject token
await page.evaluate((t) => {
document.getElementById("g-recaptcha-response").innerHTML = t;
const cb = document.querySelector(".g-recaptcha")?.dataset.callback;
if (cb && window[cb]) window[cb](t);
}, token);
// Wait for navigation after form submit
await page.waitForNavigation({ waitUntil: "networkidle2" });
const content = await page.content();
await browser.close();
return content;
}
scrapeWithCaptcha("https://example.com/protected-page").then(console.log);
Headless vs. Headed-Modus
Einige Websites erkennen Headless-Browser und blockieren sie, bevor das CAPTCHA überhaupt erscheint. Wenn Sie blockiert werden, bevor Sie reCAPTCHA sehen:
- Verwenden Sie
headless: "new"in Puppeteer (moderner Headless-Modus) - Fügen Sie
--disable-blink-features=AutomationControlledzu Chromium-Flags hinzu - Verwenden Sie eine echte User-Agent-Zeichenfolge
- Erwägen Sie die Verwendung einer Proxy-Rotation bei Ihren CaptchaAI-Lösungen
Nur-HTTP-Ansatz (kein Browser)
Wenn die Zielseite das CAPTCHA in einem Formularübermittlungsablauf sendet, können Sie den Browser vollständig überspringen:
import requests
import time
session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
# Load the page to get cookies
session.get("https://example.com/protected-page")
# Solve the CAPTCHA
sitekey = "6Le-wvkSAAAAAN..." # extracted from page HTML
solve_resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY", "method": "userrecaptcha",
"googlekey": sitekey, "pageurl": "https://example.com/protected-page",
"json": 1
}).json()
task_id = solve_resp["request"]
time.sleep(15)
# Poll
for _ in range(30):
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
token = result["request"]
break
time.sleep(5)
# Submit with token
resp = session.post("https://example.com/protected-page", data={
"g-recaptcha-response": token,
"other_field": "value"
})
print(resp.text[:500])
FAQ
Verlangsamt das Lösen von reCAPTCHA v2 meinen Scraper?
Jede Lösung dauert 15–60 Sekunden. Führen Sie für das Scraping großer Mengen mehrere Lösungen parallel aus (CaptchaAI unterstützt gleichzeitige Aufgaben pro Thread).
Kann ich reCAPTCHA-Tokens zwischenspeichern?
Nein. Jeder Token ist zur einmaligen Verwendung bestimmt und läuft nach ca. 2 Minuten ab. Sie benötigen für jede geschützte Seitenanforderung eine neue Lösung.
Benötige ich einen Browser, um mit reCAPTCHA v2 umgehen zu können?
Nicht immer. Wenn die Site g-recaptcha-response als POST-Feld akzeptiert, können Sie einen reinen HTTP-Ansatz verwenden. Wenn die Website eine JavaScript-basierte Token-Injektion erfordert, benötigen Sie einen Browser.
Wie gehe ich mit rotierenden Proxys mit CaptchaAI um?
CaptchaAI löst CAPTCHAs auf seiner eigenen Infrastruktur – Sie müssen Ihren Proxy nicht für das Standard-reCAPTCHA v2 übergeben. Verwenden Sie Ihre Proxys für die folgenden Scraping-Anfragen.
Was passiert, wenn die Website Enterprise reCAPTCHA verwendet?
Fügen Sie enterprise=1 zu Ihrer CaptchaAI-Anfrage hinzu. SehenSo lösen Sie reCAPTCHA v2 Enterprise mithilfe der API.
Beginnen Sie mit dem Durchsuchen von reCAPTCHA v2
- Holen Sie sich Ihren API-Schlüssel untercaptchaai.com/api.php
- Extrahieren Sie den Sitekey von der Zielseite
- Verwenden Sie die obigen Codebeispiele zum Lösen und Injizieren
- Skalieren Sie mit gleichzeitigen Lösungen für Arbeitsabläufe mit hohem Volumen
Verwandte Leitfäden
- So lösen Sie reCAPTCHA v2 mithilfe der API
- Selenium CAPTCHA-Handhabung mit Python
- Puppeteer CAPTCHA-Lösung mit Node.js
- Häufige reCAPTCHA v2-Lösungsfehler