Scarnox · Blog

So vermeiden Sie Captchas beim Scraping (ohne die Regeln zu brechen)

Die meisten Captchas beim Scraping sind eine Reaktion auf Traffic, der automatisiert aussieht. Der günstigste Weg, damit umzugehen, ist, sie gar nicht erst auszulösen. Das heißt: zuerst nach einer legitimen Datenquelle suchen, die Regeln der Website prüfen, weniger und langsamere Anfragen senden und dieselbe Seite nicht zweimal abrufen. Ein Captcha zu lösen ist der Notfallweg für die Fälle, die Sie nicht vermeiden können, und nicht der Plan.

Zuerst nach einer offiziellen API oder einem Feed suchen

Viele Websites, die gescrapt werden, bieten bereits einen Weg, dieselben Daten ohne Captcha zu bekommen: eine öffentliche API, einen Datenexport, einen RSS- oder Sitemap-Feed oder ein Partnerprogramm. Eine offizielle Quelle ist zuverlässiger, ändert sich seltener unangekündigt und gibt dem Betreiber ein Mitspracherecht darüber, wie Sie die Daten nutzen. Suchen Sie nach:

Wenn eine dieser Quellen Ihren Bedarf deckt, nutzen Sie sie. Sie vermeiden die meisten Captchas, indem Sie gar kein HTML anfordern.

robots.txt respektieren und die verlangte Rate einhalten

robots.txt sagt Ihnen, welche Pfade automatisierte Clients abrufen dürfen und manchmal auch, wie lange Sie zwischen Anfragen warten sollen. Die Standardbibliothek von Python kann sie für Sie auslesen:

import time
from urllib.robotparser import RobotFileParser
import requests

USER_AGENT = "ExampleBot/1.0 (+https://example.com/bot)"

parser = RobotFileParser()
parser.set_url("https://example.com/robots.txt")
parser.read()

delay = parser.crawl_delay(USER_AGENT) or 5  # konservativ auf 5 Sekunden zurückfallen
urls = [
    "https://example.com/products?page=1",
    "https://example.com/products?page=2",
]

last_request = 0.0
for url in urls:
    if not parser.can_fetch(USER_AGENT, url):
        print("skipped by robots.txt:", url)
        continue
    wait = delay - (time.monotonic() - last_request)
    if wait > 0:
        time.sleep(wait)
    resp = requests.get(url, headers={"User-Agent": USER_AGENT}, timeout=30)
    last_request = time.monotonic()
    print(url, resp.status_code)

Wenn robots.txt einen Pfad untersagt, lautet die ehrliche Antwort, die Finger davon zu lassen oder den Betreiber zu fragen. Die Regel mit einem Browser zu umgehen ändert nichts daran, was die Website verlangt hat.

Langsamer werden und Anfragen verteilen

Ein gleichmäßiges, moderates Tempo löst selten eine Challenge aus, während ein Schwall fast immer eine auslöst. Ein paar Gewohnheiten machen einen großen Unterschied:

Cachen und nicht erneut abrufen

Jede Anfrage, die Sie nicht stellen, ist eine Anfrage, die die Website nicht verarbeiten muss. Speichern Sie die abgerufenen Seiten mit ihrem Datum und einem Hash des Inhalts, und rufen Sie sie nur dann erneut ab, wenn sich der Inhalt wahrscheinlich geändert hat. Bedingte Anfragen mit den Headern If-Modified-Since oder ETag lassen den Server günstig mit "nicht geändert" antworten, sofern er das unterstützt.

Sitzungen wiederverwenden, übliche Header senden

Eine Sitzung, die Cookies zwischen den Anfragen behält, verhält sich eher wie ein Besucher als ein Skript, das jedes Mal neu startet. Verwenden Sie für jede Website requests.Session() und senden Sie einen klaren, ehrlichen User-Agent, der Ihren Bot und einen Kontakt nennt. Geben Sie sich nicht als Browser aus, um eine Regel zu umgehen. Wenn eine Website JavaScript braucht, um ihre Inhalte anzuzeigen, verwenden Sie für diese Seiten ein Browser-Werkzeug und halten Sie dieselben Rate-Limits ein.

Wenn trotzdem ein Captcha erscheint

Manche Websites zeigen ein Captcha, egal wie sorgfältig Sie sich verhalten. Erkennen Sie es im Code und stoppen Sie diesen Job, statt die Seite weiter zu bombardieren. Die Erkennung und die optionale Lösung für PopularCaptcha werden in Web-Scraping-Captchas behandelt.

Den Crawl vor dem Start planen

Ein Crawl, der jeden Tag alles abruft, ist der einfachste Weg, ein Captcha auszulösen. Planen Sie die Arbeit zuerst:

Ein Plan wie dieser senkt die Zahl der Anfragen, und das ist der größte Hebel, den Sie haben.

Schreiben Sie den Plan als kurze Konfigurationsdatei oder Tabelle auf: die Websites, die Bereiche, das Aktualisierungsintervall und das tägliche Anfragebudget für jede. Ist das Budget aufgebraucht, pausiert der Job bis zum nächsten Zeitfenster. Das Budget als harte Grenze statt als Richtwert zu behandeln, verhindert, dass ein Crawler in das Traffic-Muster abdriftet, das überhaupt Captchas auslöst. Überprüfen Sie das Budget alle paar Wochen, denn eine wachsende Website kann auch mehr Traffic haben, und was letztes Quartal höflich war, ist es jetzt vielleicht nicht mehr.

Verantwortungsvoll scrapen

Nächste Schritte