Jak scrapować Temu w 2026: API vs HTML i dlaczego to wcale nie jest proste
Temu nie udostępnia publicznego API do pobierania danych o produktach i cenach. Jeśli chcesz zbudować Temu price scraper lub agregator danych katalogowych, masz dwie drogi: parsować niestabilny kod HTML kart produktowych albo odwoływać się do wewnętrznych endpointów JSON, które napędzają siatkę listingów. Ta druga opcja — Temu product data API w postaci nieudokumentowanych ścieżek takich jak /api/poppy/v1/search czy /api/poppy/v1/goods/detail — jest znacznie wydajniejsza, ale wymaga odtworzenia nagłówka anti_content, podpisanego tokena, który Temu sprawdza po stronie serwera.
W tym artykule pokazujemy krok po kroku, jak scrapować dane produktów i cen z Temu w 2026 roku, używając proxy residential z geo-targetingiem na poziomie miasta, biblioteki curl_cffi do odtworzenia sygnatury TLS/HTTP2 oraz sesji sticky dla spójności koszyka i kosztów wysyłki.
Stack anti-bot Temu — co Cię blokuje i dlaczego
Temu korzysta z wielowarstwowego systemu ochrony, który łączy co najmniej trzy technologie:
- Cloudflare Turnstile — challenge weryfikujący, czy ruch pochodzi od prawdziwej przeglądarki. Pojawia się przy podejrzanym wzorcu żądań, zwłaszcza z adresów IP z centrów danych. Temu integruje Turnstile zarówno na stronach produktów, jak i przy wyszukiwaniu. Dokumentacja Cloudflare Turnstile opisuje mechanizm weryfikacji tokena po stronie serwera.
- Nagłówek
anti_content— podpisany, base64-kodowany token generowany przez JavaScript po stronie klienta. Zawiera m.in. timestamp, sygnaturę przeglądarki i hash parametrów żądania. Bez poprawnegoanti_contentendpointy JSON zwracają błąd"errorCode": 30000lub puste wyniki. - TLS/HTTP2 fingerprinting — Temu sprawdza sygnaturę handshake'u TLS (JA3/JA4) oraz ustawienia strumieni HTTP/2. Klasyczne biblioteki takie jak
requestsczyurllibmają sygnaturę różną od Chrome czy Firefox, co pozwala serwerowi odróżnić automat od przeglądarki już na poziomie transportu, zanim żądanie dotrze do warstwy aplikacji.
Dane z adresów IP datacenter są flagowane niemal natychmiast — Temu utrzymuje listy zakresów ASN powiązanych z dostawcami chmurowymi i hostingowymi. Ruch z takich IP dostaje challenge Cloudflare lub HTTP 403 już przy pierwszym żądaniu.
Gdzie znaleźć dane: endpointy JSON i osadzony stan strony
Mimo że Temu renderuje karty produktów w HTML, rzeczywiste dane — cena, SKU, dostępność, opcje wysyłki — pochodzą z wewnętrznych endpointów JSON. Oto główne źródła danych, które warto znać:
1. Endpoint wyszukiwania: /api/poppy/v1/search
Zwraca listę produktów dla danego zapytania. Przykładowy URL:
https://www.temu.com/api/poppy/v1/search?q=bluetooth+earbuds&page=1&pageSize=50
Odpowiedź zawiera tablicę obiektów items z polami takimi jak goods_id, goods_name, salePrice, marketPrice, imageList i rating. Endpoint wymaga nagłówka anti_content oraz poprawnych ciasteczek sesyjnych.
2. Endpoint szczegółów produktu: /api/poppy/v1/goods/detail
Zwraca pełne dane pojedynczego produktu, w tym listę wariantów SKU, specyfikacje, opinie i opcje wysyłki. Przykładowe wywołanie:
POST https://www.temu.com/api/poppy/v1/goods/detail
Content-Type: application/json
{"goodsId": "502099882377"}
3. Osadzony stan __NEXT_DATA__ w HTML
Strony produktów i listingów Temu zawierają tag <script id="__NEXT_DATA__" type="application/json"> z pełnym stanem aplikacji w momencie renderowania po stronie serwera. To najszybsze źródło danych, jeśli nie chcesz odtwarzać anti_content — wystarczy jedno żądanie GET do strony HTML i parsowanie JSON z tego tagu.
Klasy CSS w HTML Temu są hashowane (np. _3a8d2f1), co utrudnia selektory oparte na nazwach klas. Zamiast tego używaj atrybutów data-uniqid lub struktury DOM (np. [data-uniqid] > div:nth-child(2)), a jeszcze lepiej — sięgaj po __NEXT_DATA__.
Przykładowa (skrócona) odpowiedź JSON z endpointu goods/detail
{
"goods_id": "502099882377",
"goods_name": "Wireless Bluetooth Earbuds Pro",
"salePrice": {"amount": 12.98, "currency": "USD"},
"marketPrice": {"amount": 29.99, "currency": "USD"},
"skuList": [
{"skuId": "sku_001", "spec": "Black", "price": 12.98, "stock": 3421},
{"skuId": "sku_002", "spec": "White", "price": 13.49, "stock": 1280}
],
"shipping": {"freeThreshold": 0, "estimatedDays": "7-12"},
"rating": 4.6,
"reviewCount": 18453
}
Rate-limity i dlaczego proxy residential z geo-targetingiem są obowiązkowe
Temu nie publikuje oficjalnych limitów żądań, ale testy empiryczne pokazują następujące progi:
- ~30 żądań/min z jednego IP do endpointów JSON — po tym progu pojawia się HTTP 429 lub challenge Turnstile.
- ~100 żądań/min z jednego IP do stron HTML — tutaj tolerancja jest wyższa, ale przy 150+ żądań/min zaczynają się blokady.
- Adresy IP datacenter otrzymują challenge przy 3-5 żądaniach, niezależnie od tempa.
Kluczowym powodem, dla którego musisz używać proxy residential z geo-targetingiem, jest regionalizacja cen i wysyłki. Temu pokazuje różne ceny, progi darmowej wysyłki i czasy dostawy w zależności od lokalizacji użytkownika. Jeśli Twój IP wskazuje Niemcy, zobaczysz ceny w EUR i opcje wysyłki europejskiej. Jeśli IP wskazuje USA — ceny w USD i dostawę z magazynów amerykańskich.
Dla spójności danych musisz więc przypiąć sesję proxy do konkretnego kraju, a najlepiej miasta. ProxyHat obsługuje to przez flagi w nazwie użytkownika:
# Proxy HTTP z geo-targetingiem na USA
http://user-country-US:pass@gate.proxyhat.com:8080
# Proxy HTTP z geo-targetingiem na Berlin, Niemcy
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080
Sprawdź dostępne lokalizacje na stronie lokalizacji ProxyHat i porównaj plany na stronie cennika.
| Typ proxy | Wykrywalność przez Temu | Geo-targeting | Stabilność sesji | Średni czas odpowiedzi |
|---|---|---|---|---|
| Datacenter | Bardzo wysoka — blokada po 3-5 żądaniach | Tylko kraj | Niska | ~50ms |
| Residential (rotacyjne) | Niska — wygląda jak ruch domowy | Kraj + miasto | Średnia (nowy IP co żądanie) | ~200-500ms |
| Residential (sticky session) | Niska | Kraj + miasto | Wysoka (ten sam IP dla sesji) | ~200-500ms |
| Mobile | Bardzo niska — IP operatorów komórkowych | Kraj | Średnia | ~300-800ms |
Praktyczna implementacja: Python + curl_cffi + ProxyHat
Oto kompletny przykład pobierania strony produktu Temu z odtworzeniem sygnatury TLS Chrome i routingiem przez proxy residential ProxyHat. Używamy curl_cffi, biblioteki, która korzysta z libcurl-impersonate do odtworzenia handshake'u TLS i ustawień HTTP/2 identycznych z Chrome.
from curl_cffi import requests as cffi_requests
import json
import re
# Konfiguracja proxy ProxyHat — residential, geo USA
PROXY_URL = "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/131.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",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://www.temu.com/",
}
def fetch_temu_product(goods_id: str, session_id: str = None):
"""Pobiera stronę produktu Temu i wyciąga dane z __NEXT_DATA__."""
url = f"https://www.temu.com/goods/{goods_id}.html"
# Sticky session dla spójności ceny/wysyłki
proxy = PROXY_URL
if session_id:
proxy = proxy.replace("user-", f"user-session-{session_id}-")
proxies = {"http": proxy, "https": proxy}
resp = cffi_requests.get(
url,
headers=HEADERS,
proxies=proxies,
impersonate="chrome131",
timeout=30,
)
if resp.status_code == 403:
raise Exception("Cloudflare challenge — wymaga rotacji IP lub pauzy")
if resp.status_code == 429:
raise Exception("Rate limit — zmniejsz tempo lub zwiększ pulę IP")
# Parsuj __NEXT_DATA__
match = re.search(
r'<script id="__NEXT_DATA__" type="application/json">(.+?)</script>',
resp.text,
re.DOTALL,
)
if not match:
raise Exception("Nie znaleziono __NEXT_DATA__ — struktura strony mogła się zmienić")
data = json.loads(match.group(1))
goods = data.get("props", {}).get("pageProps", {}).get("goods", {})
return {
"goods_id": goods.get("goods_id"),
"goods_name": goods.get("goods_name"),
"sale_price": goods.get("salePrice", {}).get("amount"),
"currency": goods.get("salePrice", {}).get("currency"),
"sku_list": [
{"sku_id": s.get("skuId"), "spec": s.get("spec"), "price": s.get("price")}
for s in goods.get("skuList", [])
],
"rating": goods.get("rating"),
"review_count": goods.get("reviewCount"),
}
# Przykład użycia
result = fetch_temu_product("502099882377", session_id="temu-prod-001")
print(json.dumps(result, indent=2, ensure_ascii=False))
Powyższy kod zwraca skrócony obiekt z danymi produktu. Przykładowy wynik:
{
"goods_id": "502099882377",
"goods_name": "Wireless Bluetooth Earbuds Pro",
"sale_price": 12.98,
"currency": "USD",
"sku_list": [
{"sku_id": "sku_001", "spec": "Black", "price": 12.98},
{"sku_id": "sku_002", "spec": "White", "price": 13.49}
],
"rating": 4.6,
"review_count": 18453
}
Sesje sticky, retre i paginacja
Podczas scrapowania Temu napotkasz dwa wyzwania związane z sesjami:
Sticky sessions dla spójności koszyka i wysyłki
Jeśli pobierasz dane o kosztach wysyłki lub sprawdzasz dostępność SKU dla konkretnej lokalizacji, musisz utrzymywać ten sam adres IP przez całą sesję. Bez tego Temu może zwracać różne ceny wysyłki w zależności od tego, jaki IP obsłużył poprzednie żądanie. ProxyHat pozwala przypiąć sesję przez flagę -session-:
# Sticky session — ten sam IP przez całą sesję
http://user-session-temu-prod-001-country-US:pass@gate.proxyhat.com:8080
Sesja utrzymuje ten sam IP residential przez zazwyczaj 10-30 minut, zależnie od dostępności w danej lokalizacji. Po wygaśnięciu sesji ProxyHat automatycznie przydziela nowy IP z tego samego regionu.
Retre z backoffem wykładniczym
Nawet z proxy residential, około 2-5% żądań do Temu kończy się błędem 429 lub challenge Turnstile. Implementuj retre z backoffem wykładniczym:
import time
import random
def fetch_with_retry(url, max_retries=5, base_delay=2.0):
for attempt in range(max_retries):
try:
result = fetch_temu_product(url)
return result
except Exception as e:
if attempt == max_retries - 1:
raise
delay = base_delay * (2 ** attempt) + random.uniform(0, 1)
print(f"Retry {attempt + 1}/{max_retries} po {delay:.1f}s: {e}")
time.sleep(delay)
Paginacja listingu
Endpoint wyszukiwania /api/poppy/v1/search obsługuje parametry page i pageSize. Maksymalna wartość pageSize to 50. Przy 10 stronach otrzymasz 500 produktów na zapytanie. Utrzymuj tempo nie wyższe niż 1 strona na 2-3 sekundy z jednego IP, aby nie przekroczyć progu 30 żądań/min.
Etyka, warunki korzystania i aspekty prawne
Scrapowanie Temu — jak każdego serwisu e-commerce — wiąże się z kwestiami prawnymi i etycznymi. Oto kluczowe zasady, których powinieneś przestrzegać:
- Scrapuj tylko publiczny katalog — dane o produktach, cenach i dostępności, które są widoczne bez logowania. Nie scrapuj danych kontowych, historii zamówień ani panelu sprzedawcy.
- Przestrzegaj robots.txt — sprawdź
https://www.temu.com/robots.txtprzed rozpoczęciem i szanuj regułyDisallow. - CFAA i GDPR — w USA Computer Fraud and Abuse Act (18 U.S.C. § 1030) może mieć zastosowanie do scrapowania, które omija mechanizmy autoryzacji. W UE RODO (GDPR) chroni dane osobowe — jeśli zbierasz opinie użytkowników zawierające identyfikowalne informacje, musisz mieć podstawę prawną.
- Nie omijaj płatnych ścian ani logowania — jeśli dane są dostępne tylko po zalogowaniu, ich scrapowanie bez konta narusza warunki korzystania z serwisu.
- Rozważ oficjalny merchant feed — jeśli jesteś sprzedawcą na Temu, platforma udostępnia kanał danych produktowych przez panel sprzedawcy. To legalna i stabilna alternatywa dla scrapowania.
Kluczowa zasada: scrapuj dane publicznego katalogu w tempie, które nie zakłóca działania serwisu, używaj proxy residential do symulacji realnego ruchu i nigdy nie zbieraj danych osobowych bez podstawy prawnej.
Najczęstsze błędy i przypadki brzegowe
- Parsowanie hashowanych klas CSS — klasy takie jak
_3a8d2f1zmieniają się przy każdym deployu. Zamiast tego używaj__NEXT_DATA__lub atrybutówdata-uniqid. - Ignorowanie regionalizacji cen — jeśli używasz rotacyjnych IP bez geo-targetingu, dostaniesz mieszankę cen w EUR, USD i GBP. Przypnij sesję do kraju.
- Zbyt wysokie tempo z jednego IP — nawet residential IP dostaje 429 przy 30+ żądaniach/min. Rozprosz ruch na wiele sesji.
- Brak odtworzenia TLS fingerprint —
requestsz proxy residential nadal zostanie rozpoznany przez TLS fingerprinting. Używajcurl_cffizimpersonate="chrome131". - Nieaktualny
anti_content— jeśli korzystasz z endpointów JSON, tokenanti_contentma krótki TTL (zazwyczaj kilka minut). Generuj go fresh dla każdej sesji.
Konfiguracja ProxyHat dla scrapowania Temu
ProxyHat oferuje proxy residential, mobile i datacenter z geo-targetingiem na poziomie kraju i miasta. Dla scrapowania Temu zalecamy wyłącznie residential z geo-targetingiem. Oto szybka konfiguracja:
# HTTP — residential, USA, sticky session
http://user-session-temu-batch01-country-US:pass@gate.proxyhat.com:8080
# SOCKS5 — residential, Niemcy, Berlin
socks5://user-country-DE-city-berlin:pass@gate.proxyhat.com:1080
Szczegółową dokumentację techniczną znajdziesz na docs.proxyhat.com. Więcej przypadków użycia w kontekście scrapowania opisujemy na stronie web scraping oraz SERP tracking.
Kluczowe wnioski (Key Takeaways)
- Wybierz JSON nad HTML — osadzony
__NEXT_DATA__i endpointy/api/poppy/v1/są stabilniejsze niż parsowanie kart HTML z hashowanymi klasami CSS. - Odtwarzaj TLS fingerprint — używaj
curl_cffizimpersonate="chrome131", aby ominąć TLS/HTTP2 fingerprinting Temu. - Geo-targeting jest obowiązkowy — ceny i wysyłka różnią się w zależności od regionu. Przypnij proxy do kraju (np.
-country-US) i miasta. - Sticky sessions dla spójności — używaj flagi
-session-dla operacji wymagających tego samego IP (koszyk, wysyłka, paginacja). - Tempo ma znaczenie — utrzymuj max 30 żądań/min do JSON i max 100 żądań/min do HTML z jednego IP. Implementuj retre z backoffem.
- Scrapuj tylko publiczny katalog — przestrzegaj robots.txt, CFAA i GDPR. Jeśli jesteś sprzedawcą, rozważ oficjalny merchant feed.
FAQ
Czym jest scrapowanie danych produktów i cen z Temu w 2026?
To proces automatycznego pobierania publicznie dostępnych danych katalogowych z platformy Temu — nazw produktów, cen, list SKU, ocen i opcji wysyłki — przy użyciu skryptów i proxy residential. W 2026 roku wymaga odtworzenia sygnatury TLS przeglądarki, generowania nagłówka anti_content dla endpointów JSON oraz geo-targetingu proxy, ponieważ Temu regionalizuje ceny i koszty wysyłki w zależności od lokalizacji IP.
Dlaczego proxy residential są kluczowe dla scrapowania Temu?
Temu flaguje adresy IP z centrów danych niemal natychmiast — ruch z takich IP dostaje challenge Cloudflare Turnstile lub HTTP 403 po 3-5 żądaniach. Proxy residential używa adresów domowych ISP, które wyglądają jak ruch realnych użytkowników. Dodatkowo geo-targeting na poziomie kraju i miasta zapewnia, że pobierane ceny i opcje wysyłki są spójne z wybranym rynkiem, co jest kluczowe dla price intelligence.
Który typ proxy działa najlepiej do scrapowania Temu?
Residential proxy z geo-targetingiem na poziomie kraju i sticky session. Datacenter proxy są blokowane po kilku żądaniach. Mobile proxy mają bardzo niską wykrywalność, ale wyższą latencję (300-800ms) i nie wspierają geo-targetingu na poziomie miasta. Residential z flagą -country-US i -session- oferuje najlepszy balans między niewykrywalnością, stabilnością sesji i precyzją geolokalizacji.
Jak unikać blokad podczas scrapowania Temu?
Używaj curl_cffi z impersonate Chrome, aby odtworzyć sygnaturę TLS/HTTP2. Utrzymuj tempo max 30 żądań/min do endpointów JSON i max 100 żądań/min do stron HTML z jednego IP. Implementuj retre z backoffem wykładniczym (2s, 4s, 8s, 16s). Rozprosz ruch na wiele sesji sticky z różnymi IP residential. Generuj świeży token anti_content dla każdej sesji i zawsze dołączaj poprawne nagłówki Accept-Language zgodne z geo-lokalizacją proxy.
Czy scrapowanie Temu jest legalne?
Scrapowanie publicznie dostępnego katalogu bez logowania jest ogólnie legalne, ale zależy od jurysdykcji i interpretacji CFAA w USA oraz GDPR w UE. Należy przestrzegać robots.txt, nie omijać mechanizmów autoryzacji, nie zbierać danych osobowych bez podstawy prawnej i nie zakłócać działania serwisu. Jeśli jesteś sprzedawcą na Temu, oficjalny merchant feed jest bezpieczniejszą alternatywą. Skonsultuj się z prawnikiem przed uruchomieniem operacji scrapowania na skalę produkcyjną.






