Meteen naar de inhoud

429-statuscode: wat het betekent en hoe u dit kunt voorkomen bij webscrapen

  • by
  • Blog
  • 10 min gelezen

Als je ooit webscraping hebt geprobeerd, ben je waarschijnlijk ooit de gevreesde 429-statuscode tegengekomen. Deze vervelende reactie kan uw crawlers tegenhouden en uw inspanningen voor gegevensextractie laten ontsporen. Maar wat betekent een 429-statuscode precies, en hoe kunt u voorkomen dat deze fout optreedt tijdens het scrapen van websites? In deze uitgebreide gids duiken we in de details van de 429-statuscode en delen we beproefde strategieën om te voorkomen dat deze uw webscraping-projecten hindert.

De 429-statuscode begrijpen

Een 429-statuscode, ook wel bekend als "Too Many Requests", is een HTTP-reactiestatuscode die een server verzendt wanneer een gebruiker in korte tijd een buitensporig aantal verzoeken heeft gedaan. Het maakt deel uit van de klasse 4xx van statuscodes, die fouten aan de clientzijde aangeven.

Wanneer een server een 429-statuscode retourneert, vertelt deze in wezen de client (in dit geval uw webschraper) dat deze de snelheidslimiet of het quotum voor het verzenden van verzoeken heeft overschreden. Snelheidsbeperking is een techniek die door veel websites wordt gebruikt om te voorkomen dat hun servers worden overweldigd door te veel verzoeken en om misbruik van hun bronnen te voorkomen.

Het ontvangen van een 429-fout tijdens het scrapen kan frustrerend zijn, omdat het uw toegang tot de doelwebsite tijdelijk blokkeert. Als u verzoeken blijft verzenden nadat u een 429 heeft ontvangen, kan de server strengere tarieflimieten opleggen of zelfs uw IP-adres helemaal verbieden. Daarom is het van cruciaal belang om te begrijpen waardoor 429-fouten worden veroorzaakt en hoe u deze kunt vermijden bij uw webscraping-inspanningen.

Waarom implementeren websites snelheidsbeperkingen?

Websites implementeren snelheidsbeperkingen om verschillende redenen:

  1. Server Protection: Overmatige verzoeken kunnen de servers van een website overbelasten en mogelijk vertragingen, crashes of downtime veroorzaken. Door het aantal verzoeken dat een klant binnen een bepaald tijdsbestek kan doen te beperken, kunnen websites hun servers beschermen tegen overbelasting en een soepele gebruikerservaring voor legitieme bezoekers garanderen.

  2. Eerlijkheid en toewijzing van middelen: Snelheidsbeperking zorgt ervoor dat de bronnen van een website eerlijk worden verdeeld onder de gebruikers. Het voorkomt dat een enkele client of een kleine groep gebruikers de bronnen van de server monopoliseert, waardoor iedereen gelijke toegang krijgt.

  3. Preventie van misbruik: snelheidsbeperking helpt bij het bestrijden van misbruik, zoals spammen, brute-force-aanvallen of automatisch schrapen dat in strijd is met de servicevoorwaarden van de website. Door het aantal verzoeken te beperken kunnen websites kwaadwillende actoren afschrikken en de integriteit van hun platform behouden.

  4. Naleving van API-gebruiksvoorwaarden: veel websites bieden API's waarmee ontwikkelaars toegang krijgen tot hun gegevens. Deze API's worden vaak geleverd met specifieke gebruiksvoorwaarden en tarieflimieten om misbruik te voorkomen en eerlijk gebruik te garanderen. Het overschrijden van de opgegeven snelheidslimieten kan resulteren in 429-fouten.

Veelvoorkomende oorzaken van 429-fouten bij webscraping

Verschillende factoren kunnen een 429-statuscode activeren tijdens het scrapen van websites:

  1. Te veel verzoeken verzenden: Als uw scraper in korte tijd een groot aantal verzoeken naar een website verzendt, kan deze de door de server ingestelde snelheidslimiet overschrijden, wat resulteert in een 429-fout.

  2. Te snel schrapen: Het snel achter elkaar verzenden van verzoeken zonder enige vertraging ertussen kan ook een snelheidsbeperking veroorzaken. Websites kunnen dit gedrag als beledigend of botachtig interpreteren en reageren met een 429-statuscode.

  3. Robots.txt negeren: Websites gebruiken het robots.txt-bestand om regels voor webcrawlers op te geven. Als uw scraper deze regels negeert en probeert toegang te krijgen tot beperkte pagina's of te vaak verzoeken verzendt, kan deze 429-fouten tegenkomen.

  4. Eén enkel IP-adres gebruiken: Als al uw verzoeken afkomstig zijn van één enkel IP-adres, kan de website dit als verdacht gedrag beschouwen en tarieflimieten opleggen. Door uw verzoeken over meerdere IP-adressen te verdelen, kunt u dit probleem verhelpen.

  5. Er wordt niet op de juiste manier omgegaan met sessies of cookies: sommige websites maken gebruik van sessiegebaseerde snelheidslimieten, waarbij limieten per gebruikerssessie worden afgedwongen. Als uw schraper sessies of cookies niet correct verwerkt, kan deze voor elk verzoek als een nieuwe gebruiker worden behandeld, waardoor de snelheidslimiet snel wordt overschreden.

Best practices om 429-fouten bij webscrapen te voorkomen

Nu we de oorzaken van 429-fouten begrijpen, gaan we een aantal best practices bekijken om deze te voorkomen:

  1. Beperk uw verzoeken: Implementeer throttling-mechanismen in uw scraper om het aantal verzonden verzoeken binnen een specifiek tijdsbestek te beperken. Voeg vertragingen toe tussen verzoeken om menselijk gedrag te simuleren en te voorkomen dat de server wordt overweldigd. Je kunt bibliotheken zoals time.sleep() in Python gebruiken om pauzes tussen verzoeken in te voeren.

  2. Verdeel verzoeken over meerdere IP-adressen: Gebruik een groep proxy's of roteer uw IP-adressen om uw verzoeken te distribueren. Door verzoeken vanaf verschillende IP-adressen te verzenden, kunt u voorkomen dat er snelheidslimieten worden geactiveerd die aan één enkel IP-adres zijn gekoppeld. Overweeg het gebruik van betrouwbare proxydiensten of het opzetten van uw eigen proxy-infrastructuur.

  3. Respecteer Robots.txt: Controleer altijd het robots.txt-bestand van de website die u aan het scrapen bent en houd u aan de regels ervan. Vermijd het schrapen van pagina's die niet zijn toegestaan ​​of beperkt door het robots.txt-bestand. Het respecteren van de crawlrichtlijnen van de website kan 429-fouten helpen voorkomen en een goede scrapetiquette handhaven.

  4. Simuleer menselijke surfpatronen: laat uw schraper het menselijke surfgedrag nabootsen om detectie te voorkomen. Introduceer willekeurige vertragingen tussen verzoeken, varieer de string van de user-agent en communiceer met de elementen van de website (bijvoorbeeld klikken op knoppen, formulieren invullen) om uw scraper er menselijker uit te laten zien.

  5. Gebruik sessies en ga om met cookies: Onderhoud sessies en ga op de juiste manier om met cookies in uw schraper. Sommige websites gebruiken op sessies gebaseerde tarieflimieten, dus als u de sessie bij verschillende verzoeken behoudt, kunt u binnen de tarieflimieten blijven. Gebruik bibliotheken zoals request.Session() in Python om sessies effectief te beheren.

  6. Exponentiële uitstel implementeren: Als u een 429-fout tegenkomt, implementeer dan een exponentiële uitstelstrategie. In plaats van het verzoek onmiddellijk opnieuw te proberen, kunt u beter een geleidelijk langere tijd wachten voordat u het volgende verzoek verzendt. Dit geeft de server de tijd om te herstellen en verkleint de kans dat de snelheidslimiet opnieuw wordt bereikt.

  7. Monitoren en aanpassen: Houd de prestaties van uw schraper en de reacties die deze ontvangt in de gaten. Controleer op 429-fouten en pas uw scraping-aanpak dienovereenkomstig aan. Als u consequent snelheidsbeperkingen tegenkomt, overweeg dan om uw scrapingsnelheid aan te passen, verschillende proxypools te gebruiken of alternatieve gegevensbronnen te verkennen.

  8. Neem contact op met website-eigenaren: Als u een legitieme reden heeft om een ​​website te schrappen en de tarieflimieten moet overschrijden, kunt u overwegen contact op te nemen met de website-eigenaren. Leg uw gebruiksscenario uit, toon uw toewijding aan respectvolle scraping-praktijken en vraag toestemming om tegen een hoger tarief te scrapen. Sommige websites bieden mogelijk API-toegang of bieden scrapingvriendelijke opties voor specifieke gebruiksscenario's.

Omgaan met 429-fouten in uw scrapingcode

Ondanks uw inspanningen om 429-fouten te voorkomen, kunt u deze nog steeds af en toe tegenkomen. Het is essentieel om deze fouten op een correcte manier in uw scrapingcode af te handelen om een ​​soepel scrapingproces te garanderen. Hier is een voorbeeld van hoe u 429-fouten kunt afhandelen met Python en de verzoekenbibliotheek:

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 dit voorbeeld definiëren we een strategie voor opnieuw proberen met behulp van de Retry klas van de requests bibliotheek. We specificeren het totale aantal nieuwe pogingen, de statuscode voor nieuwe pogingen (429) en de uitstelfactor voor exponentiële vertraging tussen nieuwe pogingen. Wij maken dan een HTTPAdapter met de strategie voor opnieuw proberen en koppel deze aan de sessie voor zowel HTTP- als HTTPS-verzoeken.

Door deze aanpak te gebruiken, zal de scraper, als er een 429-fout wordt aangetroffen, het verzoek automatisch tot drie keer opnieuw proberen, met exponentiële vertragingen tussen de pogingen. Dit helpt bij het omgaan met tijdelijke snelheidsbeperkingsproblemen en verbetert de veerkracht van uw schraper.

Webscraping uitbesteden om 429-fouten te voorkomen

Als u voortdurend met 429-fouten wordt geconfronteerd of als uw scrapingbehoeften complex zijn, kunt u overwegen uw webscraping-taken uit te besteden aan professionele services of API's. Deze services beschikken vaak over uitgebreide proxynetwerken, een robuuste infrastructuur en expertise in het omgaan met snelheidsbeperkingen en andere scraping-uitdagingen.

Enkele populaire webschrapingservices en API's zijn onder meer:

  • Scrapy Cloud: een cloudgebaseerd webscrapingplatform dat de infrastructuur afhandelt en het scrapingproces voor u beheert.
  • ScrapingBee: een API die de complexiteit van webscraping afhandelt, inclusief proxyrotatie, JavaScript-weergave en CAPTCHA's.
  • ParseHub: een visuele webscraping-tool waarmee u gegevens kunt extraheren zonder codering, snelheidsbeperkingen en andere uitdagingen achter de schermen.

Het uitbesteden van uw webscraping kan u tijd en moeite besparen bij het omgaan met 429-fouten en andere scraping-obstakels. Het is echter belangrijk om de dienstverlener, hun prijzen en hun naleving van wettelijke en ethische schrappingspraktijken zorgvuldig te evalueren voordat u hun diensten inschakelt.

Voorbeelden van scrapen zonder 429-fouten te veroorzaken

Laten we, om de effectiviteit van de hierboven genoemde best practices te illustreren, eens kijken naar een paar voorbeelden van het schrapen van websites zonder 429-fouten te veroorzaken.

Voorbeeld 1: Een nieuwswebsite schrapen met beperking en proxy's

Stel dat u artikelen van een populaire nieuwswebsite wilt schrappen. Om te voorkomen dat u de snelheidslimieten bereikt, implementeert u beperking en distribueert u uw verzoeken over meerdere IP-adressen met behulp van proxy's. Hier is een vereenvoudigd voorbeeld met behulp van Python en de verzoekenbibliotheek:

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 dit voorbeeld definiëren we een lijst met proxy's en selecteren we willekeurig een proxy voor elk verzoek. We doorlopen de artikelpagina's en doen een verzoek aan elke pagina met behulp van een andere proxy. We voegen een willekeurige vertraging toe tussen verzoeken om menselijk gedrag te simuleren en te voorkomen dat verzoeken te snel worden verzonden. Door de verzoeken over meerdere IP-adressen te verdelen en de verzoeken te beperken, verkleinen we de kans op het activeren van snelheidslimieten en het tegenkomen van 429-fouten.

Voorbeeld 2: Een e-commercewebsite scrapen met sessies en cookies

Stel dat u productinformatie wilt verzamelen van een e-commercewebsite die gebruikmaakt van op sessies gebaseerde tariefbeperkingen. Om sessies en cookies goed af te handelen, kun je de request.Session() in Python gebruiken. Hier is een voorbeeld:

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 dit voorbeeld maken we een requests.Session() om de sessie tijdens het hele schraapproces te behouden. We doorlopen de productpagina's en doen verzoeken via de sessie. Door gebruik te maken van een sessie kunnen we cookies en andere sessiegerelateerde informatie bewaren, zodat de website onze verzoeken behandelt als onderdeel van dezelfde gebruikerssessie. Dit helpt voorkomen dat op sessies gebaseerde snelheidslimieten worden geactiveerd en verkleint de kans op 429-fouten.

Conclusie

Omgaan met 429-statuscodes is een onvermijdelijk onderdeel van webscrapen, maar door de oorzaken te begrijpen en best practices te implementeren, kunt u de kans dat u deze fouten tegenkomt aanzienlijk verkleinen. Het beperken van uw verzoeken, het verspreiden ervan over meerdere IP-adressen, het respecteren van robots.txt, het simuleren van menselijk gedrag en het correct afhandelen van sessies en cookies zijn allemaal effectieve strategieën om te voorkomen dat er snelheidslimieten worden geactiveerd.

Vergeet niet dat webscrapen altijd op een verantwoorde en ethisch verantwoorde manier moet gebeuren. Respecteer de servicevoorwaarden van de website, houd u aan wettelijke richtlijnen en houd rekening met de impact die uw scraping-activiteiten kunnen hebben op de bronnen van de website. Als u ondanks het volgen van de best practices aanhoudende 429-fouten tegenkomt, kunt u overwegen contact op te nemen met de website-eigenaren of alternatieve gegevensbronnen te verkennen.

Door de technieken en best practices uit deze handleiding toe te passen, bent u goed toegerust om 429-statuscodes aan te pakken en websites succesvol te schrapen zonder hun services te onderbreken of hun gebruiksbeleid te schenden. Veel plezier met schrapen!

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *