Hoe AliExpress-productgegevens te scrapen voor dropshipping-onderzoek

AliExpress verbergt zijn productgegevens in een JavaScript-variabele, niet in de HTML die je ziet. Pak die JSON en je krijgt prijzen, kortingen, verzendlocaties en verkoopcijfers in één verzoek — hier is hoe, met de anti-blokkeer infrastructuur.

AliExpress is de grootste wereldwijde marktplaats en een belangrijke bron voor dropshipping-onderzoek: prijs- en kortingsgeschiedenis, wat daadwerkelijk verkoopt, verzendlocatie, en hoe aanbiedingen per land veranderen. In 2026 leunt het zwaar op JavaScript-rendering en willekeurige klassenamen, wat mensen afschrikt om een volledige browser te gebruiken. Meestal heb je die niet nodig. De productgegevens staan al in de paginabron in een JavaScript-variabele — haal die eruit en je krijgt gestructureerde gegevens in één verzoek. Deze gids toont de verborgen-JSON-methode, de geografische dimensie die AliExpress-gegevens waardevol maakt, en de proxy-infrastructuur die een scraper in leven houdt.

De gegevens staan in window.runParams, niet in de DOM

Open een categorie- of zoekresultatenpagina en bekijk de bron. Alle productvoorbeelden zijn opgeslagen in een JavaScript-variabele genaamd window.runParams, verstopt in een <script>-tag. Dit is een veelvoorkomend modern patroon — de server levert de gegevens als JSON en de front-end rendert deze aan de clientzijde. Voor een scraper is het een cadeau: je slaat de kwetsbare CSS-selectors helemaal over, haalt de script-tag eruit met een regex, en parseert het als een woordenboek. Deze techniek heet verborgen webgegevens scrapen, en het is veel duurzamer dan het najagen van klassenamen die bij elke implementatie veranderen.

import re, json, httpx

HEADERS = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
    "accept-language": "en-US,en;q=0.9",
}

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"

def get_run_params(html: str) -> dict:
    # The product data lives in window.runParams = {...};
    m = re.search(r"window\.runParams\s*=\s*(\{.+?\});", html, re.DOTALL)
    if not m:
        raise ValueError("runParams not found - page may be blocked or changed")
    return json.loads(m.group(1))

url = "https://www.aliexpress.com/category/.../catName.html"
r = httpx.get(url, headers=HEADERS, proxy=PROXY, timeout=30)
data = get_run_params(r.text)

De velden parsen die belangrijk zijn voor onderzoek

De runParams blob is enorm, dus haal alleen de velden op die dropshipping- en prijs-onderzoek daadwerkelijk gebruiken: de lijsttitel, originele vs verkoopprijs, het kortingspercentage, hoeveel er zijn verkocht, en — cruciaal — het verzendland, wat de levertijd en het vertrouwen van de koper beïnvloedt. De nesting ziet er intimiderend uit, maar is stabiel:

def parse_items(data: dict) -> list[dict]:
    items = data.get("mods", {}).get("itemList", {}).get("content", [])
    out = []
    for it in items:
        prices = it.get("prices", {})
        sale = prices.get("salePrice", {})
        orig = prices.get("originalPrice", {})
        out.append({
            "id": it.get("productId"),
            "title": it.get("title", {}).get("displayTitle"),
            "sale_price": sale.get("minPrice"),
            "orig_price": orig.get("minPrice"),
            "discount_pct": sale.get("discount"),
            "currency": sale.get("currencyCode"),
            "sold": it.get("trade", {}).get("tradeDesc"),   # e.g. "1,000+ sold"
            "store_id": it.get("store", {}).get("storeId"),
        })
    return out

for row in parse_items(data)[:5]:
    print(row["title"][:40], row["sale_price"], f"-{row['discount_pct']}%", row["sold"])

Die ene oproep geeft je de economische gegevens van een product: een lijst die een originele prijs van $65.85 toont die daalt naar een verkoopprijs van $23.29 is een korting van 64% — het soort margesignaal dat je vertelt of een item de moeite waard is om te sourcen. Het "verkocht" aantal is je vraag proxy; gecombineerd over een categorie rangschikt het winnaars zonder dat je een beoordelingspagina hoeft aan te raken.

Pijplijndiagram dat een AliExpress-paginaverzoek toont, regex-extractie van window.runParams, en geparseerde productvelden als JSON
De lijstgegevens worden server-side gerenderd in een JavaScript-variabele — geen headless browser nodig om het te lezen.

Zoekpaginering zonder de site te overbelasten

Zoekpagina's gebruiken paginering van bekende lengte, dus de efficiënte uitdrukking is: scrape pagina één, lees het totale aantal pagina's uit de respons, en haal de rest gelijktijdig op onder een limiet. Vuur niet alle pagina's tegelijk af — AliExpress beperkt agressief en zal beginnen met het retourneren van 403's. Houd de gelijktijdigheid bescheiden en roteer het exit-IP bij elk verzoek:

import asyncio, httpx

ROTATING = "http://USER:PASS@rotating.quantumproxies.io:8000"

async def fetch_page(client, query, page):
    url = f"https://www.aliexpress.com/w/wholesale-{query}.html?page={page}"
    for attempt in range(3):
        r = await client.get(url, headers=HEADERS, timeout=30)
        if r.status_code == 200:
            return parse_items(get_run_params(r.text))
        if r.status_code == 403:                 # blocked: back off, rotate exit
            await asyncio.sleep(2 ** attempt)
    return []

async def scrape_search(query, max_pages=5):
    async with httpx.AsyncClient(proxy=ROTATING) as client:
        sem = asyncio.Semaphore(3)               # gentle concurrency
        async def guarded(p):
            async with sem:
                return await fetch_page(client, query, p)
        pages = await asyncio.gather(*[guarded(p) for p in range(1, max_pages + 1)])
        return [row for page in pages for row in page]

results = asyncio.run(scrape_search("wireless earbuds"))
print(len(results), "products")

De roterende gateway is hier belangrijk: één IP dat pagina na pagina ophaalt is de snelste manier om een blokkade te verdienen, terwijl rotatie per verzoek over een residential pool de belasting verspreidt zodat geen enkele exit abnormaal lijkt. Exponentiële backoff op de 403 geeft een verbrand IP de tijd om uit te draaien.

Scrape AliExpress op 90M+ residential IPs

Geo is het hele punt

AliExpress personaliseert prijzen, valuta, promoties en verzendlocatie op basis van de locatie van de bezoeker — hetzelfde product kan een US-lokale kaart tonen met snellere verzending naar een US IP en een andere prijs en oorsprong naar een Europese. Voor dropshipping-onderzoek is die geografische dimensie de gegevens: je wilt weten wat een klant in je doelmarkt daadwerkelijk ziet. Stel dus het exit-land bewust in. Routeer via een IP in elke markt waarin je verkoopt en registreer de verschillen; een product dat goedkoop is en lokaal verzendt in de ene regio maar traag en duur in een andere is een heel andere gok. Onze gids over proxies voor dropshipping-onderzoek gaat dieper in op het omzetten van die matrices in sourcingbeslissingen.

# One product, three markets - compare price and ship-from per geo
MARKETS = {
    "us": "http://USER:PASS-country-us@gate.quantumproxies.io:8000",
    "de": "http://USER:PASS-country-de@gate.quantumproxies.io:8000",
    "br": "http://USER:PASS-country-br@gate.quantumproxies.io:8000",
}
for market, proxy in MARKETS.items():
    r = httpx.get(product_url, headers=HEADERS, proxy=proxy, timeout=30)
    d = get_run_params(r.text)
    # read price + shipFrom from the product detail runParams for this geo
    print(market, "->", extract_price_and_origin(d))

Beoordelingen en voorraad leven in aparte oproepen

Lijsten geven je prijs en vraag, maar twee waardevolle velden zitten achter hun eigen verzoeken. Klantbeoordelingen staan niet in de productpagina's runParams — ze worden geladen van een speciale feedback-endpoint, gepagineerd, dus om beoordelingen en reviewtekst te verzamelen volg je die oproep per product in plaats van de hoofdpagina te parsen. Voorraadsignalen zijn vergelijkbaar: het "verkocht" aantal op een lijst is een cumulatieve vraag proxy, terwijl precieze beschikbaarheid per variant (kleur, maat, verzendlocatie) afkomstig is van de SKU-gegevens in de productdetail-payload. Voor dropshipping-onderzoek is dit belangrijk omdat een product eruit kan zien als een winnaar op prijs en verkoop terwijl een specifieke variant die je wilt verkopen niet op voorraad is in het magazijn dat je markt bedient.

Behandel de twee als een tweede doorgang: scrape eerst lijsten om kandidaten te rangschikken op korting en verkoopaantal, verrijk dan alleen je shortlist met beoordelingspagina's en voorraad per variant. Dat houdt het aantal verzoeken — en je blokkeer risico — in verhouding tot hoe serieus je bent over elk product, in plaats van elke lijst te overbelasten voor gegevens die je niet zult gebruiken.

Wanneer de doe-het-zelf scraper over te slaan

De verborgen-JSON-methode is duurzaam, maar AliExpress verandert wel payload-vormen, plaatst beoordelingen achter een aparte endpoint, en verhoogt blokkades bij volume. Als je liever geen regex en retry-logica onderhoudt, neemt een Scraper API een URL en retourneert geparseerde JSON — het handelt de rendering, rotatie en anti-blokkeerlaag af, en je geo-target met een enkele parameter. Het is de pragmatische keuze zodra je duizenden producten over markten verzamelt op een schema. Voor het algemene patroon van het lezen van gegevens rechtstreeks uit client-side payloads, zie onze opmerking over waarom een scraper een lege pagina retourneert.

Checklist die AliExpress scraping obstakels zoals 403's en geo-prijzen in kaart brengt met oplossingen zoals residentiële rotatie en geo-targeting
Drie obstakels, drie oplossingen — de meeste AliExpress scraper-fouten zijn een IP-kwaliteit of geo-probleem.

Veelgestelde vragen

Kun je AliExpress-productgegevens scrapen?

Ja. Publiek zichtbare lijstgegevens — titels, prijzen, kortingen, verkoopaantallen, afbeeldingen en verzendlocatie — worden geserveerd in de window.runParams JavaScript-variabele op categorie-, zoek- en productpagina's. Je haalt het eruit met een regex en parseert het als JSON, zonder dat je een headless browser nodig hebt voor lijsten. Respecteer de voorwaarden en snelheidslimieten van AliExpress.

Heeft AliExpress een openbare API?

AliExpress biedt affiliate- en open-platform-API's, maar ze vereisen goedkeuring, hebben beperkte dekking en zijn gekoppeld aan een programma. Voor breed onderzoek over categorieën en markten geeft het scrapen van de openbare pagina's je meer velden en volledige geo-controle, wat de reden is waarom de meeste dropshipping-onderzoekers de on-page JSON extraheren.

Waarom krijg ik 403-fouten bij het scrapen van AliExpress?

Een 403 betekent dat AliExpress het verzoek heeft gemarkeerd — meestal te veel hits van één IP, een datacenterbereik, of een dunne header set. Roteer residentiële IP's per verzoek, voeg exponentiële backoff toe op de 403, stuur een realistische User-Agent en accept-language, en houd de gelijktijdigheid laag. Als runParams ontbreekt in de HTML, is dat de blokkade, geen lay-outwijziging.

Hoe krijg ik land-specifieke AliExpress-prijzen?

Routeer het verzoek via een exit-IP in het doelland. AliExpress leest locatie om valuta, prijs, promoties en verzendlocatie in te stellen, dus een US IP en een Duits IP zien verschillende gegevens voor hetzelfde product. Geo-target de proxy per markt en registreer elke versie om een prijs-naar-geo matrix te bouwen.

De winnende aanpak is saai en duurzaam: lees de JSON die de pagina al levert, pagina beleefd, roteer schone residentiële IP's, en geo-target elke markt die je belangrijk vindt. Doe dat en AliExpress wordt een betrouwbare bron van prijzen, vraag signalen en verzend economieën in plaats van een muur van 403's.

Krijg geparseerde AliExpress-gegevens van de Scraper API