Scarnox · Blog

Web-Scraping und Captchas: warum sie auftauchen und was zu tun ist

Ein Captcha taucht beim Scraping auf, wenn eine Seite entscheidet, dass eine Anfrage automatisiert wirkt. Die üblichen Auslöser sind zu viele Anfragen in kurzer Zeit, eine IP-Adresse mit schlechter Reputation, fehlende Browser-Signale oder ein Zugriff auf eine Seite, die strenger geschützt ist als der Rest. Die praktische Antwort hat drei Schritte, in dieser Reihenfolge: die Auslöser verringern, das Captcha im Code erkennen und das Captcha lösen, dem du nicht ausweichen kannst. Dieser Leitfaden behandelt jeden Schritt und verweist für den Rest auf die ausführlichen Leitfäden.

Warum Seiten Scrapern Captchas zeigen

Eine Seite hat im Moment der Anfrage wenig Möglichkeiten, einen Menschen von einem Skript zu unterscheiden, also achtet sie auf Muster. Ein Scraper fällt oft auf, weil er

Jeder dieser Punkte kann allein schon reichen. Das Captcha ist die Art der Seite, nach einem menschenähnlichen Schritt zu fragen, bevor sie weitere Seiten ausliefert. Das Muster zu verringern reduziert meist die Captchas, und das ist günstiger, als sie zu lösen.

Das Captcha im Code erkennen

Bevor du irgendetwas löst, prüfe, ob die Seite, die du erhalten hast, überhaupt die Captcha-Seite ist. Ein einfacher Test sucht nach dem Widget-Markup und liest den Sitekey:

import re
import requests

SITEKEY_RE = re.compile(r'data-sitekey="([0-9a-f-]{36})"')

def fetch(url: str) -> dict:
    resp = requests.get(
        url,
        timeout=30,
        headers={"User-Agent": "ExampleBot/1.0 (+https://example.com/bot)"},
    )
    html = resp.text
    if "h-captcha" in html or "g-recaptcha" in html:
        match = SITEKEY_RE.search(html)
        return {"captcha": True, "sitekey": match.group(1) if match else None, "html": html}
    return {"captcha": False, "sitekey": None, "html": html}

page = fetch("https://example.com/search?q=shoes")
if page["captcha"]:
    print("captcha found, sitekey:", page["sitekey"])

Die Zeichenfolgen h-captcha und g-recaptcha sind nur das Markup, das eine Seite verwendet. Der Test ist also ein Signal, keine Garantie. Fehlt der Sitekey, siehe wie du einen Captcha-Sitekey findest.

Lösen, wenn du nicht ausweichen kannst

Wenn ein PopularCaptcha-Widget auf der Seite liegt und du seinen Sitekey hast, kannst du mit einer POST-Anfrage ein Token von der Scarnox-API anfordern und es im Feld h-captcha-response absenden. Die vollständige Funktion mit Fehlerbehandlung steht in Ein Captcha mit einer Anfrage aus Python lösen. Verwende das Token sofort, denn es läuft nach etwa zwei Minuten ab. Die Timing-Details stehen unter Captcha-Token abgelaufen.

Scarnox unterstützt heute PopularCaptcha, proxyless und mit deinem eigenen Proxy. reCAPTCHA v2 und v3, Cloudflare Turnstile, GeeTest, AWS WAF und Arkose kommen demnächst. Wenn dein Ziel einen davon nutzt, erklären die Captcha-Leitfäden die allgemeinen Optionen, aber baue keinen Produktivablauf auf einer Lösung auf, die noch nicht live ist.

Ein Entscheidungsablauf für jede blockierte Seite

Wenn dein Scraper auf ein Captcha trifft, hält eine einfache Entscheidungsreihenfolge den Job ehrlich und das Anfragevolumen niedrig:

  1. Gibt es eine Datenquelle, die du stattdessen nutzen kannst? Wenn eine API, ein Feed oder ein Export die Felder abdeckt, die du brauchst, wechsle dorthin und höre auf, diese Seite anzufragen.
  2. **Erlaubt robots.txt den Pfad?** Wenn nicht, überspringe ihn. Löse kein Captcha auf einer Seite, die du in Ruhe lassen solltest.
  3. Hast du zu viel zu schnell gesendet? Pausiere länger, senke deine Rate und prüfe später erneut. Viele Captchas verschwinden bei einem langsameren Tempo.
  4. Ist das Captcha ein live unterstützter Typ? Wenn es PopularCaptcha ist, gilt die Lösung aus diesem Leitfaden. Ist es ein Typ, der demnächst kommt, halte den Job pausiert und beobachte die Veröffentlichung.
  5. Ist die Seite eine, die du automatisieren darfst? Wenn die Antwort unklar ist, frage den Betreiber der Seite, bevor du weitermachst.

Der vierte Schritt wird am häufigsten übersprungen. Ein Solver ist nur nützlich, wenn der Captcha-Typ unterstützt wird, und ein Job, der einen nicht unterstützten Typ wiederholt, verschwendet Zeit und Anfragen.

Das Captcha in einem Job behandeln, nicht in einer Schleife

Setze die Lösung in den Codepfad, der das Token braucht, damit der Job jedes Captcha protokollieren, anhalten kann, wenn eine Seite immer wieder fehlschlägt, und weitermachen kann. Eine unbegrenzte Schleife, die immer wieder eine Captcha-Seite anfragt, ist der schnellste Weg, dass die Firewall einer Seite deine Adresse dauerhaft sperrt.

Fehler überwachen

Führe eine Zählung der Seiten, die ein Captcha liefern, gruppiert nach URL und Tageszeit. Ein Captcha, das nur in einem Bereich einer Seite oder nur nach einer bestimmten Anzahl von Anfragen erscheint, zeigt dir, wo der Auslöser liegt. Diese Information ist nützlicher als ein schnellerer Solver, denn sie zeigt dir, was du ändern musst.

Was du nicht tun solltest

Verantwortungsvoll scrapen

Nächste Schritte