Hoe eBay-aanbiedingen en verkochte gegevens te scrapen voor prijsonderzoek

eBay's geschiedenis van verkochte aanbiedingen is het dichtstbijzijnde dat je kunt krijgen bij een gratis marktprijsdatabase — als je de twee URL-parameters kent die het ontgrendelen. Hier is hoe je aanbiedingen, varianten en echte transactieprijzen op schaal kunt scrapen.

eBay is een van de grootste peer-to-peer marktplaatsen op het web, wat het een goudmijn maakt voor prijsonderzoek, concurrentietracking en wederverkoopwaardering. Het heeft een officiële ontwikkelaar SDK, maar de meest bruikbare gegevens — waarvoor items daadwerkelijk zijn verkocht — zijn het gemakkelijkst te verzamelen rechtstreeks vanaf de openbare zoekpagina's. Deze gids laat zien hoe je eBay-aanbiedingen, variantgegevens en echte verkochte prijzen kunt scrapen, plus de proxy-instelling die een scraper in leven houdt na de eerste paar honderd requests.

De zoek-URL is de API

Wanneer je eBay doorzoekt, wordt de query volledig in de URL gecodeerd, en een handvol parameters bepalen precies wat er terugkomt. Beheers deze vijf en je kunt eBay's catalogus programmatisch aansturen zonder een browser aan te raken:

De sorteerparameter _sop verdient een vermelding: de waarden ordenen resultaten op nieuw vermeld, laagste totale prijs inclusief verzending, of eindigend het snelst, wat je in staat stelt gerichte feeds te vormen — nieuwste aanbiedingen voor een wijzigingsmonitor, goedkoopste totaal voor een dealzoeker. Beperken met _sacat vernauwt een breed zoekwoord tot de juiste afdeling, waardoor ruis wordt verwijderd voordat je een enkele rij parseert. Zoekwoord, categorie en sorteren samen laten je de meeste onderzoeksqueries als een enkele URL uitdrukken, wat precies is wat eBay aangenaam maakt om te automatiseren.

import requests
from urllib.parse import urlencode

proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}

def search_url(keyword, page=1, per_page=60, category=0):
    params = {"_nkw": keyword, "_sacat": category,
              "_ipg": per_page, "_pgn": page}
    return "https://www.ebay.com/sch/i.html?" + urlencode(params)

r = requests.get(search_url("vintage seiko watch"),
                 proxies=proxies, timeout=20)
print(r.status_code)  # parse r.text with your HTML library of choice
Diagram van de eBay-scraping-pijplijn: bouw de zoek-URL op basis van parameters, haal op via een residentiële proxy, parseer de aanbieding en sla rijen op
eBay's openbare zoekpagina gedraagt zich als een API — de parameters zijn de query, de markup is de respons.

Verkochte en voltooide aanbiedingen: de echte marktprijs

Dit is het eindpunt dat er toe doet voor prijsbepaling. Actieve aanbiedingen vertellen je alleen wat verkopers hopen te krijgen; veel worden nooit verkocht. eBay toont de daadwerkelijke transactiegeschiedenis op dezelfde zoekpagina via twee extra parameters: LH_Complete=1 toont alle voltooide aanbiedingen, en LH_Sold=1 beperkt tot items die daadwerkelijk zijn verkocht. Bij een verkochte aanbieding is de prijs de uiteindelijke verkoopwaarde, niet een vraagprijs — wat dit de schoonste gratis bron maakt van wat dingen echt waard zijn:

def sold_url(keyword, page=1):
    # append the completed + sold filters to any search
    return ("https://www.ebay.com/sch/i.html?"
            f"_nkw={keyword.replace(' ', '+')}"
            "&LH_Complete=1&LH_Sold=1"
            f"&_ipg=60&_pgn={page}")

# every sold row = a real transaction: use median, not mean,
# to shrug off outliers and shill bids
r = requests.get(sold_url("nike dunk low panda 10"),
                 proxies=proxies, timeout=20)

Omdat de verkochte pagina dezelfde markup gebruikt als een standaardzoekopdracht, verwerkt je lijstparser het onveranderd — je voegt gewoon de twee filters toe. Neem de mediaan van de laatste 30-60 verkochte prijzen in plaats van het gemiddelde, en je krijgt een robuuste marktwaarde die workflows voor wederverkoop en concurrentieprijsmonitoring kunnen vertrouwen.

Een aanbieding parseren: prijs, specificaties en varianten

Een enkel-variant aanbieding is eenvoudig: de prijs staat in het primaire prijselement, de item-specificatietabel (conditie, merk, model, grootte) is een set label/waarde-paren, en de beschrijving bevindt zich in een iframe die je apart kunt ophalen. Let op eBay's regionale prijsconversie — sommige regio's krijgen een geconverteerde prijs naast de originele, dus vang beide op.

Multi-variant producten (een telefoon met model-, opslag- en kleurkeuzes) zijn lastiger omdat de prijzen per optie worden bijgewerkt door JavaScript. Die gegevens staan niet in de zichtbare HTML — het is verborgen webdata, opgeslagen in een JavaScript-variabele genaamd MSKU binnen een <script> tag. Haal die JSON op en je krijgt de prijs en voorraad van elke variant in één keer, zonder de pagina te renderen:

import re, json

def extract_msku(html):
    # the variant matrix lives in a JS object keyed 'MSKU'
    m = re.search(r'"MSKU"\s*:\s*(\{.*?\})\s*[,}]', html, re.S)
    if not m:
        return {}          # single-variant listing, no matrix
    data = json.loads(m.group(1))
    # data now holds per-variant price, currency and stock flags
    return data

variants = extract_msku(r.text)
Vergelijking die actieve eBay-aanbiedingen als vraagprijzen toont versus verkochte aanbiedingen als echte uiteindelijke transactieprijzen
Voor waardebepaling, scrape altijd het verkochte filter: actieve prijzen zijn wensen, verkochte prijzen zijn de markt.

Ongeblokkeerd blijven op schaal

Eén aanbieding is triviaal. Schaal is waar eBay terugduwt — met snelheidsbeperkingen, CAPTCHA-uitdagingen en dynamische inhoud die geautomatiseerde patronen markeert. Datacenter IP's worden snel beperkt op marktplaatsen; de betrouwbare oplossing is residentiële proxies die zich voordoen als gewone shoppers, geroteerd zodat geen enkele IP een duidelijke piek veroorzaakt. Doseer requests, eer elke 429 met backoff, en lokaliseer je exit wanneer je regio-specifieke prijzen nodig hebt, aangezien eBay resultaten en valuta per geografie aanpast.

Wanneer een doelwit zwaarder botbeheer toevoegt of je liever de parsing- en rotatiestack niet zelf onderhoudt, handelt een Scraper API IP-rotatie, JS-rendering en herhalingen af achter één eindpunt en levert schone HTML, JSON of markdown. Voor het bredere marktplaats-handboek behandelt onze gids over marktplaatsautomatisering over Amazon, eBay en Etsy accountveiligheid en geotargeting.

Scrape eBay met schone residentiële proxies

Van scrape naar dataset

Zodra rijen binnenstromen, is de discipline deduplicatie en geschiedenis. Ken elk record een eBay-item-id toe zodat een her-scrape de bestaande rij bijwerkt in plaats van deze te dupliceren, en sla de prijs op met een tijdstempel en de conditie van het item bij elke pull — een verkochte prijs betekent alleen iets naast de datum en of het item nieuw of gebruikt was. Houd een rollend venster van recente verkochte gegevens per product en je hebt een live waardering die zichzelf ververst, wat de basis is van elk wederverkoop-, herprijs- of arbitrage-instrument. Combineer dat met waarschuwingen voor plotselinge prijsbewegingen en de dataset begint het werk voor je te doen.

Is het legaal om eBay te scrapen?

Dit is algemene informatie, geen juridisch advies. Het verzamelen van openbaar beschikbare lijstgegevens — prijzen, condities, verkochte geschiedenis — tegen respectvolle tarieven wordt algemeen als legitiem beschouwd. De lijn om in de gaten te houden is persoonlijke gegevens: verkopernamen, locaties en contactgegevens zijn beschermd onder GDPR in de EU en vergelijkbare wetten elders, dus vermijd het opslaan ervan zonder een wettelijke basis. Scrape het marktsignaal, niet de mensen.

Veelgestelde vragen

Hoe scrape ik eBay verkochte aanbiedingen?

Neem een eBay-zoek-URL en voeg LH_Complete=1&LH_Sold=1 toe. Dat schakelt de resultaten om naar voltooide aanbiedingen die daadwerkelijk zijn verkocht, waarbij de weergegeven prijs de uiteindelijke transactieprijs is. De pagina gebruikt dezelfde markup als een normale zoekopdracht, dus dezelfde parser extraheert titel, prijs en verkoopdatum voor prijsonderzoek.

Kan ik eBay-prijzen scrapen zonder de officiële API?

Ja. De openbare zoek- en lijstpagina's geven alles terug wat een koper ziet, zonder quotum of OAuth. De zoekparameters (_nkw, _sacat, _pgn, _ipg) sturen queries en paginering aan, en productpagina's bevatten prijs, itemspecificaties en variantgegevens. Je hebt roterende residentiële proxies nodig om volume te behouden zonder beperkt te worden door snelheidslimieten.

Hoe krijg ik eBay-variantprijzen?

Multi-optie aanbiedingen slaan hun prijs en voorraad per variant op in een JavaScript-object genaamd MSKU ingebed in een script-tag, niet in de zichtbare HTML. Haal dat JSON-blok op en je krijgt de prijs van elke combinatie zonder de pagina te renderen of elke optie aan te klikken — veel sneller en betrouwbaarder dan een browser aansturen.

Waarom wordt mijn eBay-scraper geblokkeerd?

eBay past snelheidsbeperkingen en CAPTCHA-uitdagingen toe op verkeer dat er geautomatiseerd uitziet, en datacenter IP-reeksen worden snel beperkt. Verspreid requests over roterende residentiële IP's, doseer ze met vertragingen, backoff bij elke 429, en houd headers coherent. Als uitdagingen aanhouden, verwijdert een Scraper API die IP's roteert en JavaScript rendert de onderhoudslast.

Scrape de zoekpagina als een API, ontgrendel verkochte geschiedenis met twee parameters, ontgin variantmatrices uit de ingesloten JSON, en routeer alles via schone residentiële IP's. Doe dat en eBay wordt een live prijzendataset die je beheert.

Haal eBay-gegevens op zonder de stack te beheren