Come estrarre dati sui prodotti di AliExpress per la ricerca sul dropshipping

AliExpress nasconde i suoi dati sui prodotti in una variabile JavaScript, non nell'HTML che vedi. Recupera quel JSON e ottieni prezzi, sconti, origine di spedizione e conteggi delle vendite in un'unica richiesta — ecco come, con la gestione anti-blocco.

AliExpress è il più grande mercato globale e una fonte primaria per la ricerca sul dropshipping: cronologia dei prezzi e degli sconti, cosa si vende effettivamente, origine della spedizione e come le offerte cambiano per paese. Nel 2026 si basa fortemente sul rendering JavaScript e nomi di classi randomizzati, il che spaventa le persone inducendole a utilizzare un browser completo. Di solito non ne hai bisogno. I dati sui prodotti sono già presenti nel sorgente della pagina all'interno di una variabile JavaScript — estraila e ottieni dati strutturati puliti in un'unica richiesta. Questa guida mostra il metodo del JSON nascosto, la dimensione geografica che rende i dati di AliExpress preziosi e la gestione dei proxy che mantiene in vita un estrattore.

I dati sono in window.runParams, non nel DOM

Apri una pagina di categoria o risultati di ricerca e visualizza il sorgente. Tutte le anteprime dei prodotti sono memorizzate in una variabile JavaScript chiamata window.runParams, nascosta all'interno di un tag <script>. Questo è un modello moderno comune — il server invia i dati come JSON e il front end li rende lato client. Per un estrattore è un dono: salti completamente i selettori CSS fragili, estrai il tag script con una regex e lo analizzi come un dizionario. Questa tecnica si chiama estrazione di dati web nascosti ed è molto più durevole che inseguire nomi di classi che cambiano ad ogni distribuzione.

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)

Analizzare i campi che contano per la ricerca

Il blob runParams è enorme, quindi estrai solo i campi che la ricerca sul dropshipping e sui prezzi effettivamente utilizza: il titolo dell'inserzione, il prezzo originale vs prezzo di vendita, la percentuale di sconto, quanti ne sono stati venduti e — criticamente — il paese di spedizione, che influenza il tempo di consegna e la fiducia dell'acquirente. L'annidamento sembra intimidatorio ma è stabile:

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"])

Quella singola chiamata ti dà l'economia di un prodotto: un'inserzione che mostra un prezzo originale di $65.85 che scende a un prezzo di vendita di $23.29 è uno sconto del 64% — il tipo di segnale di margine che ti dice se un articolo vale la pena di essere approvvigionato. Il conteggio "venduto" è il tuo proxy di domanda; combinato su una categoria classifica i vincitori senza che tu debba toccare una pagina di recensioni.

Diagramma del flusso che mostra una richiesta di pagina AliExpress, estrazione regex di window.runParams e campi di prodotto analizzati come JSON
I dati dell'inserzione sono resi dal server in una variabile JavaScript — non è necessario un browser senza testa per leggerli.

Paginazione di ricerca senza sovraccaricare il sito

Le pagine di ricerca utilizzano una paginazione di lunghezza nota, quindi l'idioma efficiente è: estrai la prima pagina, leggi il conteggio totale delle pagine dalla risposta, quindi recupera il resto contemporaneamente sotto un limite. Non lanciare tutte le pagine contemporaneamente — AliExpress limita le richieste in modo aggressivo e inizierà a restituire 403. Mantieni la concorrenza modesta e ruota l'IP di uscita ad ogni richiesta:

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")

Qui la rotazione del gateway è importante: un IP che recupera pagina dopo pagina è il modo più veloce per guadagnarsi un blocco, mentre la rotazione per richiesta attraverso un pool residenziale distribuisce il carico in modo che nessuna uscita sembri anomala. Il backoff esponenziale sul 403 dà tempo a un IP bruciato di uscire dal ciclo.

Estrai dati da AliExpress su oltre 90M di IP residenziali

La geografia è il punto centrale

AliExpress personalizza prezzi, valuta, promozioni e magazzino di spedizione in base alla posizione del visitatore — lo stesso prodotto può mostrare una carta locale per gli Stati Uniti con spedizione più veloce a un IP statunitense e un prezzo e origine diversi a uno europeo. Per la ricerca sul dropshipping quella dimensione geografica è il dato: vuoi sapere cosa vede effettivamente un cliente nel tuo mercato di riferimento. Quindi imposta deliberatamente il paese di uscita. Instrada attraverso un IP in ogni mercato in cui vendi e registra le differenze; un prodotto che è economico e spedisce localmente in una regione ma lento e costoso in un'altra è una scommessa molto diversa. La nostra guida su proxy per la ricerca sul dropshipping approfondisce la trasformazione di quelle matrici in decisioni di approvvigionamento.

# 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))

Recensioni e scorte vivono in chiamate separate

Le inserzioni ti danno prezzo e domanda, ma due campi di alto valore sono dietro le loro richieste. Le recensioni dei clienti non sono nel runParams della pagina del prodotto — si caricano da un endpoint di feedback dedicato, paginato, quindi per raccogliere valutazioni e testo delle recensioni segui quella chiamata per prodotto piuttosto che analizzare la pagina principale. I segnali di scorte sono simili: il conteggio "venduto" su un'inserzione è un proxy di domanda cumulativo, mentre la disponibilità precisa per variante (colore, taglia, magazzino di spedizione) proviene dai dati SKU nel payload del dettaglio del prodotto. Per la ricerca sul dropshipping questo è importante perché un prodotto può sembrare un vincitore per prezzo e vendite mentre una specifica variante che vuoi vendere è esaurita nel magazzino che serve il tuo mercato.

Tratta i due come un secondo passaggio: estrai prima le inserzioni per classificare i candidati per sconto e conteggio venduto, poi arricchisci solo la tua shortlist con pagine di recensioni e scorte per variante. Ciò mantiene il volume delle richieste — e il tuo rischio di blocco — proporzionale a quanto sei serio riguardo a ciascun prodotto, invece di sovraccaricare ogni inserzione per dati che non utilizzerai.

Quando saltare l'estrattore fai-da-te

Il metodo del JSON nascosto è durevole, ma AliExpress cambia le forme dei payload, blocca le recensioni dietro un endpoint separato e intensifica i blocchi sotto volume. Se preferisci non mantenere regex e logica di ripetizione, un Scraper API prende un URL e restituisce JSON analizzato — gestisce il rendering, la rotazione e il livello anti-blocco, e puoi geo-mirare con un solo parametro. È la scelta pragmatica una volta che stai raccogliendo migliaia di prodotti attraverso i mercati su un programma. Per il modello generale di lettura dei dati direttamente dai payload lato client, vedi la nostra nota su perché un estrattore restituisce una pagina vuota.

Checklist che mappa gli ostacoli all'estrazione di dati da AliExpress come 403 e prezzi geografici a soluzioni come rotazione residenziale e geo-mirazione
Tre ostacoli, tre soluzioni — la maggior parte dei fallimenti degli estrattori di AliExpress sono un problema di qualità IP o geografico.

Domande frequenti

Puoi estrarre dati sui prodotti di AliExpress?

Sì. I dati delle inserzioni visibili pubblicamente — titoli, prezzi, sconti, conteggi venduti, immagini e origine di spedizione — sono serviti nella variabile JavaScript window.runParams su pagine di categoria, ricerca e prodotto. Li estrai con una regex e li analizzi come JSON, senza bisogno di un browser senza testa per le inserzioni. Rispetta i termini e i limiti di AliExpress.

AliExpress ha un'API pubblica?

AliExpress offre API per affiliati e piattaforme aperte, ma richiedono approvazione, hanno copertura limitata e sono legate a un programma. Per una ricerca ampia attraverso categorie e mercati, l'estrazione delle pagine pubbliche ti dà più campi e pieno controllo geografico, motivo per cui la maggior parte dei ricercatori di dropshipping estrae il JSON sulla pagina.

Perché ricevo errori 403 estraendo dati da AliExpress?

Un 403 significa che AliExpress ha segnalato la richiesta — di solito troppi accessi da un solo IP, un intervallo di datacenter o un set di intestazioni scarno. Ruota gli IP residenziali per richiesta, aggiungi un backoff esponenziale sul 403, invia un User-Agent realistico e accetta-lingua, e mantieni bassa la concorrenza. Se runParams manca dall'HTML, quello è il blocco, non un cambio di layout.

Come ottengo prezzi specifici per paese su AliExpress?

Instrada la richiesta attraverso un IP di uscita nel paese di destinazione. AliExpress legge la posizione per impostare valuta, prezzo, promozioni e magazzino di spedizione, quindi un IP statunitense e uno tedesco vedono dati diversi per lo stesso prodotto. Geo-mira il proxy per mercato e registra ogni versione per costruire una matrice di prezzi per geo.

L'approccio vincente è noioso e durevole: leggi il JSON che la pagina già fornisce, paginazione educata, ruota IP residenziali puliti e geo-mira ogni mercato a cui tieni. Fai questo e AliExpress diventa un flusso affidabile di prezzi, segnali di domanda ed economia di spedizione piuttosto che un muro di 403.

Ottieni dati di AliExpress analizzati dallo Scraper API