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:
- einem Bereich für Entwickler oder eine API im Footer der Website,
sitemap.xmlfür die Liste der Seiten,- RSS- oder Atom-Links im
<head>der Seite, - einer Seite mit "Daten" oder "Download" für Massenexporte.
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:
- Legen Sie pro Website eine Anfragerate fest und behalten Sie sie bei, anstatt mit voller Geschwindigkeit zu laufen.
- Fügen Sie zufälligen Jitter hinzu, damit der Takt nicht perfekt regelmäßig ist.
- Halten Sie an und warten Sie eine Weile, wenn Sie einen 429er oder eine Captcha-Seite sehen.
- Lassen Sie Jobs außerhalb der Stoßzeiten laufen, wenn die Last der Website ein Thema ist.
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:
- Priorisieren. Entscheiden Sie, welche Seiten sich oft und welche selten ändern. Crawlen Sie die häufig geänderten oft und den Rest selten.
- Die Datumsangaben der Sitemap nutzen. Viele Sitemaps enthalten einen
lastmod-Wert. Überspringen Sie URLs, die sich seit Ihrem letzten Besuch nicht geändert haben. - Inkrementell crawlen. Speichern Sie den letzten erfolgreichen Abruf für jede URL und setzen Sie nach einem Fehler dort fort, statt nach einem Ausfall wieder auf Seite eins zu beginnen.
- Die Last verteilen. Teilen Sie eine große Liste in Batches auf und verteilen Sie sie über den Tag, statt alles auf einmal laufen zu lassen.
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
- Prüfen Sie
robots.txtund die Nutzungsbedingungen, bevor Sie anfangen, und halten Sie sich daran. - Halten Sie die Anfragerate niedrig und hören Sie auf, wenn die Website signalisiert, dass sie überlastet ist.
- Sammeln Sie keine personenbezogenen Daten, die Sie nicht brauchen, und löschen Sie sie, sobald Sie sie nicht mehr benötigen.
- Veröffentlichen Sie urheberrechtlich geschützte Inhalte nicht massenhaft erneut. Nutzen Sie die Daten für Analysen, Vergleiche oder Ihr eigenes Produkt und nennen Sie die Quelle, wo das angebracht ist.
- Wenden Sie sich an den Betreiber, wenn Sie ein größeres Volumen brauchen. Er bietet vielleicht einen Feed an.