Explainers

Umgang mit reCAPTCHA v2 in Web Scraping-Workflows

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:

  1. googlekey – der öffentliche Sitekey, der in den HTML-Code der Seite eingebettet ist
  2. pageurl – 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=AutomationControlled zu 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

  1. Holen Sie sich Ihren API-Schlüssel untercaptchaai.com/api.php
  2. Extrahieren Sie den Sitekey von der Zielseite
  3. Verwenden Sie die obigen Codebeispiele zum Lösen und Injizieren
  4. 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
Kommentare sind für diesen Artikel deaktiviert.

Verwandte Beiträge

Explainers Leitfaden zur reCAPTCHA-Anker- und Bframe-URL-Extraktion
Klarer Überblick zu Leitfaden zur re CAPTCHA-Anker- und Bframe-URL-Extraktion und dazu, was das für Automatisierung, Integration und Erfolgsquoten mit Captcha A...

Klarer Überblick zu Leitfaden zur re CAPTCHA-Anker- und Bframe-URL-Extraktion und dazu, was das für Automatisi...

Apr 28, 2026
Comparisons Headless vs. Headed Chrome für CAPTCHA-Tests in eigener QA
Wann sich Headless-Chrome und wann Headed-Chrome für CAPTCHA-Tests in eigenen CI- und QA-Pipelines eignet, und welche Auswirkungen die Wahl auf Stabilität und L...

Wann sich Headless-Chrome und wann Headed-Chrome für CAPTCHA-Tests in eigenen CI- und QA-Pipelines eignet, und...

Apr 17, 2026