Hoe Amazon-productgegevens op grote schaal te scrapen in Python

De drie-regelige BeautifulSoup-tutorial werkt één keer, daarna krijg je een CAPTCHA van Amazon. Hier is wat er daadwerkelijk misgaat op grote schaal — verschuivende prijsselectoren, geografische prijsbepaling, IP-blokkades — en de pijplijn die het overleeft.

Amazon-productgegevens scrapen lijkt triviaal in elke beginnerstutorial: requests, BeautifulSoup, pak de titel en prijs, klaar. Dat werkt precies totdat je het een paar honderd keer uitvoert, op dat moment krijg je een robot-checkpagina van Amazon en geeft je prijsselector None terug. Deze gids gaat over de versie die het echte contact met de site overleeft — een ASIN-eerst pijplijn, de selectoren die daadwerkelijk breken, waarom hetzelfde product een andere prijs toont aan verschillende IP's, en de proxy-instelling die je van de CAPTCHA-muur houdt. Het gaat om openbare productgegevens (titels, prijzen, beoordelingen, beschikbaarheid), niet om iets achter een inlog.

De URL-structuur: ASIN's zijn de sleutel

Elk Amazon-product heeft een ASIN — een identificatie van 10 tekens zoals B08N5WRWNW — en de hele catalogus hangt ervan af. Een productpagina is gewoon https://www.amazon.com/dp/<ASIN>, en dezelfde ASIN wordt over marktplaatsen heen gebruikt (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). Zoek- en categoriepagina's bevinden zich onder /s? met query- en browse-nodeparameters. Dus een schaalbare pijplijn heeft twee fasen: ontdek ASIN's van zoek- of bestsellerpagina's en vul elke ASIN aan vanaf de /dp/ pagina. Eén kanttekening — een "ouder" ASIN (een product met maat- of kleurvarianten) leidt naar een automatisch geselecteerde kindvariant, dus leg de variant ASIN vast waar je daadwerkelijk op bent geland.

import requests
from bs4 import BeautifulSoup

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
           "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
           "Accept-Language": "en-US,en;q=0.9"}

def product(asin, domain="com"):
    url = f"https://www.amazon.{domain}/dp/{asin}"
    r = requests.get(url, headers=HEADERS,
                     proxies={"http": PROXY, "https": PROXY}, timeout=20)
    soup = BeautifulSoup(r.text, "html.parser")
    return parse(soup, asin)

De selector die iedereen kopieert en Amazon heeft verwijderd

Bijna elke oude tutorial leest de prijs van span#priceblock_ourprice. Amazon biedt meerdere prijsblokindelingen en A/B-test ze, dus die enkele ID is vandaag op de meeste pagina's leeg. De duurzame aanpak is om meerdere bekende prijscontainers op volgorde te proberen en de eerste te nemen die overeenkomt — en een ontbrekende prijs te behandelen als een echte staat (meestal niet op voorraad), niet als een crash.

def parse(soup, asin):
    title = soup.select_one("#productTitle")
    price = None
    for sel in ["span.a-price span.a-offscreen",   # current layout
                "#priceblock_ourprice",             # legacy
                "#priceblock_dealprice",            # deal layout
                "#corePrice_feature_div .a-offscreen"]:
        el = soup.select_one(sel)
        if el and el.get_text(strip=True):
            price = el.get_text(strip=True)
            break
    rating = soup.select_one("span.a-icon-alt")
    return {
        "asin": asin,
        "title": title.get_text(strip=True) if title else None,
        "price": price,                 # None -> likely out of stock
        "rating": rating.get_text(strip=True) if rating else None,
    }
Diagram van een ASIN-eerst Amazon scraping pijplijn: zoekpagina's ontdekken ASIN's, residentiële proxy's stellen de leveringsgeo in, productpagina's bieden details, uitvoer naar CSV
Ontdek ASIN's van zoekopdrachten, vul elke ASIN aan vanaf de /dp/ pagina, en koppel het exit-IP aan de markt waarvan je de prijs wilt.

Waarom hetzelfde product twee prijzen toont

Dit is het feit dat stilletjes prijsdatasets ruïneert. Amazon lokaliseert prijs en beschikbaarheid naar de bezorglocatie van de shopper — de "Bezorg aan" instelling — die het grotendeels afleidt van je IP. Scrape amazon.com vanaf een Duits datacenter IP en je kunt europrijzen, andere aanbiedingen of een andere Buy Box winnaar krijgen dan een Amerikaanse shopper ziet. Als je concurrerende prijsgegevens verzamelt, is de exit-IP geografie het experiment: om de prijs vast te leggen die een Amerikaanse koper ziet, routeer je via een Amerikaanse residentiële proxy; voor de Britse markt, een Britse exit. Eén product, veel prijzen, één per markt die je bemonstert.

Krijg geografisch gerichte residentiële proxies

Waarom naïeve scrapers worden geblokkeerd

Amazon beheert geautomatiseerde verzoekbeheersystemen: te snel vanuit één IP en je krijgt een CAPTCHA, een IP-ban of een uitgeklede pagina. Drie dingen houden een scraper in leven op volume. Ten eerste, roteer IP's zodat geen enkel adres de hele lading draagt — een roterende residentiële pool verdeelt verzoeken over veel echte consumenten-IP's. Ten tweede, pace jezelf: willekeurige vertragingen en een gelijktijdigheidslimiet, niet een rechttoe rechtaan lus. Ten derde, stuur coherente headers — een echte browser User-Agent en Accept-Language, niet de standaard Python-string. Wanneer een pagina verdacht kort terugkomt of een robot-check marker bevat, gooi het weg en probeer het opnieuw op een vers IP in plaats van rommel te parseren.

import time, random

def fetch_many(asins, domain="com"):
    rows = []
    for asin in asins:
        for attempt in range(3):
            data = product(asin, domain)
            if data["title"]:            # got a real page
                rows.append(data)
                break
            time.sleep(1.5 + random.random())  # back off, rotate, retry
        time.sleep(random.uniform(1, 3))         # pace between products
    return rows

Zoeken, bestsellers en paginering

Productpagina's zijn het detail; zoek- en bestsellerpagina's zijn hoe je ontdekt wat je moet ophalen. Een zoekwoordzoekopdracht is /s?k=<query>&page=<n>; bestsellers hangen af van categorie-browsenodes. Loop door de pagina's, haal de ASIN's van elke resultaatkaart, en voer ze dan in de productfase hierboven. Houd de twee fasen gescheiden — het stelt je in staat om ASIN's te dedupliceren, een crawl te hervatten en een bekende ASIN-lijst volgens een schema opnieuw te prijzen zonder het elke keer opnieuw te ontdekken. Voor een bredere opbouw, onze gids voor de beste proxies voor webscraping behandelt de poolzijde hiervan.

Voor de uitvoer zelf, houd het rijschema plat en stabiel: een asin, de bron url, title, price, rating, aantal beoordelingen, een image_url en het marktplaats domain waar je vandaan hebt gehaald. Schrijf het domein in elke rij zodat een dataset met gemengde markten nooit een Amerikaanse prijs verwart met een Britse. Leg de ASIN vast, zelfs wanneer de prijs leeg is — een niet-op-voorraad lezing is een datapunten, geen gat, en het volgen van wanneer een product in en uit voorraad raakt is vaak net zo waardevol als de prijs. Een CSV of databasetabel met die kolommen voedt zich soepel in prijsvolging, beschikbaarheidswaarschuwingen of een Buy Box-studie zonder verdere herstructurering.

Checklist die in kaart brengt wat een naïeve Amazon scraper breekt (ontbrekende prijs-ID, CAPTCHA, IP-ban, verkeerde valuta) naar de oplossing voor elk
Bijna elke Amazon scraping mislukking is een van deze vijf — en elk heeft een concrete oplossing.

Proxies versus een scraping API: wanneer te schakelen

Handgemaakte requests plus een goede residentiële pool is de juiste keuze zolang je het volume onder controle hebt en het doelwit meewerkt. Zodra je roterende selectoren, CAPTCHA-afhandeling, geo-pinning en retry-logica onderhoudt voor duizenden ASIN's per dag, wordt dat onderhoud het werk. Een Scraper API stort het in: stuur een Amazon URL, krijg gestructureerde productgegevens terug met rotatie, rendering en geo voor je afgehandeld. De eerlijke regel — doe-het-zelf zolang de wrijving laag is, schakel over wanneer het anti-bot onderhoud meer engineeringtijd kost dan de gegevens waard zijn. Onze build vs buy uiteenzetting zet cijfers op die lijn.

Veelgestelde vragen

Hoe schraap ik Amazon-productgegevens met Python?

Haal de productpagina op /dp/<ASIN> met requests en een echte browser User-Agent, parseer dan titel, prijs, beoordeling en beschikbaarheid met BeautifulSoup. Probeer verschillende prijsselectoren, niet alleen de verwijderde priceblock_ourprice. Routeer via een roterende residentiële proxy zodat bursts geen blokkade veroorzaken, en koppel de exit-geo aan de markt waarvan je de prijs wilt.

Is het legaal om Amazon-productgegevens te scrapen?

Het verzamelen van openbaar zichtbare productgegevens — titels, prijzen, beoordelingen — wordt over het algemeen anders behandeld dan het omzeilen van inloggegevens of het kopiëren van beschermd materiaal, maar de voorwaarden van Amazon beperken geautomatiseerde toegang en het juridische beeld varieert per jurisdictie en gebruik. Dit is algemene informatie, geen juridisch advies: scrape alleen openbare gegevens, respecteer snelheidslimieten, en vraag advies voor iets commercieels of grensgevallen.

Waarom krijgt mijn Amazon scraper een andere prijs dan de website?

Amazon lokaliseert prijzen en beschikbaarheid naar de bezorglocatie die het afleidt van je IP. Als je proxy in een ander land eindigt dan de markt die je bestudeert, zie je de verkeerde valuta en aanbiedingen. Koppel het exit-IP aan de doelmarkt — een Amerikaanse residentiële IP voor Amerikaanse prijzen, een Britse IP voor Britse prijzen — zodat de gegevens overeenkomen met wat een echte shopper daar ziet.

Hoe vermijd ik dat ik geblokkeerd word bij het scrapen van Amazon?

Roteer over veel residentiële IP's zodat geen enkel adres de lading draagt, vertraag met willekeurige vertragingen en een gelijktijdigheidslimiet, en stuur coherente browserheaders. Valideer elke respons — een 200 kan nog steeds een robot-checkpagina zijn — en probeer het opnieuw op een vers IP in plaats van een geblokkeerde te parseren. Op hoog volume, een Scraper API behandelt dat allemaal voor je.

Amazon op schaal is niet moeilijk omdat parseren moeilijk is — het is moeilijk omdat de site terugvecht en de prijs afhangt van waar je staat. Bouw ASIN-eerst, match meerdere prijscontainers, pin je geo, roteer je IP's, en behandel een korte respons als een blokkade, niet als data. Krijg die goed en de beginnerstutorial schaalt eindelijk.

Scrape Amazon met de QuantumProxies Scraper API