Pourquoi scraper AliExpress via l'API mobile plutôt que le HTML desktop
Si vous construisez un outil de product research AliExpress, vous avez deux options : parser le HTML rendu par le navigateur, ou appeler directement les endpoints JSON que l'application mobile utilise en coulisses. La seconde approche est de loin la plus efficace.
Le HTML desktop d'AliExpress est un enchevêtrement de React hydraté, de scripts obfusqués et de classes CSS générées qui changent toutes les deux semaines. En revanche, les endpoints mobiles renvoient du JSON propre, structuré, avec des champs que la version web ne montre même pas — comme les marges internes, les stocks par variante, ou les métadonnées de livraison détaillées.
Le compromis : ces endpoints sont aussi les plus surveillés par l'anti-bot d'Alibaba. Sans un proxy AliExpress résidentiel et des en-têtes bien configurés, vous serez bloqué en quelques centaines de requêtes. C'est exactement ce que nous allons résoudre ici.
Structure d'AliExpress : ce qu'il faut cibler
Pages de recherche
L'URL de recherche desktop suit ce schéma :
https://www.aliexpress.com/w/wholesale-{keyword}.html?SearchText={keyword}&page={n}Chaque page de résultats contient ~60 produits avec titre, prix, nombre de commandes, note moyenne, et lien vers la fiche produit. Le JSON mobile est plus riche — il inclut les badges (Top Brand, Choice), le nombre de vendeurs pour le même produit, et les filtres disponibles.
Fiches produit
La fiche produit est la mine d'or. Sur le web, les données sont éparpillées dans le DOM. L'API mobile retourne un objet JSON complet :
- Variants SKU : toutes les combinaisons couleur/taille avec prix et stock par variante
- Expédition : coûts et délais par destination, par transporteur
- Réputation vendeur : score, nombre d'années, taux de satisfaction, badges
- Ventes : historique des 6 derniers mois par pays
Pages boutique
Chaque vendeur a un store ID (ex: store/910682186). La page boutique liste tous ses produits avec des filtres par catégorie. C'est essentiel pour auditer un fournisseur avant de le référencer.
Feeds produits tendance
AliExpress expose des endpoints de trending products et top-ranked par catégorie. Ce sont les mêmes données que la section « Choice » de l'app. Pour un outil de veille, c'est le point d'entrée idéal : on récupère les produits qui gagnent en traction sans avoir à scroller des milliers de résultats de recherche.
L'anti-bot d'Alibaba Group : ce qui vous bloque
Alibaba n'utilise pas un seul système anti-bot. C'est une stack complète :
| Couche | Mécanisme | Impact |
|---|---|---|
| Fingerprint JS | Canvas, WebGL, font, audio fingerprinting | Identifie les navigateurs headless |
| Risk Control (RC) | Token RC généré côté client, valideur côté serveur | Bloque les requêtes sans token valide |
| Rate limiting IP | Limites par IP : ~200 req/min sur l'API mobile | 429 après quelques minutes sans rotation |
| CAPTCHA | Slide CAPTCHA (AliCAPTCHA) sur les endpoints sensibles | Apparaît après détection de pattern anormal |
| Device ID | Cookie aep_usuc_f + sgcookie | Corrèle les sessions entre rotations d'IP |
Concrètement, si vous envoyez des requêtes depuis un datacenter sans rotation, vous serez bloqué en 2 à 5 minutes. Les CAPTCHAs apparaissent typiquement après 50 à 200 requêtes sur la même session, selon l'endpoint.
Règle empirique : sur l'API mobile, chaque IP résidentielle peut soutenir ~150 requêtes avant de déclencher un challenge. Avec un pool de proxies résidentiels et une rotation par requête, vous pouvez maintenir un débit de 5 à 10 req/s de manière stable.
Les endpoints API mobiles qui changent la donne
L'app AliExpress Android/iOS communique avec gw.aliexpress.com et m.aliexpress.com. Voici les endpoints clés :
Recherche de produits
GET https://m.aliexpress.com/api/search/items?keyword=bluetooth+speaker&page=1&sortType=bestMatch
Host: m.aliexpress.com
X-Platform: android
X-App-Version: 8.51.0
X-Region: FR
X-Language: frRetourne un JSON avec ~50 produits par page, incluant les badges Choice/Top Brand, les prix min/max, et le nombre de commandes récentes.
Détail produit (le plus précieux)
GET https://m.aliexpress.com/api/product/detail?productId=4001234567890
Host: m.aliexpress.com
X-Platform: android
X-App-Version: 8.51.0Ce endpoint retourne un objet JSON massif contenant :
skuInfo: toutes les variantes avec prix, stock et image par SKUshippingInfo: coûts et délais par pays de destinationstoreInfo : score vendeur, années d'activité, taux de satisfactionsalesInfo: ventes sur 30/90/180 jours
Produits tendance par catégorie
GET https://m.aliexpress.com/api/trending/items?categoryId=200000445&page=1
Host: m.aliexpress.com
X-Platform: androidLes catégories sont identifiées par un ID numérique. Vous pouvez les lister via l'endpoint /api/category/tree.
Extrait de réponse (tronqué)
{
"code": 200,
"data": {
"itemId": 4001234567890,
"title": "Portable Bluetooth Speaker TWS Wireless...",
"price": {"min": 12.99, "max": 29.99, "currency": "USD"},
"sales": {"last30Days": 1842, "total": 12840},
"skuInfo": {
"skus": [
{"skuId": "120000316", "price": 12.99, "stock": 847, "attrs": ["Black", "10W"]},
{"skuId": "120000317", "price": 19.99, "stock": 312, "attrs": ["Black", "20W"]}
]
},
"storeInfo": {
"storeName": "TechAudio Official",
"storeRating": 97.3,
"yearsOpen": 6,
"positiveFeedbackRate": 0.978
},
"shippingInfo": {
"toCountry": "FR",
"options": [
{"method": "AliExpress Standard Shipping", "cost": 0, "estimatedDays": "15-25"},
{"method": "Cainiao Expedited", "cost": 3.99, "estimatedDays": "8-15"}
]
}
}
}Python : scraper les produits tendance avec des proxies résidentiels
Voici un script complet pour découvrir les produits en croissance sur AliExpress, en utilisant les proxies résidentiels de ProxyHat pour la rotation d'IP.
import requests
import time
import json
import random
from datetime import datetime, timezone
# --- Configuration ProxyHat ---
PROXY_USER = "votre_user"
PROXY_PASS = "votre_pass"
PROXY_HOST = "gate.proxyhat.com"
PROXY_PORT = 8080
# Rotation par requête = pays aléatoire pour simuler du trafic naturel
COUNTRIES = ["FR", "DE", "ES", "IT", "GB", "US"]
def get_proxy(country=None):
"""Construit l'URL du proxy résidentiel ProxyHat avec géo-ciblage."""
c = country or random.choice(COUNTRIES)
return f"http://{PROXY_USER}-country-{c}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
# --- Headers mobile AliExpress ---
BASE_HEADERS = {
"Host": "m.aliexpress.com",
"User-Agent": "AliApp(AE/8.51.0) Android/13",
"X-Platform": "android",
"X-App-Version": "8.51.0",
"X-Region": "FR",
"X-Language": "fr",
"Accept": "application/json",
}
def fetch_trending(category_id, page=1, country="FR"):
"""Récupère les produits tendance d'une catégorie."""
url = (
f"https://m.aliexpress.com/api/trending/items"
f"?categoryId={category_id}&page={page}"
)
headers = {**BASE_HEADERS, "X-Region": country}
proxy = get_proxy(country)
try:
resp = requests.get(
url,
headers=headers,
proxies={"http": proxy, "https": proxy},
timeout=15,
)
resp.raise_for_status()
return resp.json()
except requests.exceptions.HTTPError as e:
if resp.status_code == 429:
print(f"[429] Rate limit atteint — pause 60s")
time.sleep(60)
return fetch_trending(category_id, page, country)
print(f"[ERREUR] {e}")
return None
def fetch_product_detail(item_id, country="FR"):
"""Récupère le détail complet d'un produit."""
url = f"https://m.aliexpress.com/api/product/detail?productId={item_id}"
headers = {**BASE_HEADERS, "X-Region": country}
proxy = get_proxy(country)
resp = requests.get(
url,
headers=headers,
proxies={"http": proxy, "https": proxy},
timeout=15,
)
resp.raise_for_status()
return resp.json()
def extract_key_metrics(product_data):
"""Extrait les métriques clés pour le product research."""
d = product_data.get("data", {})
sales = d.get("salesInfo", {})
store = d.get("storeInfo", {})
skus = d.get("skuInfo", {}).get("skus", [])
shipping = d.get("shippingInfo", {}).get("options", [])
return {
"item_id": d.get("itemId"),
"title": d.get("title"),
"price_min": d.get("price", {}).get("min"),
"price_max": d.get("price", {}).get("max"),
"sales_30d": sales.get("last30Days"),
"sales_total": sales.get("total"),
"sku_count": len(skus),
"total_stock": sum(s.get("stock", 0) for s in skus),
"store_rating": store.get("storeRating"),
"store_years": store.get("yearsOpen"),
"positive_rate": store.get("positiveFeedbackRate"),
"cheapest_shipping": (
min(shipping, key=lambda x: x.get("cost", float("inf")))
if shipping else None
),
"scraped_at": datetime.now(timezone.utc).isoformat(),
}
# --- Workflow principal ---
if __name__ == "__main__":
# Catégorie Électronique (200000445) — adaptez selon votre niche
CATEGORY_ID = 200000445
results = []
print("Récupération des produits tendance...")
trending = fetch_trending(CATEGORY_ID, page=1)
if trending and trending.get("code") == 200:
items = trending.get("data", {}).get("items", [])
print(f"{len(items)} produits trouvés")
for item in items[:10]: # Limiter à 10 pour la démo
item_id = item.get("itemId")
print(f" → Détail du produit {item_id}...")
detail = fetch_product_detail(item_id)
if detail and detail.get("code") == 200:
metrics = extract_key_metrics(detail)
results.append(metrics)
time.sleep(random.uniform(1.5, 3.5)) # Délai naturel entre requêtes
# Export JSON
with open("aliexpress_trending.json", "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"{len(results)} produits sauvegardés dans aliexpress_trending.json")Gérer les variantes SKU, les frais de port et la réputation vendeur
Variantes SKU
Un produit AliExpress peut avoir des dizaines de SKUs — chaque combinaison de couleur et taille est une ligne distincte avec son propre prix et stock. C'est crucial pour le dropshipping car :
- Les marges varient par variante : la version 20W d'un haut-parleur coûte 19,99 $ mais la 10W seulement 12,99 $. Votre marge n'est pas la même.
- Le stock par SKU détermine la disponibilité réelle. Un produit peut afficher « en stock » mais les variantes populaires être épuisées.
- Les images par variante sont essentielles pour créer vos fiches produits.
Dans la réponse API, chaque SKU a la structure :
{"skuId": "120000316", "price": 12.99, "stock": 847, "attrs": ["Black", "10W"], "image": "https://..."}Construisez une table de correspondance attrs → skuId pour pouvoir commander ou vérifier le stock d'une variante précise.
Frais de port par destination
L'endpoint détail retourne les options de livraison pour le pays spécifié dans X-Region. Pour comparer les coûts vers plusieurs marchés :
DESTINATIONS = ["FR", "DE", "US", "GB", "ES"]
for dest in DESTINATIONS:
detail = fetch_product_detail(item_id, country=dest)
shipping = detail["data"]["shippingInfo"]["options"]
cheapest = min(shipping, key=lambda x: x["cost"])
print(f" {dest}: {cheapest['method']} — {cheapest['cost']}$ — {cheapest['estimatedDays']}")C'est indispensable pour calculer votre prix tout-compris (produit + livraison) sur chaque marché cible et éviter les mauvaises surprises sur les délais.
Réputation vendeur
L'objet storeInfo contient tout ce qu'il faut pour filtrer les mauvais fournisseurs :
- storeRating : score sur 100. Visez ≥ 95.
- positiveFeedbackRate : taux de feedbacks positifs. En dessous de 0,95, fuyez.
- yearsOpen : ancienneté. Un vendeur ouvert depuis moins d'un an est risqué.
- badge Top Brand / Choice : les vendeurs labellisés sont plus fiables en termes de qualité et de délais.
Pour un outil de product research AliExpress, filtrez systématiquement sur storeRating >= 95 et positiveFeedbackRate >= 0.95. Ça élimine ~40 % des vendeurs mais améliore drastiquement la fiabilité.
Fraîcheur des données : à quelle fréquence scraper ?
Les données AliExpress changent à des vitesses différentes selon le type :
| Donnée | Fréquence de changement | Cadence de scraping recommandée |
|---|---|---|
| Prix | Plusieurs fois par jour (flash sales, coupons) | Toutes les 4 à 6 heures |
| Stock par SKU | Quotidien, parfois horaire pour les best-sellers | |
| Toutes les 6 à 12 heures | ||
| Ventes (compteurs) | Quotidien (batch nocturne) | 1 fois par jour |
| Évaluations vendeur | Hebdomadaire | 1 fois par semaine |
| Produits tendance | Quotidien (recalcul nightly) | 1 fois par jour |
Concrètement, pour un outil de veille produit :
- Trending products : scrape quotidien, idéalement entre 2h et 6h UTC (après le recalcul nocturne d'AliExpress).
- Monitoring prix : toutes les 4 heures sur votre catalogue actif. Plus fréquent est inutile et augmente le risque de blocage.
- Stock critique : 2 fois par jour pour les produits que vous vendez activement.
Ne scrapez pas plus fréquemment que nécessaire. Chaque requête supplémentaire augmente votre empreinte et votre coût en proxies. Un bon proxy AliExpress résidentiel avec rotation vous donne l'infrastructure, mais la discipline de scraping est tout aussi importante.
Bonnes pratiques pour rester opérationnel
Rotation d'IP et sessions
Utilisez des proxies résidentiels rotatifs pour les requêtes de recherche et de listing. Pour les requêtes détail (qui nécessitent parfois un cookie de session), utilisez des sticky sessions de 10 à 15 minutes :
# Session sticky de 10 minutes pour le détail produit
proxy_url = f"http://{PROXY_USER}-country-FR-session-prod123:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"Cela maintient la même IP résidentielle pendant la session, évitant les déclenchements de CAPTCHA liés aux changements d'IP en milieu de session.
Délais et débit
- Visez 3 à 5 requêtes par seconde maximum sur l'ensemble de votre infrastructure.
- Ajoutez un délai aléatoire de 1,5 à 3,5 secondes entre les requêtes détaillées.
- Si vous recevez un 429, attendez 60 secondes, puis relancez.
En-têtes et fingerprint
Les en-têtes mobiles sont votre meilleur atout. L'anti-bot d'Alibaba vérifie la cohérence entre le User-Agent et les headers X-Platform/X-App-Version. Gardez-les alignés avec une vraie version de l'app.
Évitez les bibliothèques Python avec un User-Agent par défaut comme python-requests/2.31. Utilisez toujours un User-Agent mobile réaliste.
Gestion des erreurs
- 429 (Rate Limit) : backoff exponentiel, 60s minimum.
- 403 (Forbidden) : l'IP est bloquée. Changez de proxy et réessayez.
- CAPTCHA response : arrêtez la session, changez d'IP, attendez 5 minutes.
- Empty data : parfois AliExpress retourne un objet vide quand il détecte un pattern anormal. Changez d'IP et de session.
Points clés à retenir
Key Takeaways :
- Préférez toujours l'API mobile (
m.aliexpress.com/api) au HTML desktop — JSON structuré, plus de données, moins de maintenance.- L'anti-bot d'Alibaba combine fingerprinting, rate limiting, CAPTCHA et device tracking — un proxy résidentiel rotatif est indispensable.
- Chaque IP résidentielle supporte ~150 requêtes avant challenge ; avec ProxyHat, la rotation par requête élimine ce problème.
- Filtrez les vendeurs sur
storeRating ≥ 95etpositiveFeedbackRate ≥ 0.95pour éliminer les fournisseurs peu fiables.- Adaptez votre cadence de scraping au type de données : 4h pour les prix, 12h pour le stock, 24h pour les ventes et produits tendance.
- Utilisez des sticky sessions pour les séquences détaillées et des IP rotatives pour le listing en masse.
Prochaines étapes
Vous avez maintenant la structure d'un scraper AliExpress fiable. Pour passer à l'échelle — des milliers de produits par jour — vous avez besoin d'un infrastructure de proxies résidentiels robuste. ProxyHat offre des IPs résidentielles dans plus de 200 pays avec rotation par requête ou sticky sessions, parfaitement adaptées au scraping web à grande échelle.
Consultez notre page de tarification pour choisir le plan adapté à votre volume, et explorez les localisations disponibles pour cibler précisément vos marchés dropshipping.
Pour approfondir les stratégies de scraping pour le suivi de positionnement, lisez notre guide sur le SERP tracking avec proxies.






