Estrarre dati da Shein a volumi elevati nel 2026 significa confrontarsi con uno degli stack anti-bot più aggressivi dell'e-commerce globale. Per fare scrape Shein in modo affidabile devi scegliere subito l'approccio giusto: parsare HTML renderizzato o colpire direttamente gli endpoint JSON interni di Shein. Questa guida è pensata per team di retail price-intelligence e analisti di mercato moda che devono costruire un Shein product scraper robusto e raccogliere Shein price data in modo continuativo.
Scraping Shein su larga scala nel 2026: API interne vs HTML renderizzato
Shein, come molti marketplace moderni, non espone un'API pubblica per il catalogo. Il sito è una SPA pesante basata su React/Next.js che idrata i contenuti tramite chiamate XHR a endpoint interni del tipo /api/productInfo e /api/products/v3/list. Hai due strade:
- HTML renderizzato (headless browser): carichi ogni pagina con Playwright/Puppeteer, attendi l'idratazione e leggi il DOM. Funziona ma è lento (3–6 secondi per pagina), costoso in termini di CPU e facilmente rilevabile da fingerprinting TLS e canvas.
- Endpoint JSON interni: chiami direttamente gli endpoint che il frontend già usa, ottenendo JSON strutturato con
retailPrice,salePrice,stock,goods_idecat_id. È 10–20 volte più veloce e consuma molta meno banda, ma richiede di replicare header, cookie anti-bot e fingerprint TLS corretti.
Per il monitoraggio continuo dei prezzi, l'approccio JSON è quasi sempre vincente. Il problema è che Shein protegge quegli endpoint con Akamai Bot Manager, uno dei sistemi anti-bot più diffusi sul web, che combina cookie _abck, bm_sz e telemetria sensor_data per distinguere browser reali da bot.
Stack anti-bot di Shein: perché Chrome headless non basta
Shein utilizza una combinazione di tecnologie di difesa che rendono insufficiente un semplice browser headless:
- Akamai Bot Manager — emette il cookie
_abckdopo un challenge JavaScript iniziale e lo rivalida continuamente. Senza un_abckvalido, le richieste agli endpoint API ricevono HTTP 403 o 412. - bm_sz cookie — token di sessione legato al browser e al fingerprint del dispositivo, generato durante il caricamento della pagina.
- sensor_data — payload di telemetria che raccoglie timing degli eventi, caratteristiche del navigator, WebGL e canvas. Viene inviato a un endpoint
/_bm/...per validare la sessione. - smdeviceid — device token persistente che Shein usa per correlare sessioni e rilevare pattern di traffico anomali.
Un Chrome headless standard, anche con stealth plugin, presenta differenze rilevabili nel fingerprint TLS (JA3/JA4), nelle Chrome DevTools Protocol exposure e nel comportamento degli eventi. Akamai identifica questi segnali e invalida il _abck, restituendo 403. Per questo motivo la strategia più efficace è combinare client HTTP con fingerprint TLS realistico (es. curl_cffi in Python) e proxy residenziali rotanti che distribuiscono il carico su IP reali.
Dove si trovano i dati: JSON blob, SKU e feed di categoria
Le pagine prodotto di Shein incorporano due blob JSON principali nel HTML iniziale:
- productIntroData — contiene descrizioni, specifiche, taglie e colori.
- gbProductDetail — contiene prezzo di listino (
retailPrice), prezzo scontato (salePrice), valuta,goods_id,goods_sn, disponibilità per SKU e immagini.
Per il catalogo, Shein espone feed di categoria tramite endpoint del tipo:
https://www.shein.com/Women-Dresses-c-1727.html
https://www.shein.com/api/products/v3/list?cat_id=1727&page=1&page_size=40&sort=7
I parametri chiave sono goods_id (identificativo univoco prodotto) e cat_id (identificativo categoria). La paginazione usa page e page_size, con un massimo tipico di 40–60 item per pagina. Ogni item nel feed contiene già prezzo, sconto, rating e un URL prodotto da cui estrarre il dettaglio SKU.
Rate limit per IP e perché serve la rotazione residenziale con geo-targeting
Shein localizza prezzo, valuta, disponibilità e persino il catalogo visibile in base al paese e alla lingua del visitatore. Un utente statunitense vede prezzi in USD e stock US, un utente tedesco vede EUR e stock EU. Questo significa che per confrontare prezzi cross-border devi impersonare IP locali.
In pratica, i limiti di rate per IP su Shein sono aggressivi:
- Circa 80–120 richieste/minuto per IP prima di ricevere 429 o 403 soft.
- Oltre 200 richieste/minuto si attiva quasi sempre il challenge Akamai con 403/412.
- Sessioni che generano troppi 403 consecutivi vengono flaggate e il
smdeviceidassociato può finire in blocklist per 24–48 ore.
Per questi motivi i proxy residenziali rotanti con geo-targeting sono obbligatori. Con ProxyHat puoi specificare il paese direttamente nello username:
http://user-country-US:pass@gate.proxyhat.com:8080
http://user-country-DE:pass@gate.proxyhat.com:8080
http://user-country-IT:pass@gate.proxyhat.com:8080
In questo modo ogni richiesta esce da un IP residenziale del paese target, con valuta e stock coerenti. Per approfondire le localizzazioni disponibili consulta la pagina locations di ProxyHat.
Esempio Python con curl_cffi e ProxyHat
Per replicare il fingerprint TLS di Chrome reale, curl_cffi è una delle librerie più affidabili in Python. Si integra nativamente con il proxy HTTP di ProxyHat. Ecco un esempio completo per estrarre prezzo e stock da un endpoint prodotto:
from curl_cffi import requests
import json
PROXY = "http://user-country-US:pass@gate.proxyhat.com:8080"
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/124.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.shein.com/",
}
url = "https://www.shein.com/api/productInfo?goods_id=12345678"
resp = requests.get(
url,
headers=HEADERS,
impersonate="chrome124",
proxies={"http": PROXY, "https": PROXY},
timeout=20,
)
data = resp.json()
product = data.get("info", {}).get("goods", {})
print({
"goods_id": product.get("goods_id"),
"retailPrice": product.get("retailPrice", {}).get("amount"),
"salePrice": product.get("salePrice", {}).get("amount"),
"stock": product.get("stock", 0),
"currency": product.get("retailPrice", {}).get("currency"),
})
Una risposta tipica (truncated) ha questa forma:
{
"info": {
"goods": {
"goods_id": "12345678",
"retailPrice": {"amount": "45.99", "currency": "USD"},
"salePrice": {"amount": "29.99", "currency": "USD"},
"stock": 1240,
"goods_sn": "swdress07190412345",
"title": "Solid Bandeau Midi Dress"
}
}
}
Per il feed di categoria, basta cambiare l'URL e iterare su page:
def fetch_category(cat_id, max_pages=20):
items = []
for page in range(1, max_pages + 1):
url = f"https://www.shein.com/api/products/v3/list?cat_id={cat_id}&page={page}&page_size=40&sort=7"
resp = requests.get(
url,
headers=HEADERS,
impersonate="chrome124",
proxies={"http": PROXY, "https": PROXY},
timeout=20,
)
if resp.status_code != 200:
break
batch = resp.json().get("info", {}).get("products", [])
if not batch:
break
items.extend(batch)
return items
Paginazione, sessioni sticky e gestione del 412/_abck
Shein localizza valuta e prezzo in base all'IP. Se ruoti IP a ogni richiesta durante una sessione di paginazione, rischi di ottenere prezzi in valute diverse, rendendo incoerenti i confronti. La soluzione è usare sessioni sticky ProxyHat che mantengono lo stesso IP per un intervallo configurato:
http://user-session-shein-us-001-country-US:pass@gate.proxyhat.com:8080
La stringa shein-us-001 è arbitraria:ProxyHat la usa come chiave per mantenere lo stesso IP di uscita. Usa una sessione sticky per ogni combinazione paese/valuta che devi monitorare, e ruota solo quando la sessione scade o ricevi un 403/412.
La logica di backoff per gestire il refresh del _abck è fondamentale:
import time
import random
def fetch_with_retry(url, max_retries=4):
for attempt in range(max_retries):
try:
resp = requests.get(
url,
headers=HEADERS,
impersonate="chrome124",
proxies={"http": PROXY, "https": PROXY},
timeout=20,
)
if resp.status_code == 200:
return resp.json()
elif resp.status_code in (403, 412):
# _abck invalidato: attendi e ruota sessione
time.sleep(random.uniform(5, 15))
# genera nuovo session id per forzare nuovo IP
continue
elif resp.status_code == 429:
time.sleep(random.uniform(30, 60))
continue
except Exception as e:
time.sleep(5)
return None
Un pattern efficace è combinare sessioni sticky lunghe (30–60 minuti) per ridurre la frequenza di challenge Akamai con rotazione su 412: quando ricevi un 412, abbandoni la sessione e ne crei una nuova con un altro IP residenziale.
| Strategia | Quando usarla | Pro | Contro |
|---|---|---|---|
| Rotazione per-request | Scraping catalogo ampio, feed di categoria | Distribuisce il carico, riduce ban per IP | Valuta/stock possono variare tra richieste |
| Sessione sticky (30–60 min) | Monitoraggio prezzo per paese, paginazione | Coerenza valuta e prezzi, meno challenge | Se IP viene flaggato, perdi la sessione |
| Sessione sticky + rotazione su 412 | Produzione continua, alta affidabilità | Bilanciamento ottimale | Richiede logica di retry più complessa |
ProxyHat: setup e integrazione
ProxyHat offre proxy residenziali, mobili e datacenter con geo-targeting a livello di paese e città. Per scraping Shein, i residenziali sono la scelta predefinita perché offrono IP reali associati a ISP domestici, riducendo la probabilità di ban. I mobili sono utili per traffico mobile-localizzato, mentre i datacenter sono sconsigliati per Shein dato che Akamai li riconosce facilmente.
Parametri di connessione:
- Gateway HTTP:
gate.proxyhat.com:8080 - Gateway SOCKS5:
gate.proxyhat.com:1080 - Geo-targeting:
user-country-US:pass,user-country-DE-city-berlin:pass - Sessione sticky:
user-session-abc123:pass
Per i dettagli sui piani consulta la pagina prezzi di ProxyHat. Per casi d'uso correlati vedi web scraping e SERP tracking. La documentazione tecnica completa è su docs.proxyhat.com.
Etica, TOS e quando usare un feed ufficiale
Lo scraping di dati pubblici di prodotto (prezzo, titolo, disponibilità, immagini) è generalmente lecito quando rispetta i termini di servizio e non danneggia l'infrastruttura del sito. Tuttavia ci sono limiti importanti:
- Niente checkout o accesso account: non tentare mai di simulare carrelli, login o pagamenti. Questo viola quasi certamente i TOS e può configurare accesso non autorizzato.
- CFAA e GDPR: negli Stati Uniti il Computer Fraud and Abuse Act può applicarsi ad accessi non autorizzati. In UE, il GDPR tutela i dati personali: raccogli solo dati di prodotto pubblici, mai profili utente o recensioni con dati personali.
- robots.txt: controlla sempre
https://www.shein.com/robots.txte rispetta le direttive, anche se tecnicamente aggirabili. - Rate responsabile: mantieni un throughput che non impatta le performance del sito. 1–2 richieste al secondo per IP con rotazione è un buon limite pratico.
Nota: Shein offre un programma di affiliazione ufficiale con accesso a feed di prodotto strutturati. Se il tuo obiettivo è monitoraggio prezzo per affiliazione o comparison shopping, il feed ufficiale è più affidabile, legale e manutenibile del scraping. Valutalo sempre prima di costruire infrastruttura di scraping custom.
Errori comuni e edge case
- Fingerprint TLS non coerente: usare
requestsstandard con header Chrome ma senza impersonare il JA3/JA4 porta a 403 immediati. Usacurl_cffiotls-client. - Cookie _abck scaduto: il cookie ha una validità limitata (spesso 30–60 minuti). Se lo riutilizzi troppo a lungo, Akamai invalida la sessione.
- Valuta incoerente: ruotare IP tra paesi senza sessioni sticky genera dataset con prezzi misti USD/EUR/GBP. Segmenta sempre per paese.
- Endpoint che cambiano: Shein aggiorna i path API periodicamente. Monitora le chiamate XHR nel DevTools e aggiorna gli URL quando cambiano.
- Blocco smdeviceid: se lo stesso device token genera troppo traffico, finisce in blocklist. Rigenera il token periodicamente o usa sessioni completamente nuove.
Key Takeaways
- Prefisci gli endpoint JSON interni (
/api/productInfo,/api/products/v3/list) rispetto al parsing HTML: 10–20 volte più veloce e meno rilevabile. - Akamai Bot Manager con
_abck,bm_szesensor_datarichiede fingerprint TLS realistico:curl_cfficonimpersonate="chrome124"è la combinazione più efficace. - Usa proxy residenziali con geo-targeting per paese (
-country-US,-country-DE) per ottenere prezzi e stock coerenti. - Sessioni sticky ProxyHat mantengono valuta e IP stabili durante la paginazione.
- Mantieni rate sotto 80–120 richieste/minuto per IP e implementa backoff su 403/412/429.
- Rispetta TOS, robots.txt e GDPR: raccogli solo dati di prodotto pubblici, mai checkout o account.
- Valuta il feed di affiliazione ufficiale di Shein se il tuo caso d'uso è compatibile.
Con questa architettura — curl_cffi per TLS, ProxyHat per rotazione residenziale geo-targetizzata, sessioni sticky per coerenza valuta e backoff su 412 — puoi costruire un Shein product scraper production-grade che raccoglie Shein price data affidabile per price intelligence e analisi di mercato moda.






