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
- schneller Anfragen sendet, als ein Mensch klicken könnte,
- immer wieder denselben Pfad ohne Pause abläuft,
- von einer Rechenzentrums-Adresse statt aus einem Heimnetz kommt,
- Header sendet, die nicht zu einem gängigen Browser passen, oder
- zwischen den Anfragen keine Cookies oder Sitzungszustände behält.
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:
- 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.
- **Erlaubt
robots.txtden Pfad?** Wenn nicht, überspringe ihn. Löse kein Captcha auf einer Seite, die du in Ruhe lassen solltest. - 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.
- 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.
- 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
- Rotiere nicht durch viele IP-Adressen, um die Grenzen einer Seite zu umgehen. Das ist Umgehung und macht aus einer Bitte, langsamer zu werden, einen Kampf.
- Scrape keine Seiten hinter einem Login mit Zugangsdaten, zu deren Nutzung du nicht berechtigt bist.
- Löse keine Captchas, um Konten anzulegen, Spam zu verbreiten oder begrenzte Artikel zu kaufen.
Verantwortungsvoll scrapen
- Lies die
robots.txtund die Nutzungsbedingungen der Seite, bevor du anfängst. Respektiere die gesperrten Pfade und jede Crawl-Verzögerung. - Identifiziere deinen Bot ehrlich im User-Agent, mit einer Möglichkeit, dich zu kontaktieren.
- Halte die Anfragerate niedrig. Ein Captcha ist oft die Seite, die dich bittet, langsamer zu werden.
- Hör auf, wenn die Seite dich darum bittet, und umgehe keine Blockade, die dir gesagt wurde zu respektieren.
- Behandle personenbezogene Daten nach den Datenschutzregeln, die für dich gelten, und erhebe nur, was du brauchst.