Prijsmonitoring met webscraping: een praktische gids
Prijsmonitoring betekent de prijs van een product op een reeks sites controleren, volgens een schema, en wat je ziet vastleggen zodat je het in de tijd kunt vergelijken. Retailers, marktplaatsen en analisten gebruiken het allemaal. Prijsscraping is ook een van de meest voorkomende manieren waarop een scraper een captcha tegenkomt, dus het loont om het ontwerp goed te doen. Deze gids behandelt wat je moet monitoren, hoe je getallen haalt uit pagina's die nooit bedoeld waren om te worden uitgelezen, hoe je wijzigingen opslaat en er meldingen over krijgt, en hoe je binnen de regels van een site blijft terwijl je dat doet.
Begin met een bron die je mag gebruiken
Schrijf voordat je code maakt eerst na of de site een officiële manier biedt om de data te krijgen: een productfeed, een API of een partnerprogramma. Die zijn betrouwbaarder dan scraping, en ze halen het grootste deel van het juridische en technische risico weg. Scraping is de terugvaloptie voor openbare pagina's waarvoor geen officiële route bestaat, en de voorwaarden en robots.txt blijven van toepassing. De juridische samenvatting behandelt de algemene vragen.
Architectuur in vijf onderdelen
Een betrouwbare monitor heeft vijf onderdelen, en als je ze gescheiden houdt, is hij makkelijker te debuggen:
- Planner. Beslist welke productpagina's wanneer worden bezocht. Verspreid de bezoeken over de dag in plaats van alles op dezelfde minuut te controleren.
- Ophaler. Downloadt de pagina, met rustig tempo, retries en een cache.
- Parser. Haalt de prijs, de valutacontext en de voorraadstatus eruit.
- Opslag. Bewaart elke waarneming met een tijdstempel, zodat je een geschiedenis hebt.
- Waarschuwer. Vergelijkt de nieuwe waarde met de vorige en meldt je wanneer die een drempel overschrijdt die je hebt ingesteld.
Prijzen parsen uit rommelige pagina's
Prijzen verschijnen in veel vormen: met duizendtalscheidingstekens, met decimale komma's, met een label voor het getal, of verdeeld over meerdere elementen. Houd de parser klein en test hem op echte voorbeelden. Hier is een versie die uitgaat van het gebruikelijke formaat, met komma's voor duizendtallen en een punt voor decimalen. Normaliseer andere formaten voordat je hem aanroept.
import re
from decimal import Decimal, InvalidOperation
PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")
def parse_price(text: str) -> Decimal | None:
"""Geef het eerste getal in de tekst terug als Decimal, of None."""
match = PRICE_PATTERN.search(text.replace(" ", " "))
if not match:
return None
try:
return Decimal(match.group(0).replace(",", ""))
except InvalidOperation:
return None
print(parse_price("Now 1,249.50 in stock")) # Decimal('1249.50')
print(parse_price("Sold out")) # None
Gebruik Decimal, niet float, voor alles wat je vergelijkt of optelt. Afrondingsfouten in kommagetallen kunnen twee gelijke prijzen verschillend laten lijken. Bewaar de ruwe tekst naast de geparste waarde, zodat je later een parserfout kunt oplossen zonder elke pagina opnieuw op te halen.
Historie opslaan en wijzigingen detecteren
Een enkele prijs is een momentopname. De waarde van een monitor zit in de geschiedenis. Sla één rij per waarneming op, met het product-ID, de bron, het tijdstip, de geparste waarde en de ruwe tekst. Dan is waarschuwen een eenvoudige vergelijking met de vorige rij. Waarschuw alleen bij betekenisvolle wijzigingen, zoals een daling boven een ingesteld percentage, of een product dat uitverkocht raakt, zodat je niet overspoeld wordt met ruis.
Varianten en bundels afhandelen
Een productpagina toont vaak meerdere prijzen: één per maat of kleur, een bundelprijs, een ledenprijs, of een prijs die pas verschijnt na een keuze. Beslis vóór je bouwt wat de monitor moet vastleggen. Een gangbare aanpak is de variant-ID naast de prijs op te slaan, zodat een wijziging in één maat niet lijkt op een wijziging in het hele product. Wees voorzichtig met "vanaf"-prijzen en doorgestreepte oorspronkelijke prijzen, want een parser die het verkeerde getal oppikt, geeft valse meldingen. Sla de labeltekst naast elke waarde op, zodat je kunt nagaan wat er is gelezen wanneer een melding verdacht lijkt.
Plan beleefd
Controleer elk product met een interval dat past bij hoe vaak de prijs echt verandert. Een product dat dagelijks verandert, heeft geen controle per uur nodig. Voeg jitter toe aan elk bezoek, begrens het aantal requests per site per uur, en cache resultaten voor het gekozen interval. Met deze gewoonten blijft je belasting laag en je data consistent.
Wanneer de pagina je blokkeert
Prijspagina's zijn een geliefd doelwit voor geautomatiseerde toegang, dus je kunt een blokkade, een snelheidslimiet of een captcha tegenkomen. Trek je terug bij een 429 of 503, en stop met een site te bezoeken die je blijft weigeren. Verschijnt er een captcha op een pagina die je mag automatiseren, dan is het live captchatype bij Scarnox PopularCaptcha. De PopularCaptcha-gids voor Python laat de tokenflow zien. Lees scrapen zonder geblokkeerd te worden voordat je meer techniek toevoegt, want afstemmen op tempo lost meestal meer op dan elk extra hulpmiddel.
Sommige pagina's tonen hun prijzen met JavaScript. Voor die pagina's volg je de aanpak in JavaScript-websites scrapen.
Scrape verantwoord
- Gebruik eerst officiële feeds of API's, en lees de voorwaarden van elke site die je monitort.
- Respecteer
robots.txt, houd de aanvraagfrequentie laag en cache resultaten. - Doe niets wat de dienstverlening van concurrenten verslechtert.
- Beperk de data die je verzamelt tot wat je nodig hebt, en sla geen persoonlijke informatie op die op productpagina's staat.
Volgende stappen
- Zoekresultaten scrapen
- Scrapen zonder geblokkeerd te worden
- Roterende proxies voor scraping
- Is webscraping legaal? Een algemeen overzicht
Start met gratis proefkrediet, zonder creditcard: maak een account aan en probeer de PopularCaptcha-flow op een pagina die je mag automatiseren. Voor de actuele tarieven zie de prijspagina.