Scraping Temu Dati Prodotto e Prezzo 2026: Il Dilemma API vs HTML
Temu non offre un'API pubblica per accedere al proprio catalogo prodotti. Se devi monitorare prezzi, disponibilità o dati SKU su larga scala, ti trovi di fronte a una scelta fondamentale: analizzare l'HTML delle pagine prodotto — card volatili con classi CSS hashate che cambiano ad ogni deploy — oppure intercettare gli endpoint JSON interni come /api/poppy/v1/search e /api/poppy/v1/goods/detail che alimentano la griglia di listing. La seconda opzione è più efficiente, più stabile e restituisce dati strutturati, ma richiede di gestire un anti-bot stack aggressivo.
Per chi fa scrape Temu professionalmente — team di price intelligence, data engineer e-commerce, SEO che monitorano SERP di prodotto — la differenza tra le due strategie non è accademica: parsare HTML significa riscrivere i selettori ogni settimana, mentre puntare agli endpoint JSON significa costruire una pipeline che sopravvive mesi senza intervento. Il costo di quest'ultima è la complessità anti-bot: Temu combina Cloudflare Turnstile, header anti_content firmati lato client e fingerprinting TLS/HTTP2 che identifica e blocca gli IP datacenter in tempi dell'ordine di 200ms.
In questa guida affrontiamo entrambi gli approcci, con codice Python funzionante, selettori concreti e strategie proxy reali per costruire un Temu price scraper affidabile nel 2026.
Contesto Tecnico: Perché Temu È Difficile da Scrapear
Temu è costruito su un'infrastruttura che combina rendering server-side (Next.js) con idratazione client e chiamate API successive. Il catalogo è servito attraverso una rete CDN protetta da Cloudflare, con un livello aggiuntivo di protezione proprietaria che PDD Holdings (la società madre di Temu) ha sviluppato per la sua piattaforma originaria Pinduoduo.
Lo stack anti-bot di Temu
- Cloudflare Turnstile: challenge invisibile che analizza il comportamento del browser, il fingerprint TLS e i segnali ambientali. Non richiede interazione utente ma blocca richieste con fingerprint non umani.
- Header
anti_content: un token firmato generato lato client tramite JavaScript offuscato. Include segnali comportamentali (movimenti mouse, timing keystroke, environment fingerprint) codificati in una stringa base64. Senza questo header, le API REST di Temu restituiscono403 Forbiddeno payload vuoti. - Fingerprinting TLS/HTTP2: Temu verifica che la negoziazione TLS e l'HTTP2 fingerprint del client corrispondano a quelli di un browser reale. Librerie come
requestsohttpxcon il backend Python standard vengono identificate immediatamente perché il loro JA3/JA4 fingerprint non corrisponde a nessun browser noto. - Geolocalizzazione IP: prezzi, spedizione e disponibilità variano per regione. Un IP datacenter tedesco che richiede una pagina prodotto US riceve dati diversi o un redirect, rendendo i dati inaffidabili per il price monitoring.
La combinazione di questi liveri significa che un semplice requests.get() su un IP datacenter fallisce entro le prime 3-5 richieste. Anche con header browser completi, il fingerprint TLS tradisce l'identità del client.
Trovare i Dati: HTML Embeddato vs Endpoint JSON
L'approccio HTML: __NEXT_DATA__ e selettori hashati
Le pagine prodotto di Temu includono un blob JSON embeddato in un tag <script id="__NEXT_DATA__"> (o simile, a seconda del deploy). Questo blob contiene lo stato iniziale idratato dal server, inclusi dati prodotto, prezzo e SKU. Estrarlo è più semplice che chiamare le API interne, ma il blob può essere troncato o contenere solo dati parziali.
import re, json, requests
html = requests.get("https://www.temu.com/goods-detail-123456.html").text
match = re.search(r'<script id="__NEXT_DATA__"[^>]*>(.*?)</script>', html)
if match:
data = json.loads(match.group(1))
# Il path esatto varia: naviga data["props"]["pageProps"]...
print(json.dumps(data, indent=2)[:500])
Gli elementi visivi (titolo, prezzo, immagini) usano classi CSS hashate del tipo _2k3v8L che cambiano ad ogni build. Più affidabile è l'attributo data-uniqid presente su alcuni elementi prodotto, ma la sua presenza non è garantita su tutte le pagine.
L'approccio JSON: endpoint interni
Apri DevTools su temu.com e filtra per /api/poppy/. Vedrai richieste come:
GET /api/poppy/v1/search?keyword=laptop&pageSize=50&page=1— risultati di ricercaGET /api/poppy/v1/goods/detail?goodsId=123456— dettaglio prodottoPOST /api/poppy/v1/recommend/list— prodotti correlati
Questi endpoint restituiscono JSON strutturato con campi stabili (goods_id, goods_name, min_normal_price, sku_list) che non dipendono dai selettori CSS. Lo svantaggio è che richiedono header validi: anti_content, cookie di sessione, e un fingerprint TLS coerente.
Rate-Limit e Perché i Proxy Residenziali Sono Obbligatori
Temu applica rate-limit dinamici basati su IP, comportamento e reputazione. Dalle osservazioni pratiche della community di scraping, i threshold approssimativi sono:
- IP datacenter: 3-5 richieste prima di challenge Cloudflare o ban. Tempo di recupero: 24-48 ore per quell'IP.
- IP residenziale senza geo-target: 50-80 richieste/minuto prima di CAPTCHA intermittenti.
- IP residenziale con geo-target città + sticky session: 100-150 richieste/minuto con successo >95%.
I prezzi su Temu variano per regione: spedizione gratuita negli USA può diventare a pagamento in Europa, e i prezzi locali includono tasse e dazi. Un Temu product data API interno che non rispetta la geolocalizzazione restituisce dati inconsistenti. Per questo motivo, i proxy residenziali con geo-target a livello di paese (-country-US) o città (-country-US-city-chicago) sono obbligatori, non opzionali.
| Tipo Proxy | Success Rate Temu | Geo-Target | Costo | Idoneità |
|---|---|---|---|---|
| Datacenter | <10% | No | $0.5/GB | Non raccomandato |
| Mobile (4G/5G) | 90-95% | Paese | $3-8/GB | Ottimo, ma costoso |
| Residenziale rotante | 85-92% | Paese/Città | $1.5-4/GB | Scelta consigliata |
| Residenziale sticky | 92-97% | Paese/Città | $1.5-4/GB | Migliore per detail page |
Consulta la nostra pagina prezzi proxy per i piani residenziali disponibili e le localizzazioni coperte.
Esempio Python: curl_cffi + ProxyHat per Scraping Temu
La libreria curl_cffi permette di fare richieste HTTP con un fingerprint TLS identico a quello di un browser reale (Chrome, Safari, Firefox). È il primo strumento da combinare con proxy residenziali per Temu.
from curl_cffi import requests as cffi_requests
import json
# ProxyHat HTTP proxy con geo-target US
proxy_url = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.temu.com/",
}
response = cffi_requests.get(
"https://www.temu.com/goods-detail-123456.html",
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome120",
timeout=30,
)
print(f"Status: {response.status_code}")
print(f"Body length: {len(response.text)} bytes")
Una volta ottenuta la pagina, estrai il blob __NEXT_DATA__ o, meglio, usa la sessione con cookie per chiamare direttamente l'endpoint JSON:
from curl_cffi import requests as cffi_requests
import json
proxy_url = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
# Crea una sessione con impersonazione browser
session = cffi_requests.Session(impersonate="chrome120")
session.proxies = {"http": proxy_url, "https": proxy_url}
# Prima visita la homepage per ottenere cookie di sessione
session.get("https://www.temu.com/", timeout=30)
# Ora chiama l'endpoint JSON interno
api_url = "https://www.temu.com/api/poppy/v1/goods/detail"
params = {"goodsId": "123456", "source": "search"}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36",
"Accept": "application/json",
"Referer": "https://www.temu.com/goods-detail-123456.html",
# anti_content va generato lato client o reverse-engineered
"anti-content": "YOUR_ANTI_CONTENT_TOKEN",
}
resp = session.get(api_url, params=params, headers=headers, timeout=30)
data = resp.json()
# Risposta di esempio (troncata):
# {
# "goods_id": 123456,
# "goods_name": "Wireless Earbuds Pro",
# "min_normal_price": {"amount": 1299, "currency": "USD"},
# "sku_list": [
# {"sku_id": 78901, "spec": "Black", "price": {"amount": 1299}},
# {"sku_id": 78902, "spec": "White", "price": {"amount": 1499}}
# ],
# "shipping_info": {"free_shipping": true, "estimated_days": 5}
# }
print(json.dumps(data, indent=2)[:800])
Nota critica: l'header
anti_contentè il collo di bottiglia principale. Alcuni team lo estraggono eseguendo il JS di Temu in un browser headless (Playwright) e leggendo il token prima di ogni batch di richieste API. Altri lo reverse-engineerano, ma il codice è offuscato e cambia frequentemente. L'approccio ibrido — Playwright per il token, curl_cffi per le richieste dati — offre il miglior rapporto performance/affidabilità.
Sessioni Sticky, Retry e Paginazione
Per dati coerenti — soprattutto quando monitori carrelli, costi di spedizione o prezzi regionali — devi mantenere la stessa identità IP per tutta la durata di una sessione logica. ProxyHat supporta sessioni sticky tramite il flag -session- nel username:
# Sessione sticky: stesso IP per tutta la durata della sessione
proxy_sticky = "http://user-country-US-session-mybatch001:PASSWORD@gate.proxyhat.com:8080"
# Rotazione per-request: nuovo IP ad ogni richiesta
proxy_rotating = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
Strategia consigliata per paginazione su Temu:
- Pagina 1-10: usa una sessione sticky con geo-target US. Se incontri un 403, ruota sessione (cambia
-session-ID) e riprova. - Pagina 11-20: nuova sessione sticky, stesso geo-target. Pausa di 2-5 secondi tra le pagine.
- Oltre pagina 20: Temu spesso non restituisce più risultati o mostra una pagina di fallback. Considera di cambiare keyword o usare l'endpoint di raccomandazione.
import time, random
from curl_cffi import requests as cffi_requests
def scrape_temu_search(keyword, max_pages=10):
results = []
for page in range(1, max_pages + 1):
session_id = f"batch-{keyword}-{page // 5}"
proxy = f"http://user-country-US-session-{session_id}:PASSWORD@gate.proxyhat.com:8080"
sess = cffi_requests.Session(impersonate="chrome120")
sess.proxies = {"http": proxy, "https": proxy}
try:
resp = sess.get(
"https://www.temu.com/api/poppy/v1/search",
params={"keyword": keyword, "page": page, "pageSize": 50},
headers={"Referer": "https://www.temu.com/"},
timeout=30,
)
if resp.status_code == 200:
results.extend(resp.json().get("data", {}).get("list", []))
elif resp.status_code == 403:
# Ruota sessione e riprova una volta
session_id = f"retry-{keyword}-{page}-{int(time.time())}"
continue
except Exception as e:
print(f"Errore pagina {page}: {e}")
time.sleep(random.uniform(2, 5)) # Pausa umana
return results
Etica, Termini di Servizio e Quadro Legale
Lo scraping di dati pubblici del catalogo Temu (prezzi, titoli, immagini prodotto, specifiche) è generalmente considerato accettabile quando rispetta alcune linee guida:
- Solo dati pubblici del catalogo: non scrapeare account utente, recensioni personali con dati PII, o informazioni di pagamento.
- Rispetta
robots.txt: verifica che le sezioni target non siano disallow. Temu potrebbe bloccare/api/nel robots.txt — in tal caso, l'approccio HTML è più defensible. - Rate ragionevoli: non saturare i server. 50-100 richieste/minuto per IP è un volume che non impatta le performance del sito.
- CFAA e GDPR: negli Stati Uniti, il Computer Fraud and Abuse Act (18 U.S.C. § 1030) si applica all'accesso non autorizzato a sistemi protetti. Sebbene dati pubblici siano generalmente accessibili, bypassare misure tecniche di protezione (come Cloudflare) può creare un'area grigia legale. In Europa, il GDPR regolamenta i dati personali: i dati prodotto non sono personali, ma le recensioni degli utenti sì.
- Niente scraping di account: non usare credenziali utente per accedere a dati non pubblici. Questo viola quasi certamente i Termini di Servizio di Temu e può costituire accesso non autorizzato.
Se sei un merchant o un partner autorizzato, il feed merchant ufficiale di Temu (accessibile tramite il seller dashboard) fornisce dati prodotto strutturati senza necessità di scraping. Per price intelligence competitiva, invece, lo scraping rimane l'unica via.
Per approfondire le best practice di scraping etico, consulta la nostra guida sui casi d'uso di web scraping e SERP tracking. La documentazione tecnica completa di ProxyHat è disponibile su docs.proxyhat.com.
Key Takeaways
- Endpoint JSON > HTML parsing: gli endpoint
/api/poppy/v1/restituiscono dati strutturati stabili, mentre le classi CSS hashate cambiano ad ogni deploy. - curl_cffi è non negoziabile: il fingerprint TLS di
requestsstandard viene identificato da Temu in meno di 5 richieste. Usaimpersonate="chrome120"con curl_cffi. - Proxy residenziali con geo-target US sono obbligatori: i prezzi e le condizioni di spedizione variano per regione. IP datacenter vengono bloccati in 3-5 richieste.
- Sessioni sticky per coerenza: usa
-session-per mantenere lo stesso IP durante paginazione e monitoraggio carrello/spedizione. - L'header
anti_contentè il collo di bottiglia: estrailo con Playwright headless o reverse-engineering del JS offuscato. Senza di esso, le API restituiscono 403. - Etica prima di tutto: solo dati catalogo pubblici, niente scraping di account, rate ragionevoli, rispetto di robots.txt e consapevolezza del quadro CFAA/GDPR.
FAQ
Cos'è lo scraping di Temu e quali dati si possono estrarre?
Lo scraping di Temu è l'estrazione automatizzata di dati pubblici dal catalogo e-commerce di Temu: prezzi, titoli prodotto, specifiche SKU, disponibilità, immagini e costi di spedizione. Si può fare parsando l'HTML delle pagine prodotto o intercettando gli endpoint JSON interni come /api/poppy/v1/search e /api/poppy/v1/goods/detail. L'approccio JSON è preferibile per stabilità e struttura dei dati.
Perché lo scraping di Temu è importante per gli utenti di proxy?
Temu applica protezioni anti-bot aggressive — Cloudflare Turnstile, fingerprinting TLS/HTTP2 e header anti_content firmati — che bloccano gli IP datacenter in 3-5 richieste. I proxy residenziali con geo-target paese/città sono obbligatori per due motivi: bypassare il rilevamento IP datacenter e ottenere dati coerenti con la regione target, poiché prezzi e spedizione variano geograficamente.
Quale tipo di proxy funziona meglio per lo scraping di Temu?
I proxy residenziali rotanti con geo-target a livello di paese (es. -country-US) offrono il miglior rapporto costo/affidabilità, con success rate del 85-92%. Per detail page e sessioni di acquisto, i proxy residenziali sticky (-session-) raggiungono il 92-97% di successo. I proxy mobile 4G/5G sono ancora più affidabili (90-95%) ma costano $3-8/GB. I proxy datacenter non sono raccomandati: success rate inferiore al 10%.
Come evitare i blocchi quando si fa scraping di Temu?
Combina quattro strategie: (1) usa curl_cffi con impersonate="chrome120" per matchare il fingerprint TLS di Chrome reale; (2) proxy residenziali con geo-target US e rotazione per-request; (3) estrai l'header anti_content con Playwright headless prima di ogni batch; (4) mantieni rate sotto le 100 richieste/minuto per IP con pause random di 2-5 secondi. Su 403, ruota sessione e riprova con backoff esponenziale.
È legale fare scraping dei dati pubblici di Temu?
Lo scraping di dati catalogo pubblici (prezzi, titoli, specifiche) è generalmente considerato accettabile, ma ci sono caveati legali. Negli USA, il CFAA (18 U.S.C. § 1030) può applicarsi al bypass di misure tecniche di protezione. In Europa, il GDPR regola i dati personali ma non i dati prodotto. Evita di scrapeare account utente, recensioni con PII o dati non pubblici. Rispetta robots.txt e usa rate ragionevoli. Per dati autorizzati, considera il feed merchant ufficiale.






