Zum Inhalt

429-Statuscode: Was er bedeutet und wie man ihn beim Web Scraping verhindert

  • by
  • Blog
  • 10 min gelesen

Wenn Sie sich jemals am Web Scraping versucht haben, sind Sie wahrscheinlich schon einmal auf den gefürchteten Statuscode 429 gestoßen. Diese lästige Reaktion kann Ihre Crawler zum Stillstand bringen und Ihre Datenextraktionsbemühungen zunichte machen. Aber was genau bedeutet der Statuscode 429 und wie können Sie verhindern, dass dieser Fehler beim Scraping von Websites ausgelöst wird? In diesem umfassenden Leitfaden gehen wir näher auf den Statuscode 429 ein und stellen bewährte Strategien vor, um zu verhindern, dass er Ihre Web-Scraping-Projekte behindert.

Den Statuscode 429 verstehen

Ein 429-Statuscode, auch bekannt als „Too Many Requests“, ist ein HTTP-Antwortstatuscode, den ein Server sendet, wenn ein Benutzer in kurzer Zeit zu viele Anfragen gestellt hat. Es ist Teil der 4xx-Klasse von Statuscodes, die auf clientseitige Fehler hinweisen.

Wenn ein Server den Statuscode 429 zurückgibt, teilt er dem Client (in diesem Fall Ihrem Web Scraper) im Wesentlichen mit, dass er das Ratenlimit oder die Quote für das Senden von Anfragen überschritten hat. Ratenbegrenzung ist eine Technik, die von vielen Websites verwendet wird, um ihre Server vor einer Überlastung durch zu viele Anfragen zu schützen und Missbrauch oder Missbrauch ihrer Ressourcen zu verhindern.

Es kann frustrierend sein, beim Scraping einen 429-Fehler zu erhalten, da dadurch Ihr Zugriff auf die Zielwebsite vorübergehend blockiert wird. Wenn Sie nach Erhalt einer 429 weiterhin Anfragen senden, kann der Server strengere Ratenbeschränkungen festlegen oder Ihre IP-Adresse sogar ganz sperren. Daher ist es wichtig zu verstehen, was 429-Fehler auslöst und wie Sie diese bei Ihren Web-Scraping-Bemühungen vermeiden können.

Warum implementieren Websites eine Ratenbegrenzung?

Websites implementieren Ratenbegrenzungen aus mehreren Gründen:

  1. Server-Schutz: Übermäßige Anfragen können die Server einer Website belasten und möglicherweise zu Verlangsamungen, Abstürzen oder Ausfallzeiten führen. Durch die Begrenzung der Anzahl der Anfragen, die ein Client innerhalb eines bestimmten Zeitraums stellen kann, können Websites ihre Server vor einer Überlastung schützen und legitimen Besuchern ein reibungsloses Benutzererlebnis gewährleisten.

  2. Fairness und Ressourcenallokation: Durch die Ratenbegrenzung wird sichergestellt, dass die Ressourcen einer Website gerecht auf ihre Benutzer verteilt werden. Es verhindert, dass ein einzelner Client oder eine kleine Gruppe von Benutzern die Ressourcen des Servers monopolisiert, und ermöglicht so den gleichen Zugriff für alle.

  3. Missbrauchsprävention: Durch die Ratenbegrenzung können missbräuchliche Verhaltensweisen wie Spam, Brute-Force-Angriffe oder automatisiertes Scraping bekämpft werden, die gegen die Nutzungsbedingungen der Website verstoßen. Durch die Beschränkung der Anzahl der Anfragen können Websites böswillige Akteure abschrecken und die Integrität ihrer Plattform wahren.

  4. Einhaltung der API-Nutzungsbedingungen: Viele Websites bieten APIs für Entwickler an, um auf ihre Daten zuzugreifen. Für diese APIs gelten häufig spezifische Nutzungsbedingungen und Ratenbegrenzungen, um Missbrauch zu verhindern und eine faire Nutzung sicherzustellen. Das Überschreiten der angegebenen Ratengrenzen kann zu 429-Fehlern führen.

Häufige Ursachen für 429-Fehler beim Web Scraping

Mehrere Faktoren können beim Scraping von Websites einen 429-Statuscode auslösen:

  1. Es werden zu viele Anfragen gesendet: Wenn Ihr Scraper in kurzer Zeit eine große Anzahl von Anfragen an eine Website sendet, kann es sein, dass die vom Server festgelegte Geschwindigkeitsbegrenzung überschritten wird, was zu einem 429-Fehler führt.

  2. Zu schnelles Schaben: Das Senden von Anfragen in schneller Folge ohne Verzögerungen zwischen ihnen kann ebenfalls eine Ratenbegrenzung auslösen. Websites interpretieren dieses Verhalten möglicherweise als missbräuchlich oder Bot-ähnlich und antworten mit dem Statuscode 429.

  3. Robots.txt wird ignoriert: Websites verwenden die robots.txt-Datei, um Regeln für Webcrawler festzulegen. Wenn Ihr Scraper diese Regeln ignoriert und versucht, auf eingeschränkte Seiten zuzugreifen oder zu häufig Anfragen sendet, kann es zu 429-Fehlern kommen.

  4. Verwendung einer einzelnen IP-Adresse: Wenn alle Ihre Anfragen von einer einzigen IP-Adresse stammen, könnte die Website dies als verdächtiges Verhalten wahrnehmen und Ratenbeschränkungen festlegen. Durch die Verteilung Ihrer Anfragen auf mehrere IP-Adressen kann dieses Problem gemildert werden.

  5. Sitzungen oder Cookies werden nicht ordnungsgemäß verarbeitet: Einige Websites verwenden eine sitzungsbasierte Ratenbegrenzung, bei der Beschränkungen pro Benutzersitzung durchgesetzt werden. Wenn Ihr Scraper Sitzungen oder Cookies nicht korrekt verarbeitet, wird er möglicherweise bei jeder Anfrage als neuer Benutzer behandelt, wodurch das Ratenlimit schnell ausgeschöpft wird.

Best Practices zur Vermeidung von 429-Fehlern beim Web Scraping

Nachdem wir nun die Ursachen von 429-Fehlern verstanden haben, wollen wir uns einige Best Practices ansehen, um sie zu verhindern:

  1. Drosseln Sie Ihre Anfragen: Implementieren Sie Drosselungsmechanismen in Ihrem Scraper, um die Anzahl der innerhalb eines bestimmten Zeitraums gesendeten Anfragen zu begrenzen. Fügen Sie Verzögerungen zwischen Anfragen hinzu, um menschenähnliches Verhalten zu simulieren und eine Überlastung des Servers zu vermeiden. Sie können Bibliotheken wie time.sleep() in Python verwenden, um Pausen zwischen Anfragen einzuführen.

  2. Verteilen Sie Anfragen auf mehrere IP-Adressen: Verwenden Sie einen Pool von Proxys oder rotieren Sie Ihre IP-Adressen, um Ihre Anfragen zu verteilen. Durch das Senden von Anfragen von verschiedenen IP-Adressen können Sie vermeiden, dass Ratenbeschränkungen für eine einzelne IP ausgelöst werden. Erwägen Sie die Nutzung zuverlässiger Proxy-Dienste oder die Einrichtung einer eigenen Proxy-Infrastruktur.

  3. Respektieren Sie Robots.txt: Überprüfen Sie immer die robots.txt-Datei der Website, die Sie scrapen, und halten Sie sich an deren Regeln. Vermeiden Sie das Scrapen von Seiten, die durch die robots.txt-Datei nicht zugelassen oder eingeschränkt sind. Die Einhaltung der Crawling-Richtlinien der Website kann dazu beitragen, 429-Fehler zu vermeiden und eine gute Scraping-Etikette aufrechtzuerhalten.

  4. Simulieren Sie menschliche Surfmuster: Lassen Sie Ihren Scraper das Surfverhalten eines Menschen nachahmen, um eine Erkennung zu vermeiden. Fügen Sie zufällige Verzögerungen zwischen Anfragen ein, variieren Sie die Zeichenfolge des Benutzeragenten und interagieren Sie mit den Elementen der Website (z. B. Klicken auf Schaltflächen, Ausfüllen von Formularen), um Ihrem Scraper ein menschlicheres Aussehen zu verleihen.

  5. Verwenden Sie Sitzungen und verarbeiten Sie Cookies: Behalten Sie Sitzungen bei und behandeln Sie Cookies in Ihrem Scraper ordnungsgemäß. Einige Websites verwenden eine sitzungsbasierte Ratenbegrenzung. Daher kann die Beibehaltung der Sitzung über mehrere Anfragen hinweg dabei helfen, die Ratenlimits einzuhalten. Verwenden Sie Bibliotheken wie „requests.Session()“ in Python, um Sitzungen effektiv zu verwalten.

  6. Implementieren Sie einen exponentiellen Backoff: Wenn ein Fehler 429 auftritt, implementieren Sie eine exponentielle Backoff-Strategie. Anstatt die Anfrage sofort noch einmal zu versuchen, warten Sie eine allmählich zunehmende Zeit, bevor Sie die nächste Anfrage senden. Dies gibt dem Server Zeit, sich zu erholen, und verringert die Wahrscheinlichkeit, dass das Ratenlimit erneut erreicht wird.

  7. Überwachen und anpassen: Behalten Sie die Leistung Ihres Scrapers und die Antworten, die er erhält, im Auge. Achten Sie auf 429-Fehler und passen Sie Ihren Scraping-Ansatz entsprechend an. Wenn Sie ständig auf eine Ratenbegrenzung stoßen, sollten Sie erwägen, Ihre Scraping-Geschwindigkeit anzupassen, verschiedene Proxy-Pools zu verwenden oder alternative Datenquellen zu erkunden.

  8. Kontaktieren Sie Website-Eigentümer: Wenn Sie einen legitimen Grund für das Scraping einer Website haben und die Ratengrenzen überschreiten müssen, sollten Sie sich an die Website-Eigentümer wenden. Erklären Sie Ihren Anwendungsfall, demonstrieren Sie Ihr Engagement für respektvolle Scraping-Praktiken und beantragen Sie die Erlaubnis, mit einer höheren Rate zu scrapen. Einige Websites bieten möglicherweise API-Zugriff oder Scraping-freundliche Optionen für bestimmte Anwendungsfälle.

Behandeln von 429-Fehlern in Ihrem Scraping-Code

Trotz aller Bemühungen, 429-Fehler zu verhindern, kann es dennoch gelegentlich vorkommen, dass diese auftreten. Es ist wichtig, diese Fehler in Ihrem Scraping-Code ordnungsgemäß zu behandeln, um einen reibungslosen Scraping-Prozess zu gewährleisten. Hier ist ein Beispiel dafür, wie Sie 429-Fehler mit Python und der Requests-Bibliothek behandeln können:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

retry_strategy = Retry(
    total=3,  # Total number of retry attempts
    status_forcelist=[429],  # Retry on 429 status code
    backoff_factor=1  # Backoff factor for exponential delay
)

adapter = HTTPAdapter(max_retries=retry_strategy)

with requests.Session() as session:
    session.mount("https://", adapter)
    session.mount("http://", adapter)

    try:
        response = session.get("https://example.com")
        response.raise_for_status()
        # Process the response data
    except requests.exceptions.RequestException as e:
        print("Error occurred:", e)

In diesem Beispiel definieren wir eine Wiederholungsstrategie mithilfe von Retry Klasse aus der requests Bibliothek. Wir geben die Gesamtzahl der Wiederholungsversuche, den Statuscode für die Wiederholung (429) und den Backoff-Faktor für die exponentielle Verzögerung zwischen Wiederholungsversuchen an. Wir erstellen dann eine HTTPAdapter mit der Wiederholungsstrategie und stellen Sie es sowohl für HTTP- als auch für HTTPS-Anfragen in die Sitzung ein.

Wenn bei diesem Ansatz ein 429-Fehler auftritt, wiederholt der Scraper die Anfrage automatisch bis zu dreimal mit exponentiellen Verzögerungen zwischen den Versuchen. Dies hilft bei der Bewältigung vorübergehender Probleme mit der Geschwindigkeitsbegrenzung und verbessert die Widerstandsfähigkeit Ihres Schabers.

Outsourcing von Web Scraping zur Vermeidung von 429-Fehlern

Wenn Sie ständig mit 429-Fehlern konfrontiert werden oder Ihre Scraping-Anforderungen komplex sind, können Sie erwägen, Ihre Web-Scraping-Aufgaben an professionelle Dienste oder APIs auszulagern. Diese Dienste verfügen oft über umfangreiche Proxy-Netzwerke, eine robuste Infrastruktur und Fachwissen im Umgang mit Ratenbegrenzung und anderen Scraping-Herausforderungen.

Zu den beliebten Web-Scraping-Diensten und APIs gehören:

  • Scrapy Cloud: Eine cloudbasierte Web-Scraping-Plattform, die die Infrastruktur verwaltet und den Scraping-Prozess für Sie verwaltet.
  • ScrapingBee: Eine API, die die Komplexität des Web-Scrapings bewältigt, einschließlich Proxy-Rotation, JavaScript-Rendering und CAPTCHAs.
  • ParseHub: Ein visuelles Web-Scraping-Tool, mit dem Sie Daten ohne Codierung, Ratenbegrenzung und andere Herausforderungen im Hintergrund extrahieren können.

Durch die Auslagerung Ihres Web-Scrapings können Sie Zeit und Aufwand bei der Behebung von 429-Fehlern und anderen Scraping-Hürden sparen. Es ist jedoch wichtig, den Dienstleister, seine Preise und die Einhaltung rechtlicher und ethischer Scraping-Praktiken sorgfältig zu prüfen, bevor Sie seine Dienste in Anspruch nehmen.

Beispiele für Scraping, ohne 429-Fehler auszulösen

Um die Wirksamkeit der oben genannten Best Practices zu veranschaulichen, schauen wir uns einige Beispiele für das Scraping von Websites an, ohne dass 429-Fehler ausgelöst werden.

Beispiel 1: Scraping einer Nachrichten-Website mit Drosselung und Proxys

Angenommen, Sie möchten Artikel von einer beliebten Nachrichten-Website entfernen. Um Ratenbegrenzungen zu vermeiden, implementieren Sie eine Drosselung und verteilen Ihre Anfragen mithilfe von Proxys auf mehrere IP-Adressen. Hier ist ein vereinfachtes Beispiel mit Python und der Requests-Bibliothek:

import requests
from time import sleep
from random import randint

proxies = [
    {"http": "http://proxy1.example.com"},
    {"http": "http://proxy2.example.com"},
    {"http": "http://proxy3.example.com"}
]

def scrape_articles():
    base_url = "https://example.com/articles?page="
    num_pages = 10

    for page in range(1, num_pages + 1):
        proxy = proxies[randint(0, len(proxies) - 1)]
        url = base_url + str(page)

        try:
            response = requests.get(url, proxies=proxy)
            response.raise_for_status()
            # Process the article data
            sleep(randint(1, 3))  # Add random delay between requests
        except requests.exceptions.RequestException as e:
            print("Error occurred:", e)

scrape_articles()

In diesem Beispiel definieren wir eine Liste von Proxys und wählen für jede Anfrage zufällig einen Proxy aus. Wir durchlaufen die Artikelseiten und stellen über einen anderen Proxy eine Anfrage an jede Seite. Wir fügen eine zufällige Verzögerung zwischen den Anfragen hinzu, um menschenähnliches Verhalten zu simulieren und zu vermeiden, dass Anfragen zu schnell gesendet werden. Indem wir die Anfragen auf mehrere IP-Adressen verteilen und die Anfragen drosseln, verringern wir die Wahrscheinlichkeit, dass Ratenbegrenzungen ausgelöst werden und 429-Fehler auftreten.

Beispiel 2: Scraping einer E-Commerce-Website mit Sitzungen und Cookies

Angenommen, Sie möchten Produktinformationen von einer E-Commerce-Website extrahieren, die eine sitzungsbasierte Ratenbegrenzung verwendet. Um Sitzungen und Cookies ordnungsgemäß zu verarbeiten, können Sie „requests.Session()“ in Python verwenden. Hier ist ein Beispiel:

import requests

def scrape_products():
    base_url = "https://example.com/products?page="
    num_pages = 5

    with requests.Session() as session:
        for page in range(1, num_pages + 1):
            url = base_url + str(page)

            try:
                response = session.get(url)
                response.raise_for_status()
                # Process the product data
            except requests.exceptions.RequestException as e:
                print("Error occurred:", e)

scrape_products()

In diesem Beispiel erstellen wir eine requests.Session() um die Sitzung während des gesamten Scraping-Vorgangs aufrechtzuerhalten. Wir durchlaufen die Produktseiten und stellen mithilfe der Sitzung Anfragen. Durch die Verwendung einer Sitzung können wir Cookies und andere sitzungsbezogene Informationen speichern und so sicherstellen, dass die Website unsere Anfragen als Teil derselben Benutzersitzung behandelt. Dies trägt dazu bei, das Auslösen sitzungsbasierter Ratenbegrenzungen zu verhindern und verringert die Wahrscheinlichkeit, dass 429-Fehler auftreten.

Zusammenfassung

Der Umgang mit 429-Statuscodes ist ein unvermeidlicher Teil des Web-Scrapings. Wenn Sie jedoch die Ursachen verstehen und Best Practices implementieren, können Sie die Wahrscheinlichkeit, auf diese Fehler zu stoßen, erheblich verringern. Die Drosselung Ihrer Anfragen, deren Verteilung auf mehrere IP-Adressen, die Berücksichtigung von robots.txt, die Simulation menschlichen Verhaltens und der ordnungsgemäße Umgang mit Sitzungen und Cookies sind wirksame Strategien, um das Auslösen von Ratenbegrenzungen zu verhindern.

Denken Sie daran, dass Web Scraping immer verantwortungsvoll und ethisch erfolgen sollte. Respektieren Sie die Nutzungsbedingungen der Website, halten Sie sich an die gesetzlichen Richtlinien und denken Sie daran, welche Auswirkungen Ihre Scraping-Aktivitäten auf die Ressourcen der Website haben können. Wenn Sie trotz Befolgung der Best Practices auf anhaltende 429-Fehler stoßen, sollten Sie sich an die Website-Eigentümer wenden oder alternative Datenquellen erkunden.

Durch die Anwendung der in diesem Leitfaden behandelten Techniken und Best Practices sind Sie bestens gerüstet, um 429-Statuscodes zu bekämpfen und Websites erfolgreich zu scannen, ohne deren Dienste zu unterbrechen oder gegen ihre Nutzungsrichtlinien zu verstoßen. Viel Spaß beim Schaben!

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *