Anwendungsfälle

So bewältigen Sie CAPTCHA-Herausforderungen in Web-Scraping-Workflows

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

  1. Benutzeragenten rotieren – Verwenden Sie realistische Browser-Benutzeragentenzeichenfolgen
  2. Verzögerungen hinzufügen – Platzanfragen im Abstand von 2–5 Sekunden, um Ratenbeschränkungen zu vermeiden
  3. Verwenden Sie Proxys – Rotieren Sie private Proxys, um Anfragen zu verteilen
  4. Verwaltung von Cookies – Behalten Sie Sitzungscookies für alle Anfragen bei
  5. 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
Kommentare sind für diesen Artikel deaktiviert.