Perché Scrapare AliExpress (e Perché le API Mobile Cambiano Tutto)
Se stai costruendo un tool di AliExpress product research per dropshipper, il primo ostacolo è scegliere la strategia di estrazione. AliExpress offre due superfici molto diverse: le pagine HTML desktop e gli endpoint API mobile che restituiscono JSON molto più ricchi e strutturati.
L'HTML desktop è denso di script inline, classi CSS offuscate e contenuti renderizzati lato client — il che significa che un semplice requests.get() ti restituisce un guscio vuoto. Le API mobile, invece, ti consegnano oggetti JSON con campi pronti all'uso: prezzo, SKU, stock, valutazioni, tempi di spedizione. La scelta pragmatica è chiara: punta sulle API mobile e riserva l'HTML solo per i dati che quegli endpoint non coprono.
Per farlo a scala, però, ti serve un AliExpress proxy residenziale che ruoti gli IP a ogni richiesta — altrimenti l'anti-bot stack di Alibaba ti blocca dopo poche decine di richieste.
Struttura di AliExpress: Le Quattro Superfici da Conoscere
AliExpress organizza i dati su quattro superfici principali, ognuna con URL pattern e struttura interna diversa:
1. Pagine di Ricerca (Search)
L'URL base è https://www.aliexpress.com/wholesale?SearchText=. Ogni SERP contiene fino a 60 prodotti con titolo, prezzo, rating, numero ordini e thumbnail. Il problema: l'HTML è pesantemente hydratato via JavaScript. I selettori utili sono:
- Titolo prodotto:
div._3GR0O h1 aoppure XPath//div[contains(@class,'_3GR0O')]//a - Prezzo:
div.mGXnE span._1N5QI - Numero ordini:
span._2Y0yZ(contiene testo tipo "500+ orders")
La paginazione arriva fino a ~100 pagine per keyword; oltre, AliExpress restituisce risultati duplicati o vuoti.
2. Pagine Prodotto (Detail)
URL: https://www.aliexpress.com/item/. Contiene la descrizione completa, galleria immagini, varianti SKU, tabella spedizione e recensioni. L'HTML è quasi inaccessibile senza un browser headless perché la maggior parte del contenuto è iniettata da script di inizializzazione come window.runParams.
3. Pagine Store
URL: https://www.aliexpress.com/store/. Listano tutti i prodotti di un venditore con filtri per categoria. Utili per monitorare venditori specifici nel tempo.
4. Feed Prodotti Trending (Hot Products)
URL: https://www.aliexpress.com/popular/. Questa è la superficie più interessante per il product research: mostra i prodotti che stanno ricevendo più ordini in una categoria. L'HTML è simile alla SERP ma ordinato per momentum.
Lo Stack Anti-Bot di Alibaba Group
AliExpress condivide infrastruttura anti-bot con il più ampio ecosistema Alibaba. Ecco cosa ti trovi davanti:
- Device fingerprinting: AliExpress raccoglie canvas fingerprint, WebGL renderer, font list, timezone e risoluzione schermo per profilare ogni client. Le richieste API senza questi header vengono rate-limitate più aggressivamente.
- Rate limiting per IP: Soglie approssimative — circa 30-50 richieste/minuto da un singolo IP prima di ricevere HTTP 429 o un redirect a una pagina CAPTCHA. Superati i ~200 request/min, l'IP viene temporaneamente soft-bannato (risposta 403 con challenge JS).
- CAPTCHA sliding e puzzle: Attivate su pattern sospetti (troppi request in poco tempo, user-agent incoerente, IP datacenter noto). Appaiono come popup JavaScript che bloccano ogni ulteriore richiesta.
- UMID (Universal Module ID): Un cookie e header
x-umidche funge da session identifier. Le richieste senza UMID valido vengono scartate o declassate. - Cloudflare e Akamai: Entrambi usati in layer diversi. I WAF rules filtrano user-agent sospetti, header mancanti e pattern di traffico automatizzato.
La conseguenza pratica: se fai scraping da un IP datacenter, hai una finestra molto stretta prima del blocco. I proxy residenziali riducono drasticamente il rischio perché il traffico sembra provenire da utenti domestici legittimi.
Endpoint API Mobile: Il JSON Che Ti Serve Realmente
L'app mobile di AliExpress comunica con un set di endpoint REST che restituiscono JSON pulito. Questi sono il modo più efficiente per scrapare AliExpress a scala. Ecco i più importanti:
Search API
GET https://m.aliexpress.com/api/search/items
?keyword=bluetooth+earbuds
&page=1
&sortType=bestMatch
&x-umidtoken={UMID_TOKEN}
&x-csrf-token={CSRF_TOKEN}
Restituisce un JSON con data.resultList, ogni item contiene itemId, title, price, saleNum (ordini), starRating, imgUrl. Molto più pulito del parsing HTML.
Item Detail API
GET https://m.aliexpress.com/api/item/detail
?itemId=1005006234567890
&x-umidtoken={UMID_TOKEN}
Restituisce un oggetto JSON completo con tutti i campi che ti servono per il product research: varianti SKU con prezzi e stock, opzioni di spedizione per paese, valutazione venditore, numero di recensioni per stella.
Esempio di Risposta (troncato)
{
"data": {
"itemId": 1005006234567890,
"title": "TWS Bluetooth Earbuds Wireless Headphones...",
"price": { "minPrice": 12.99, "maxPrice": 29.99, "currency": "USD" },
"skuList": [
{ "skuId": 120000123, "propPath": "33:193;200000124:200000348", "price": 12.99, "stock": 847 },
{ "skuId": 120000124, "propPath": "33:193;200000124:200000345", "price": 15.99, "stock": 432 }
],
"storeInfo": { "storeId": 912345, "storeName": "TechGadget Store", "positiveFeedback": 97.2 },
"shippingOptions": [
{ "country": "US", "method": "AliExpress Standard Shipping", "fee": 0.00, "estimatedDays": "15-30" }
]
}
}
Nota come propPath codifica le varianti (colore, taglia) tramite ID proprietà. Questi ID corrispondono ai skuAttr nella risposta completa.
Hot Products API
GET https://m.aliexpress.com/api/popular/items
?categoryId=200000124
&page=1
&x-umidtoken={UMID_TOKEN}
Restituisce i prodotti trending per categoria — perfetto per alimentare un feed di product discovery.
Python: Trending Product Discovery con Proxy Residenziali
Questo script dimostra come usare le API mobile con rotazione IP residenziale per scoprire prodotti trending. Usa ProxyHat come gateway proxy HTTP sulla porta 8080:
import requests
import json
import time
import random
PROXY_HOST = "gate.proxyhat.com"
PROXY_PORT = 8080
PROXY_USER = "your-username"
PROXY_PASS = "your-password"
# Rotazione IP per-request: cambia il prefisso nello username
# ProxyHat assegna un IP residenziale diverso per ogni sessione
def get_proxy_url(session_id=None):
"""Costruisci URL proxy con sessione opzionale per IP sticky."""
if session_id:
username = f"{PROXY_USER}-session-{session_id}"
else:
username = PROXY_USER
return f"http://{username}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
def fetch_trending_products(category_id, pages=3):
"""Scrape prodotti trending da AliExpress via API mobile."""
results = []
headers = {
"User-Agent": "AliApp/AE/8.40.0 (iPhone; iOS 17.4; Scale/3.00)",
"Accept": "application/json",
"x-umidtoken": "generated-umid-token-here",
"x-csrf-token": "generated-csrf-token-here",
}
for page in range(1, pages + 1):
proxy = {"http": get_proxy_url(), "https": get_proxy_url()}
url = "https://m.aliexpress.com/api/popular/items"
params = {
"categoryId": category_id,
"page": page,
}
try:
resp = requests.get(url, params=params, headers=headers,
proxies=proxy, timeout=15)
resp.raise_for_status()
data = resp.json()
items = data.get("data", {}).get("resultList", [])
for item in items:
results.append({
"item_id": item.get("itemId"),
"title": item.get("title", ""),
"min_price": item.get("price", {}).get("minPrice"),
"orders": item.get("saleNum", 0),
"rating": item.get("starRating", 0),
"img": item.get("imgUrl", ""),
})
print(f"Pagina {page}: trovati {len(items)} prodotti")
except requests.exceptions.HTTPError as e:
print(f"Errore HTTP pagina {page}: {e.response.status_code}")
if e.response.status_code == 429:
wait = random.uniform(5, 15)
print(f" Rate limited — pausa {wait:.1f}s")
time.sleep(wait)
continue
except Exception as e:
print(f"Errore pagina {page}: {e}")
# Pausa tra richieste per rispettare il rate limit
time.sleep(random.uniform(1.5, 3.5))
return results
def enrich_product_detail(item_id):
"""Arricchisci con dettagli completi: SKU, spedizione, reputazione venditore."""
proxy = {"http": get_proxy_url(), "https": get_proxy_url()}
headers = {
"User-Agent": "AliApp/AE/8.40.0 (iPhone; iOS 17.4; Scale/3.00)",
"Accept": "application/json",
"x-umidtoken": "generated-umid-token-here",
}
url = "https://m.aliexpress.com/api/item/detail"
params = {"itemId": item_id}
resp = requests.get(url, params=params, headers=headers,
proxies=proxy, timeout=15)
return resp.json().get("data", {})
if __name__ == "__main__":
# Categoria: Elettronica (Consumer Electronics)
trending = fetch_trending_products("200000124", pages=3)
print(f"\nTotale prodotti raccolti: {len(trending)}")
# Arricchisci il prodotto più ordinato
if trending:
top = max(trending, key=lambda x: x.get("orders", 0))
detail = enrich_product_detail(top["item_id"])
print(f"\nTop prodotto: {detail.get('title', 'N/A')[:80]}")
print(f" SKU count: {len(detail.get('skuList', []))}")
print(f" Seller feedback: {detail.get('storeInfo', {}).get('positiveFeedback')}%")
Punti chiave del codice:
- User-Agent mobile: Le API mobile validano l'UA; un UA desktop riceve risposte diverse o 403.
- Rotazione IP per-request: Senza il parametro
session-nel username, ProxyHat assegna un IP residenziale nuovo per ogni richiesta. - Backoff su 429: Se il rate limit scatta, aspetta 5-15 secondi prima di riprovare.
- Pausa inter-request: 1.5-3.5 secondi riducono il rischio di triggerare il rate limiter.
Gestire SKU Multipli, Spedizione e Reputazione Venditore
Varianti SKU: Decodificare propPath
Il campo propPath in ogni SKU usa il formato propId:valueId;propId:valueId. Per mapparlo a nomi leggibili, devi usare la sezione skuInfo nella risposta del detail, che contiene la mappatura ID → nome:
# Esempio di mappatura dalla risposta detail
sku_info = detail.get("skuInfo", {})
# sku_info["33"] = {"name": "Color", "values": {"193": "Black", "194": "White"}}
# sku_info["200000124"] = {"name": "Size", "values": {"200000348": "S", "200000345": "M"}}
def decode_prop_path(prop_path, sku_info):
"""Converte '33:193;200000124:200000348' in 'Color=Black; Size=S'."""
parts = prop_path.split(";")
decoded = []
for part in parts:
prop_id, value_id = part.split(":")
prop_name = sku_info.get(prop_id, {}).get("name", prop_id)
value_name = sku_info.get(prop_id, {}).get("values", {}).get(value_id, value_id)
decoded.append(f"{prop_name}={value_name}")
return "; ".join(decoded)
Questo è fondamentale per i tool di dropshipping che devono mostrare all'utente le varianti disponibili con prezzo e stock per ognuna.
Spedizione: Costi Stimati per Destinazione
L'endpoint detail restituisce shippingOptions con campi country, method, fee e estimatedDays. Per un tool di product research, ti serve aggregare queste informazioni per i mercati target del dropshipper:
- US, UK, DE, FR, IT, ES, AU sono i mercati più comuni.
- AliExpress Standard Shipping è spesso gratuito per ordini sopra i $5-10, ma la spedizione express (DHL, FedEx) varia molto per peso e dimensione.
- Il campo
feeè il costo per unità; per ordini multipli, il costo può cambiare — il detail API non lo calcola automaticamente.
Reputazione Venditore
Nel detail JSON, storeInfo.positiveFeedback è la percentuale di feedback positivi (sopra il 95% è considerato affidabile). Altri campi utili:
storeInfo.storeId: per monitorare lo stesso venditore nel tempo.storeInfo.followers: indica la dimensione della base clienti.storeInfo.yearsOpen: venditori con 3+ anni sono più affidabili.
Freschezza dei Dati: Quanto Cambiano Prezzo e Stock?
AliExpress è un marketplace dinamico. Ecco cosa osserviamo nei dati reali:
| Dato | Frequenza di cambio | Impatto per il dropshipping |
|---|---|---|
| Prezzo | Ogni 1-6 ore per prodotti trending; giornaliero per prodotti stabili | Alto — margine può cambiare del 10-30% in un giorno |
| Stock per SKU | Ogni 15-60 minuti per prodotti popolari | Critico — uno SKU esaurito = ordini non evasi |
| Coupon/sconti | Ogni 4-12 ore (flash deal cambiano ogni 8h) | Medio — influisce sul prezzo effettivo |
| Spedizione | Settimanale (tariffe corriere), ma fee cambia con stock | Medio — shipping gratuito può scomparire |
| Recensioni | Continuo, ma aggregato giornaliero | Basso-medio — importante per listing, ma non urgente |
Cadenza di Scraping Raccomandata
- Product research (trending discovery): 1-2 volte al giorno per categoria. I prodotti trending cambiano lentamente.
- Monitoraggio prezzo: Ogni 2-4 ore per i prodotti nel tuo catalogo attivo. Usa sessioni sticky (IP mantenuto per 10-30 minuti) per evitare trigger anti-bot.
- Monitoraggio stock: Ogni 30-60 minuti per prodotti ad alto volume. Questo è il dato che cambia più frequentemente.
- Monitoraggio venditore: Settimanale — la reputazione cambia raramente.
Proxy per AliExpress: Residenziali vs Datacenter vs Mobile
La scelta del tipo di proxy è determinante per il successo dello scraping su AliExpress:
| Tipo Proxy | Vantaggio | h>SvantaggioUse Case Ideale | |
|---|---|---|---|
| Residenziale | IP reali ISP, basso tasso di blocco, geo-targeting preciso | Costo per GB, velocità variabile | Scraping SERP, detail API, monitoraggio prezzo a scala |
| Datacenter | Velocità alta, costo basso | Blocco rapido su AliExpress, rate limit aggressivo | Solo per test occasionali o basso volume |
| Mobile | Tasso di blocco quasi zero, fingerprint mobile coerente | Costo più alto, pool più piccolo | Scraping intensivo di API mobile, monitoraggio stock ad alta frequenza |
Per la maggior parte dei tool di AliExpress product research, i proxy residenziali offrono il miglior rapporto costo/efficacia. I proxy mobile sono ideali se devi fare centinaia di richieste al minuto con tassi di successo >99%.
Con ProxyHat, puoi configurare il geo-targeting per paese e città, essenziale quando i prezzi AliExpress variano per regione:
# Proxy con IP residenziale US per vedere prezzi e spedizione dal mercato americano
proxy_url = "http://user-country-US:pass@gate.proxyhat.com:8080"
# Proxy con IP residenziale DE per mercato tedesco
proxy_url = "http://user-country-DE:pass@gate.proxyhat.com:8080"
# Sessione sticky (stesso IP per 30 min) per monitoraggio continuo
proxy_url = "http://user-country-US-session-monitor42:pass@gate.proxyhat.com:8080"
Strategie Anti-Best-Practice per Evitare Blocchi
- Usa sempre un User-Agent mobile coerente con le API mobile. Cambia UA solo se ricevi 403 sistematici.
- Limita la concorrenza per IP: max 5-10 richieste simultanee per IP residenziale. Distribuisci su più IP per volumi più alti.
- Rispetta il rate limit: mantieni 20-30 RPM per IP. Se hai bisogno di 1000 RPM, usa ~40 IP in rotazione.
- Implementa retry con exponential backoff: al primo 429, aspetta 5s; al secondo, 15s; al terzo, 60s.
- Non hardcodare UMID/CSRF token: generane di nuovi periodicamente. Un token riutilizzato per ore viene invalidato.
- Geo-match: se scrapi prezzi per il mercato US, usa IP US. AliExpress mostra prezzi diversi per regione.
Considerazioni Etiche e Legali
Prima di procedere con lo scraping, tieni presente:
- robots.txt: AliExpress lo usa per comunicare le aree vietate. Rispettalo come linea guida.
- Termini di servizio: Lo scraping può violare i ToS di AliExpress. Valuta il rischio legale per la tua giurisdizione.
- GDPR/CCPA: Se raccogli dati personali (recensioni con nomi utenti), assicurati di essere conforme alla normativa sulla privacy applicabile.
- Rate limiting responsabile: Non sovraccaricare i server di AliExpress. Lo scraping aggressivo danneggia sia te che altri utenti.
Key Takeaways
- Punta sulle API mobile, non sull'HTML desktop — JSON strutturato, meno parsing, meno anti-bot.
- L'anti-bot stack di Alibaba include device fingerprinting, UMID, rate limiting e CAPTCHA sliding — un proxy residenziale o mobile è obbligatorio a scala.
- Decodifica propPath per mappare gli SKU multipli a varianti leggibili (colore, taglia).
- Monitora prezzo ogni 2-4 ore e stock ogni 30-60 minuti per prodotti attivi — i dati cambiano frequentemente.
- Geo-targeta il proxy per vedere prezzi e spedizione corretti per il mercato del dropshipper.
- Mantieni 20-30 RPM per IP con backoff su 429 per evitare ban.
Se stai costruendo un tool di product research o gestendo un'operazione di dropshipping a scala, i proxy residenziali ProxyHat ti danno accesso a IP reali in oltre 190 paesi con rotazione per-request o sessioni sticky. Inizia con un piano adatto al tuo volume e scala man mano che il tuo catalogo cresce.






