Comment extraire les données produit d'AliExpress pour la recherche en dropshipping
AliExpress cache ses données produit dans une variable JavaScript, pas dans le HTML visible. Récupérez ce JSON et vous obtiendrez les prix, les remises, le pays d'expédition et les chiffres de vente en une seule requête — voici comment, avec la plomberie anti-blocage.
AliExpress est le plus grand marché mondial et une source de choix pour la recherche en dropshipping : historique des prix et des remises, ce qui se vend réellement, origine d'expédition, et comment les offres changent selon le pays. En 2026, il s'appuie fortement sur le rendu JavaScript et des noms de classes aléatoires, ce qui pousse les gens à lancer un navigateur complet. Vous n'en avez généralement pas besoin. Les données produit se trouvent déjà dans le code source de la page à l'intérieur d'une variable JavaScript — extrayez cela et vous obtiendrez des données structurées propres en une seule requête. Ce guide montre la méthode du JSON caché, la dimension géographique qui rend les données AliExpress précieuses, et la plomberie proxy qui maintient un extracteur en vie.
Les données sont dans window.runParams, pas dans le DOM
Ouvrez une page de catégorie ou de résultats de recherche et affichez le code source. Toutes les prévisualisations de produits sont stockées dans une variable JavaScript appelée window.runParams, nichée dans une balise <script>. C'est un modèle moderne courant — le serveur envoie les données sous forme de JSON et le front-end les rend côté client. Pour un extracteur, c'est un cadeau : vous évitez complètement les sélecteurs CSS fragiles, extrayez la balise script avec une expression régulière, et la parsez comme un dictionnaire. Cette technique s'appelle l'extraction de données web cachées, et elle est bien plus durable que de courir après des noms de classes qui changent à chaque déploiement.
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)
Analyser les champs importants pour la recherche
Le blob runParams est énorme, alors ne récupérez que les champs réellement utilisés pour la recherche en dropshipping et de prix : le titre de l'annonce, le prix original vs le prix de vente, le pourcentage de remise, combien ont été vendus, et — de manière critique — le pays d'expédition, qui détermine le délai de livraison et la confiance de l'acheteur. L'imbrication semble intimidante mais elle est stable :
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"])
Cet appel unique vous donne l'économie d'un produit : une annonce montrant un prix original de 65,85 $ tombant à un prix de vente de 23,29 $ est une remise de 64 % — le type de signal de marge qui vous dit si un article vaut la peine d'être sourcé. Le nombre "vendu" est votre proxy de demande ; combiné à travers une catégorie, il classe les gagnants sans que vous ayez à consulter une page d'avis.

Pagination de recherche sans marteler le site
Les pages de recherche utilisent une pagination de longueur connue, donc l'idiome efficace est : extraire la première page, lire le nombre total de pages à partir de la réponse, puis récupérer le reste simultanément sous un plafond. Ne tirez pas toutes les pages à la fois — AliExpress limite agressivement le taux et commencera à renvoyer des 403. Gardez la concurrence modeste et faites tourner l'IP de sortie à chaque requête :
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")
La passerelle rotative est importante ici : une IP récupérant page après page est le moyen le plus rapide de se faire bloquer, tandis qu'une rotation par requête à travers un pool résidentiel répartit la charge de sorte qu'aucune sortie unique ne semble anormale. Le backoff exponentiel sur le 403 donne à une IP brûlée le temps de se renouveler.
Extraire AliExpress sur plus de 90 millions d'IPs résidentielles
La géo est tout l'intérêt
AliExpress personnalise les prix, la devise, les promotions et l'entrepôt d'expédition en fonction de la localisation du visiteur — le même produit peut afficher une carte locale aux États-Unis avec une expédition plus rapide à une IP américaine et un prix et une origine différents à une IP européenne. Pour la recherche en dropshipping, cette dimension géographique est la donnée : vous voulez savoir ce qu'un client dans votre marché cible voit réellement. Donc, définissez délibérément le pays de sortie. Routez via une IP dans chaque marché où vous vendez et enregistrez les différences ; un produit qui est bon marché et expédié localement dans une région mais lent et cher dans une autre est un pari très différent. Notre guide sur les proxies pour la recherche en dropshipping approfondit la transformation de ces matrices en décisions de sourcing.
# 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))
Les avis et le stock vivent dans des appels séparés
Les annonces vous donnent le prix et la demande, mais deux champs de grande valeur se trouvent derrière leurs propres requêtes. Les avis clients ne sont pas dans le runParams de la page produit — ils se chargent à partir d'un point de terminaison de feedback dédié, paginé, donc pour collecter les évaluations et le texte des avis, vous suivez cet appel par produit plutôt que de parser la page principale. Les signaux de stock sont similaires : le nombre "vendu" sur une annonce est un proxy de demande cumulatif, tandis que la disponibilité précise par variante (couleur, taille, entrepôt d'expédition) provient des données SKU dans la charge utile du détail du produit. Pour la recherche en dropshipping, cela est important car un produit peut sembler être un gagnant sur le prix et les ventes tandis qu'une variante spécifique que vous souhaitez vendre est en rupture de stock dans l'entrepôt desservant votre marché.
Traitez les deux comme un second passage : extrayez d'abord les annonces pour classer les candidats par remise et nombre vendu, puis enrichissez uniquement votre liste restreinte avec des pages d'avis et le stock par variante. Cela maintient le volume de requêtes — et votre risque de blocage — proportionnel à votre sérieux concernant chaque produit, au lieu de marteler chaque annonce pour des données que vous n'utiliserez pas.
Quand éviter l'extracteur DIY
La méthode du JSON caché est durable, mais AliExpress change les formes de charge utile, place les avis derrière un point de terminaison séparé, et intensifie les blocages sous volume. Si vous préférez ne pas maintenir la logique regex et de réessai, une Scraper API prend une URL et renvoie du JSON analysé — elle gère le rendu, la rotation et la couche anti-blocage, et vous ciblez géographiquement avec un seul paramètre. C'est le choix pragmatique une fois que vous collectez des milliers de produits sur les marchés selon un calendrier. Pour le modèle général de lecture des données directement à partir des charges utiles côté client, consultez notre note sur pourquoi un extracteur renvoie une page vide.

Questions fréquemment posées
Pouvez-vous extraire les données produit d'AliExpress ?
Oui. Les données d'annonce visibles publiquement — titres, prix, remises, nombres vendus, images et expédition — sont servies dans la variable JavaScript window.runParams sur les pages de catégorie, de recherche et de produit. Vous les extrayez avec une expression régulière et les parsez en JSON, sans avoir besoin d'un navigateur sans tête pour les annonces. Respectez les conditions et les limites de taux d'AliExpress.
AliExpress a-t-il une API publique ?
AliExpress propose des APIs d'affiliation et de plateforme ouverte, mais elles nécessitent une approbation, ont une couverture limitée et sont liées à un programme. Pour une recherche étendue à travers les catégories et les marchés, extraire les pages publiques vous donne plus de champs et un contrôle géographique complet, c'est pourquoi la plupart des chercheurs en dropshipping extraient le JSON sur la page à la place.
Pourquoi ai-je des erreurs 403 en extrayant AliExpress ?
Un 403 signifie qu'AliExpress a signalé la requête — généralement trop de frappes d'une seule IP, une plage de centre de données, ou un ensemble d'en-têtes mince. Faites tourner les IPs résidentielles par requête, ajoutez un backoff exponentiel sur le 403, envoyez un User-Agent réaliste et une accept-language, et gardez la concurrence basse. Si runParams manque dans le HTML, c'est le blocage, pas un changement de mise en page.
Comment obtenir des prix AliExpress spécifiques à un pays ?
Routez la requête via une IP de sortie dans le pays cible. AliExpress lit la localisation pour définir la devise, le prix, les promotions et l'entrepôt d'expédition, donc une IP américaine et une IP allemande voient des données différentes pour le même produit. Ciblez géographiquement le proxy par marché et enregistrez chaque version pour construire une matrice de prix par géo.
L'approche gagnante est ennuyeuse et durable : lisez le JSON que la page envoie déjà, paginez poliment, faites tourner des IPs résidentielles propres, et ciblez géographiquement chaque marché qui vous intéresse. Faites cela et AliExpress devient un flux fiable de prix, de signaux de demande et d'économie d'expédition plutôt qu'un mur de 403.
Obtenez des données AliExpress analysées depuis l'API Scraper