Scraping Shein à grande échelle en 2026 : par où commencer
Shein publie des millions de références produits avec des prix et stocks qui changent quotidiennement. Pour les analystes d'intelligence de prix et les équipes de veille fashion, scraper Shein à grande échelle en 2026 est devenu un défi technique majeur : le site combine Akamai Bot Manager, de la télémétrie device-side, et une localisation prix/devise par marché qui complique tout pipeline de collecte.
La première décision architecturale est le compromis API endpoints vs HTML rendu. Shein expose des endpoints JSON internes comme /api/productInfo et des feeds de catégorie qui renvoient des données structurées bien plus fiables que le parsing HTML. Mais ces endpoints sont protégés par la même stack anti-bot que les pages HTML. Dans ce guide, nous couvrons l'implémentation complète : de la compréhension de l'anti-bot stack de Shein jusqu'à un exemple Python fonctionnel avec curl_cffi et les proxies résidentiels ProxyHat.
Endpoints JSON internes vs HTML rendu : le compromis
Shein charge ses pages produit via un mélange de rendu serveur et d'hydratation client. Le HTML initial contient des blobs JSON embarqués dans des balises <script> — typiquement productIntroData et gbProductDetail — qui contiennent déjà la plupart des données produit. Mais il existe aussi des endpoints API dédiés :
| Approche | Source de données | Avantages | Inconvénients |
|---|---|---|---|
| Endpoints JSON internes | /api/productInfo?goods_id=... | Données structurées, moins de parsing, plus léger en bande passante | Headers requis, tokens anti-bot, paramètres qui changent |
| Blobs JSON embarqués | productIntroData dans le HTML | Une seule requête, données complètes | HTML volumineux (~500 KB), structure qui varie |
| Parsing HTML/CSS selectors | Sélecteurs CSS du DOM rendu | Simplicité initiale | Fragile, casse à chaque redesign, nécessite headless browser |
| Feed d'affiliation officiel | API partenaire Shein | Légal, stable, clé API | Accès restreint, données limitées, délai d'approbation |
Notre recommandation : privilégier les endpoints JSON internes avec goods_id et cat_id comme paramètres, et utiliser les blobs embarqués comme fallback. Le parsing CSS pur est à éviter — il casse trop souvent.
Stack anti-bot de Shein : Akamai Bot Manager et au-delà
Shein utilise Akamai Bot Manager comme principale ligne de défense. Akamai repose sur plusieurs mécanismes :
- Cookie
_abck: un cookie de session signé qui valide que le client a exécuté le JavaScript de télémétrie Akamai. Sans un_abckvalide, les requêtes API renvoient un HTTP 412 ou une page challenge. - Cookie
bm_sz: cookie de tracking complémentaire qui associe la session à un profil de device. sensor_data: payload télémétrique généré côté client par le script Akamai, incluant des empreintes de canvas, WebGL, timing, et événements souris/clavier.smdeviceid: token de device persistant stocké en localStorage, lié au profil navigateur.
Le problème fondamental : un headless Chrome naïf ne passe pas Akamai. Même avec Puppeteer ou Playwright, le sensor_data généré par un environnement headless présente des anomalies (absence de WebGL réel, timers prévisibles, pas d'événements souris organiques) qu'Akamai détecte. Le cookie _abck est émis mais marqué comme « challenge en attente », et après quelques requêtes, le serveur renvoie 403.
La stratégie gagnante en 2026 n'est pas de combattre Akamai côté navigateur, mais de :
- Utiliser
curl_cffiqui reproduit l'empreinte TLS JA3/JA4 d'un Chrome réel, évitant le blocage au niveau TLS. - Réutiliser un cookie
_abckvalide obtenu via une session navigateur instrumentée (une seule fois). - Router toutes les requêtes API via des proxies résidentiels rotatifs pour distribuer le risque.
Pour plus de détails sur le fonctionnement d'Akamai Bot Manager, consultez la documentation développeur d'Akamai.
Où trouver les données : champs SKU, inventory et endpoints de catégorie
Une fois passé l'anti-bot, les données produit sont riches et bien structurées. Voici les localisations clés :
Blobs JSON embarqués dans le HTML
Sur une page produit comme https://www.shein.com/Some-Product-p-123456.html, le HTML contient :
productIntroData: objet JSON avecgoods_id,goods_name,goods_img,goods_sn, et le tableaumallqui contient les infos multi-entrepôts.gbProductDetail: blob plus large incluantdetail,goods_priceInfo(avecretailPrice,salePrice,currency), etgoods_sku(matrice taille/couleur avecstockpar SKU).
Endpoints API internes
Les endpoints les plus utiles pour un Shein product scraper :
GET /api/productInfo?goods_id=123456— renvoie le détail produit complet en JSON.GET /api/category/product/list?cat_id=1935&page=1&limit=40— feed de catégorie paginé, renvoie un tableau de produits avecgoods_id, prix, et image.GET /api/search/search?key=dress&page=1— résultats de recherche, utile pour le monitoring par mot-clé.
Les champs critiques pour l'intelligence de prix :
{
"goods_priceInfo": {
"retailPrice": { "amount": "29.99", "amountWithSymbol": "$29.99" },
"salePrice": { "amount": "12.99", "amountWithSymbol": "$12.99" },
"currency": "USD"
},
"goods_sku": [
{ "sku_code": "SKU-A-001", "stock": 847, "size": "S", "color": "Black" },
{ "sku_code": "SKU-A-002", "stock": 0, "size": "M", "color": "Black" }
]
}
Limites de taux par IP et nécessité des proxies résidentiels
Shein applique des limites de taux agressives par adresse IP. D'après nos tests et les retours de la communauté :
- ~30-50 requêtes par IP avant le premier challenge Akamai (sans cookies valides).
- ~100-150 requêtes par IP avec un
_abckvalide et une empreinte TLS correcte. - Au-delà, HTTP 412 (challenge) puis 403 (blocage) après ~200 requêtes.
Ces seuils rendent la rotation d'IP obligatoire. Mais ce n'est pas suffisant : Shein localise prix, devise et disponibilité par marché. Un produit consulté depuis une IP américaine affichera des prix en USD, tandis que la même page depuis une IP allemande affichera des prix en EUR — avec parfois des écarts de 10-15% et des différences de stock.
C'est pourquoi les proxies résidentiels avec géo-ciblage sont indispensables. Avec ProxyHat, vous spécifiez le pays directement dans le username :
# Proxy US pour prix en USD
http://user-country-US:pass@gate.proxyhat.com:8080
# Proxy Allemagne pour prix en EUR
http://user-country-DE:pass@gate.proxyhat.com:8080
# Proxy Royaume-Uni pour prix en GBP
http://user-country-GB:pass@gate.proxyhat.com:8080
Pour comparer les options de proxy pour votre cas d'usage, consultez notre page de tarification et notre guide sur le web scraping avec proxies.
Exemple Python : scraper Shein avec curl_cffi et ProxyHat
Voici un exemple complet utilisant curl_cffi (qui reproduit l'empreinte TLS de Chrome) routé via les proxies résidentiels ProxyHat. Cet exemple récupère les données de prix Shein pour un produit donné :
from curl_cffi import requests
import json
# Configuration ProxyHat — proxy résidentiel US
proxy_url = "http://user-country-US:YourPassword@gate.proxyhat.com:8080"
proxies = {
"http": proxy_url,
"https": proxy_url,
}
# Headers imitant un navigateur Chrome réel
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.shein.com/",
"Origin": "https://www.shein.com",
}
# Endpoint API interne Shein
goods_id = "24865472"
url = f"https://www.shein.com/api/productInfo?goods_id={goods_id}"
response = requests.get(
url,
headers=headers,
proxies=proxies,
impersonate="chrome120",
timeout=15,
)
if response.status_code == 200:
data = response.json()
# Extraction des champs clés
price_info = data.get("goods_priceInfo", {})
skus = data.get("goods_sku", [])
print(json.dumps({
"goods_id": goods_id,
"retailPrice": price_info.get("retailPrice", {}).get("amount"),
"salePrice": price_info.get("salePrice", {}).get("amount"),
"currency": price_info.get("currency"),
"sku_count": len(skus),
"total_stock": sum(s.get("stock", 0) for s in skus),
}, indent=2))
elif response.status_code == 412:
print("Challenge Akamai — _abck invalide ou expiré")
else:
print(f"Erreur HTTP {response.status_code}")
Réponse tronquée attendue :
{
"goods_id": "24865472",
"retailPrice": "29.99",
"salePrice": "12.99",
"currency": "USD",
"sku_count": 14,
"total_stock": 3842
}
Notez l'utilisation de impersonate="chrome120" dans curl_cffi : cela reproduit l'empreinte TLS JA3 de Chrome 120, ce qui évite le blocage au niveau de la négociation TLS. Sans cette option, Akamai détecte immédiatement que le client n'est pas un vrai navigateur.
Pagination, sessions persistantes et cohérence des devises
Le scraping de catalogue nécessite de parcourir des dizaines de pages par catégorie. Deux problèmes surviennent :
1. Pagination des feeds de catégorie
L'endpoint /api/category/product/list accepte page et limit. Une catégorie typique contient 200-2000 produits, soit 5-50 pages de 40 produits :
import time
import random
cat_id = "1935" # Dresses
base_url = "https://www.shein.com/api/category/product/list"
all_products = []
for page in range(1, 51):
params = {"cat_id": cat_id, "page": page, "limit": 40}
resp = requests.get(
base_url,
params=params,
headers=headers,
proxies=proxies,
impersonate="chrome120",
timeout=15,
)
if resp.status_code == 200:
products = resp.json().get("products", [])
if not products:
break # Fin de pagination
all_products.extend(products)
# Délai aléatoire pour éviter la détection de pattern
time.sleep(random.uniform(1.0, 2.5))
elif resp.status_code == 412:
print(f"412 à la page {page} — pause et retry")
time.sleep(30)
continue
else:
print(f"HTTP {resp.status_code} à la page {page}")
break
print(f"Total produits collectés: {len(all_products)}")
2. Sessions persistantes pour la cohérence des devises
Si vous paginez sans session persistante, chaque requête peut passer par une IP différente — potentiellement dans des pays différents — et vous obtiendrez des prix dans des devises mixtes. ProxyHat supporte les sticky sessions via le flag -session- dans le username :
# Session persistante US — même IP pour toute la session
proxy_sticky = "http://user-country-US-session-cat1935:pass@gate.proxyhat.com:8080"
proxies_sticky = {"http": proxy_sticky, "https": proxy_sticky}
Avec -session-cat1935, ProxyHat maintient la même IP résidentielle pour toutes les requêtes de cette session, garantissant que les prix restent en USD tout au long de la pagination. Changez d'ID de session pour obtenir une nouvelle IP.
3. Backoff exponentiel et gestion du 412
Quand Akamai envoie un 412, le cookie _abck doit être rafraîchi. Implémentez un backoff exponentiel :
def fetch_with_retry(url, max_retries=4):
for attempt in range(max_retries):
resp = requests.get(
url,
headers=headers,
proxies=proxies,
impersonate="chrome120",
timeout=15,
)
if resp.status_code == 200:
return resp.json()
elif resp.status_code == 412:
wait = 2 ** attempt + random.uniform(0, 1)
print(f"412 — retry dans {wait:.1f}s (tentative {attempt+1})")
time.sleep(wait)
elif resp.status_code == 403:
print("403 — IP bloquée, rotation nécessaire")
# Forcer une nouvelle IP en changeant de session
return None
else:
print(f"HTTP {resp.status_code}")
return None
return None
La règle empirique : si vous obtenez plus de 3 erreurs 412 consécutives, la session est compromise. Changez d'IP (nouveau -session- ID) et attendez 60 secondes avant de reprendre.
Erreurs courantes et cas limites
- Oublier le géo-ciblage : sans
-country-, ProxyHat assigne une IP aléatoire. Vous obtiendrez des prix en JPY, MXN, ou EUR au hasard. Toujours spécifier le pays. - Requêtes trop rapides : même avec rotation, 10 requêtes/seconde par IP déclenche Akamai. Visez 1-2 requêtes/seconde par IP, et utilisez la concurrence (10-20 IPs parallèles) plutôt que la vitesse sur une seule IP.
- Ignorer le
RefereretOrigin: les endpoints API de Shein vérifient ces headers. SansReferer: https://www.shein.com/, beaucoup d'endpoints renvoient 403. - Ne pas gérer les produits multi-marchés : un même
goods_idpeut avoir des prix et stocks différents selon le marché. Stockez toujours le pays/la devise avec chaque enregistrement. - Utiliser des proxies datacenter : les IP datacenter sont identifiées par Akamai en moins de 10 requêtes. Les headers HTTP seuls ne suffisent pas — l'IP doit être résidentielle.
Éthique, conditions d'utilisation et alternatives légales
Le scraping de données publiques de produit (prix, titre, image, stock) est généralement toléré pour l'analyse de marché, mais plusieurs précautions s'imposent :
- Données publiques uniquement : ne scrapez que les pages et endpoints accessibles sans connexion. N'essayez jamais d'accéder au panier, au checkout, ou aux comptes utilisateurs.
- Respect du
robots.txt: vérifiezhttps://www.shein.com/robots.txtavant de collecter. Si un chemin estDisallow, évitez-le. - CFAA et GDPR : aux États-Unis, le Computer Fraud and Abuse Act peut s'appliquer en cas d'accès non autorisé. En Europe, le RGPD protège les données personnelles — les données produit n'en sont pas, mais les avis utilisateurs avec noms/emails le sont. Ne collectez pas de données personnelles.
- Volume raisonnable : un scraping à 100 000 requêtes/jour est visible et peut dégrader le service. Limitez votre collecte au strict nécessaire.
Quand utiliser le feed d'affiliation officiel ? Shein propose un programme d'affiliation avec un accès API aux données produit. Si votre objectif est le monitoring de prix long-terme sur un catalogue fixe, c'est la voie la plus légale et la plus stable. Le scraping est pertinent pour :
- La collecte ponctuelle de snapshots prix.
- Le monitoring de catégories spécifiques non couvertes par l'API d'affiliation.
- L'analyse concurrentielle nécessitant des données en temps quasi-réel.
Pour des cas d'usage similaires de suivi SERP et d'intelligence de prix, consultez notre guide sur le SERP tracking avec proxies. La documentation technique complète de ProxyHat est disponible sur docs.proxyhat.com.
Points clés à retenir
- Privilégiez les endpoints JSON internes (
/api/productInfo,/api/category/product/list) au parsing HTML — plus stable et plus léger.- Akamai Bot Manager est la principale barrière : gérez les cookies
_abcketbm_sz, utilisezcurl_cffipour l'empreinte TLS.- Proxy résidentiel + géo-ciblage obligatoire : Shein localise prix et stock par marché. Utilisez
-country-US,-country-DE, etc.- Sessions persistantes (
-session-) pour la cohérence des devises lors de la pagination.- Limites de taux : ~100-150 requêtes par IP avec cookies valides. Visez 1-2 req/s par IP, scalez par la concurrence.
- Backoff exponentiel sur 412, rotation de session sur 403, pause de 60s après 3 échecs consécutifs.
- Éthique : données publiques uniquement, respectez
robots.txt, envisagez le feed d'affiliation pour la collecte long-terme.
FAQ
Qu'est-ce que le scraping Shein à grande échelle en 2026 ?
Le scraping Shein à grande échelle en 2026 consiste à extraire automatiquement les données de catalogue, prix et stocks du site shein.com via ses endpoints JSON internes ou le HTML rendu, en utilisant des proxies résidentiels rotatifs pour contourner les systèmes anti-bot comme Akamai Bot Manager. L'objectif est de collecter des données d'intelligence de prix à volume élevé sans être bloqué.
Pourquoi le scraping Shein à grande échelle en 2026 importe-t-il pour les utilisateurs de proxies ?
Shein localise prix, devise et disponibilité par région géographique, ce qui rend les proxies avec géo-ciblage indispensables. Sans rotation d'IP résidentielle et ciblage par pays, les requêtes sont rapidement bloquées par Akamai Bot Manager. Les utilisateurs de proxies doivent comprendre les limites de taux par IP, la gestion des cookies _abck et l'importance des sessions persistantes pour la cohérence des devises.
Quel type de proxy fonctionne le mieux pour le scraping Shein à grande échelle en 2026 ?
Les proxies résidentiels rotatifs avec géo-ciblage par pays sont le meilleur choix pour scraper Shein. Ils imitent le trafic d'utilisateurs réels avec des adresses IP ISP légitimes, ce qui réduit le risque de détection par Akamai. Les proxies datacenter sont rapidement identifiés et bloqués en moins de 10 requêtes. Les sessions persistantes (sticky sessions) via le flag -session- sont recommandées pour maintenir la cohérence des devises lors de la pagination.
Comment éviter les blocages lors du scraping Shein à grande échelle en 2026 ?
Pour éviter les blocages, utilisez curl_cffi avec impersonate="chrome120" pour l'empreinte TLS JA3, faites tourner les proxies résidentiels avec géo-ciblage via -country-, gérez les cookies _abck et bm_sz d'Akamai, implémentez un backoff exponentiel sur les erreurs 412, et respectez des limites de taux réalistes (1-2 requêtes par seconde par IP). Changez de session après 3 erreurs 412 consécutives et attendez 60 secondes.






