Temu Produktdaten und Preise 2026 scrapen: API vs. HTML
Temu bietet keine offizielle öffentliche API an. Wer Temu Produktdaten und Preise 2026 scrapen möchte, steht vor einer grundlegenden Entscheidung: Sollen die volatilen HTML-Karten der Produktseiten geparst werden, oder ist es besser, die internen JSON-Endpunkte wie /api/poppy/v1/search und /api/poppy/v1/goods-detail direkt anzusteuern? Beide Ansätze haben spezifische Vor- und Nachteile, und die Wahl bestimmt, wie viel Engineering-Aufwand und Proxy-Infrastruktur Sie benötigen.
HTML-Parsing ist einfacher zu implementieren – Sie laden die Seite, extrahieren die DOM-Elemente und fertig. Aber Temu ändert seine CSS-Klassennamen (gehashte Klassen wie a3f2b1) regelmäßig, und schon ein kleines Frontend-Update kann alle Ihre Selektoren brechen. Die JSON-Endpunkte liefern hingegen strukturierte Daten mit Feldern wie goods_id, goods_price und sku_list, sind aber durch mehrere Anti-Bot-Schichten geschützt. Für einen robusten Temu Preis-Scraper ist der JSON-Weg langfristig stabiler, erfordert jedoch mehr Aufwand bei der Token-Generierung und Fingerprint-Verwaltung.
In diesem Guide zeigen wir Ihnen, wie Sie beide Ansätze mit Web-Scraping-Best Practices und Residential Proxies von ProxyHat kombinieren, um zuverlässig Temu Produktdaten zu extrahieren.
Temus Anti-Bot-Stack: Cloudflare, Token und TLS-Fingerprinting
Bevor wir in den Code einsteigen, müssen wir verstehen, was uns im Weg steht. Temu setzt mehrere Anti-Bot-Technologien gleichzeitig ein:
- Cloudflare Turnstile: Ein reaktionsschnelles CAPTCHA-System, das Browser-Fingerabdrücke, Verhaltenssignale und TLS-Eigenschaften prüft. Es ersetzt klassische CAPTCHAs, ist aber für Headless-Browser oft schwer zu passieren. Details finden Sie in den offiziellen Cloudflare Turnstile Docs.
- Der
anti_content-Header: Ein signiertes Token, das clientseitig generiert wird und verschlüsselte Beweise über die Browser-Umgebung enthält. Ohne gültigesanti_contentliefern die JSON-Endpunkte nur Fehler oder leere Ergebnisse. - TLS/HTTP2-Fingerprinting: Temu prüft den JA3/JA4-Fingerabdruck der TLS-Verbindung. Standard-Python-Bibliotheken wie
requestshaben einen abweichenden Fingerprint, der sofort als Bot erkannt wird. - Datacenter-IP-Blockierung: Anfragen von bekannten Rechenzentren (AWS, GCP, Hetzner) werden oft bereits auf Netzwerkebene blockiert, bevor sie überhaupt die Anwendung erreichen.
Dieser mehrschichtige Ansatz bedeutet, dass ein einfacher requests.get()-Aufruf von einer Datacenter-IP fast immer fehlschlägt. Sie benötigen sowohl eine Browser-ähnliche TLS-Signatur als auch Residential IPs, um überhaupt in die Nähe der Daten zu gelangen.
Daten lokalisieren: __NEXT_DATA__, JSON-Endpunkte und CSS-Selektoren
Wenn Sie sich entscheiden, Temu zu scrapen, gibt es drei Hauptorte, an denen Produktdaten zu finden sind:
1. Das eingebettete State-Blob
Temu nutzt ein Next.js-ähnliches Framework. Die Produktseite enthält ein <script id="__NEXT_DATA__">-Tag (oder eine ähnliche Struktur wie window.__INITIAL_STATE__), in dem die gesamten Produktdaten als JSON serialisiert sind. Dieser Ansatz ist einfacher als API-Aufrufe, da Sie nur eine einzige Seite laden müssen:
from bs4 import BeautifulSoup
import json, re
html = response.text
soup = BeautifulSoup(html, 'html.parser')
script = soup.find('script', {'id': '__NEXT_DATA__'})
if script:
data = json.loads(script.string)
product = data['props']['pageProps']['goods']
print(product['goods_id'], product['goods_price'])
Die Struktur variiert je nach Temu-Version, aber typische Pfade sind props.pageProps.goods oder props.pageProps.initialState.goods.
2. Die JSON-API-Endpunkte
Hinter dem Produktlisting-Grid stecken zwei wichtige Endpunkte:
/api/poppy/v1/search– Suchergebnisse mit Paginierung, Preisen und Basis-SKU-Informationen/api/poppy/v1/goods-detail– Vollständige Produktdetails inklusive SKU-Matrix, Versandkosten und Bewertungen
Diese Endpunkte erwarten POST-Requests mit einem JSON-Body, der goods_id oder Suchparameter enthält, sowie den anti_content-Header. Die Antwort ist sauberes JSON – kein HTML-Parsing nötig.
3. CSS-Selektoren als Fallback
Wenn die obigen Methoden fehlschlagen, können Sie auf DOM-Selektoren zurückgreifen. Temu verwendet gehashte CSS-Klassen, aber einige Attribute bleiben stabil:
[data-uniqid]– eindeutige Produkt-IDs im DOM[data-pid]– Produkt-IDs auf Kachelnspan[data-price]– Preis-Elemente (Attribut-basiert, stabiler als Klassen)
Eine XPath-Alternative für den Preis: //span[contains(@class,'price')]/text() – aber beachten Sie, dass Temu Preise manchmal in data-price-Attributen statt in Textknoten speichert.
Rate-Limits und Proxy-Strategie: Warum Residential Proxies Pflicht sind
Temu schränkt Anfragen pro IP aggressiv ein. Aus Tests und Community-Beobachtungen ergeben sich folgende ungefähre Schwellenwerte:
- Etwa 5–10 Anfragen pro Minute pro IP, bevor Rate-Limiting einsetzt (HTTP 429 oder leere Antworten)
- Nach ca. 50 Anfragen in kurzer Folge kann die IP vorübergehend gesperrt werden
- Preise und Versandkosten variieren nach Region – ein Produkt, das in den USA $9,99 kostet, kann in Deutschland €14,99 anzeigen
Dieser letzte Punkt ist entscheidend: Wenn Sie Temu Produktdaten für Preisvergleichszwecke scrapen, müssen Sie die Geo-Location kontrollieren. Ein Temu Produktdaten API-Ansatz mit Datacenter-Proxies liefert nicht nur falsche Preise, sondern wird auch schnell blockiert.
| Eigenschaft | Residential Proxies | Datacenter Proxies | Mobile Proxies |
|---|---|---|---|
| Erfolgsquote bei Temu | 95–99% | 10–30% | 98–99% |
| Latenz | 200–800ms | 50–150ms | 500–2000ms |
| Anti-Bot-Durchlässigkeit | Hoch | Niedrig (sofort erkannt) | Sehr hoch |
| Kosten | Mittel | d>Niedrig | Hoch |
| Geo-Targeting | Land + Stadt | Land (begrenzt) | Land + Stadt |
Für Temu-Scraping sind Residential Proxies mit Stadt-Level-Geo-Targeting der beste Kompromiss aus Kosten und Zuverlässigkeit. ProxyHat bietet über 190 Länder mit Stadt-Level-Targeting an.
Python-Implementierung: curl_cffi mit ProxyHat
Um Temus TLS-Fingerprinting zu umgehen, verwenden wir curl_cffi – eine Python-Bibliothek, die libcurl mit Browser-ähnlichen TLS-Signaturen nutzt. Kombiniert mit ProxyHat Residential Proxies erhalten wir eine Lösung, die sowohl auf Netzwerk- als auch auf Protokollebene unauffällig bleibt.
Schritt 1: curl-Befehl zum Testen
curl -x http://user-country-US:pass@gate.proxyhat.com:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
-H "Accept-Language: en-US,en;q=0.9" \
"https://www.temu.com/products/901234567.html"
Dieser Befehl nutzt einen US-Residential-Proxy von ProxyHat. Die -country-US-Flag im Benutzernamen stellt sicher, dass die Anfrage von einer US-IP ausgeht und US-Preise zurückgegeben werden.
Schritt 2: Python mit curl_cffi und ProxyHat
from curl_cffi import requests as cffi_requests
import json, re, time, random
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/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/",
}
def fetch_product(goods_id: str) -> dict:
url = f"https://www.temu.com/products/{goods_id}.html"
response = cffi_requests.get(
url,
headers=headers,
proxies={"http": PROXY, "https": PROXY},
impersonate="chrome120",
timeout=30,
)
response.raise_for_status()
# __NEXT_DATA__ aus HTML extrahieren
match = re.search(
r'<script[^>]*id="__NEXT_DATA__"[^>]*>(.*?)</script>',
response.text,
re.DOTALL
)
if match:
data = json.loads(match.group(1))
return data.get("props", {}).get("pageProps", {})
return {}
result = fetch_product("901234567")
print(json.dumps(result, indent=2, ensure_ascii=False)[:500])
Beispiel-Antwort (gekürzt)
{
"goods": {
"goods_id": "901234567",
"goods_name": "Wireless Earbuds Pro Max",
"goods_price": {
"amount": 12.99,
"currency": "USD",
"original_price": 29.99
},
"sku_list": [
{"sku_id": "sku_001", "spec": "Black", "price": 12.99, "stock": 832},
{"sku_id": "sku_002", "spec": "White", "price": 13.49, "stock": 421}
],
"shipping_info": {
"free_shipping": true,
"estimated_days": "7-12"
},
"store_id": "store_45678",
"rating": 4.7,
"review_count": 15432
}
}
Diese gekürzte Antwort zeigt die wichtigsten Felder: goods_id, goods_price mit Original- und Aktualpreis, die sku_list mit Varianten und Bestand, sowie Versandinformationen. Beachten Sie, dass die tatsächliche Struktur je nach Produktkategorie variieren kann.
Sticky Sessions, Retries und Paginierung
Für fortgeschrittenes Temu scrape-Verhalten – insbesondere wenn Sie mehrere Seiten eines Produkts durchblättern oder Warenkorb-/Versanddaten abrufen – müssen Sie sticky Sessions verwenden. Ohne sticky Session rotiert die IP bei jeder Anfrage, was dazu führt, dass Temu die Anfragen als verdächtig einstuft, da ein einzelner Nutzer normalerweise nicht aus 50 verschiedenen Städten in 30 Sekunden zugreift.
from curl_cffi import requests as cffi_requests
import time, random
SESSION_ID = "temu-session-abc123"
PROXY = f"http://user-country-US-session-{SESSION_ID}:pass@gate.proxyhat.com:8080"
def fetch_with_retry(url: str, max_retries: int = 3) -> cffi_requests.Response:
for attempt in range(max_retries):
try:
response = cffi_requests.get(
url,
headers=headers,
proxies={"http": PROXY, "https": PROXY},
impersonate="chrome120",
timeout=30,
)
if response.status_code == 200:
return response
elif response.status_code == 429:
wait = 2 ** attempt + random.uniform(1, 3)
print(f"Rate-limited, warte {wait:.1f}s")
time.sleep(wait)
else:
print(f"HTTP {response.status_code}, Retry {attempt + 1}")
time.sleep(2)
except Exception as e:
print(f"Fehler: {e}, Retry {attempt + 1}")
time.sleep(3)
raise Exception(f"Fehlgeschlagen nach {max_retries} Versuchen")
def scrape_search_results(query: str, max_pages: int = 5):
results = []
for page in range(1, max_pages + 1):
url = f"https://www.temu.com/search?q={query}&page={page}"
resp = fetch_with_retry(url)
# Parse __NEXT_DATA__ wie oben
# ... Ergebnisse sammeln
results.append(resp)
time.sleep(random.uniform(2, 5)) # Menschliche Verzögerung
return results
Die -session-{SESSION_ID}-Flag im ProxyHat-Benutzernamen stellt sicher, dass alle Anfragen innerhalb der Session von derselben IP ausgehen. Das ist besonders wichtig für:
- Warenkorb- und Versanddaten: Preise können sich ändern, wenn die IP zwischen Anfragen wechselt
- Paginierung: Suchergebnisse sind oft session-spezifisch
- Produktempfehlungen: Personalisierte Empfehlungen basieren auf der Session-Historie
Eine neue Session-ID für jeden Scraper-Prozess zu generieren (z. B. uuid4) verhindert, dass Temu Muster über mehrere Runs hinweg erkennt. Die ProxyHat-Dokumentation enthält weitere Details zu Session-Management und Geo-Targeting-Optionen.
Ethik und AGB: Was Sie dürfen und was nicht
Beim Scraping von Temu – oder jeder anderen E-Commerce-Plattform – müssen Sie rechtliche und ethische Grenzen beachten:
- Nur öffentliche Katalogdaten: Scrapen Sie nur Daten, die ohne Login öffentlich sichtbar sind. Keine Account-spezifischen Preise, keine Bestelldaten, keine persönlichen Nutzerprofile.
- CFAA und GDPR: In den USA fällt unbefugtes Scraping unter den Computer Fraud and Abuse Act, wenn es gegen die Nutzungsbedingungen verstößt. In der EU greift die DSGVO, wenn personenbezogene Daten verarbeitet werden.
- Kein Account-Scraping: Das Scrapen von Nutzerkonten, Bestellhistorie oder privaten Nachrichten ist ein klarer Verstoß gegen die AGB und potenziell illegal.
- Offizielle Händler-Feeds bevorzugen: Wenn Sie ein Temu-Händler sind, nutzen Sie die offizielle Temu Produktdaten API über das Händler-Dashboard, anstatt die öffentliche Seite zu scrapen. Diese API ist stabil, dokumentiert und legal.
- Rate-Limits respektieren: Auch wenn Sie Proxies verwenden, um Blocks zu umgehen, sollten Sie menschenähnliche Anfrage-Raten einhalten. 1–2 Anfragen pro Sekunde pro Session ist ein vernünftiges Limit.
Wenn Sie SERP-Tracking oder Preisüberwachung für legitime Geschäftszwecke betreiben, ist das Scrapen öffentlicher Katalogdaten in den meisten Gerichtsbarkeiten zulässig – solange Sie keine Server überlasten und keine personenbezogenen Daten sammeln.
Key Takeaways
Zusammenfassung der wichtigsten Punkte:
- Temu hat keine öffentliche API – wählen Sie zwischen HTML-Parsing (fragil) und JSON-Endpunkten (stabil, aber Anti-Bot-geschützt).
- Der
anti_content-Token und TLS-Fingerprinting sind die größten Hürden.curl_cffimitimpersonatelöst das TLS-Problem.- Residential Proxies mit Stadt-Level-Geo-Targeting sind Pflicht – Datacenter-IPs werden sofort blockiert und Preise variieren nach Region.
- Sticky Sessions (
-session-) sind unerlässlich für konsistente Preis- und Versanddaten über mehrere Anfragen hinweg.- Exponential Backoff bei HTTP 429 und menschenähnliche Verzögerungen (2–5 Sekunden) halten Sie unter dem Rate-Limit-Radar.
- Scrapen Sie nur öffentliche Katalogdaten, respektieren Sie AGB und DSGVO, und ziehen Sie die offizielle Händler-API in Betracht, wenn verfügbar.
Bereit, Temu Produktdaten zu scrapen? Starten Sie mit ProxyHat Residential Proxies und testen Sie den Code oben mit Ihren eigenen ProxyHat-Zugangsdaten. Mit 99,2% Erfolgsquote bei Residential IPs und Stadt-Level-Geo-Targeting in über 190 Ländern haben Sie die Infrastruktur, die Sie für zuverlässige Preisüberwachung benötigen.






