Shein 2026 scrapen: API-Endpunkte vs. gerendertes HTML
Wer Shein 2026 scrapen will, steht vor einer grundlegenden Entscheidung: Soll man die gerenderte HTML-Seite parsen oder direkt Sheins interne JSON-API-Endpunkte ansprechen? Die Antwort bestimmt über Erfolg, Geschwindigkeit und Skalierbarkeit Ihres Shein Produkt Scraper-Projekts. In den meisten Fällen ist der API-Weg überlegen – aber er ist auch schwerer zugänglich.
Shein betreibt eine hochgradig dynamische Single-Page-Architektur. Die Produktseite unter shein.com/Product-p-goods_id.html lädt beim ersten Aufruf ein riesiges JSON-Blob namens productIntroData (manchmal auch gbProductDetail) in ein Inline-<script>-Tag. Dieses Blob enthält alle relevanten Shein Preisdaten: retailPrice, salePrice, skuList mit Bestandsinformationen, Farboptionen, Größen und Währungen. Parsen Sie das HTML, müssen Sie dieses JSON aus dem DOM extrahieren. Greifen Sie auf die API zu, erhalten Sie dasselbe JSON direkt – ohne HTML-Overhead.
Die internen Endpunkte folgen Mustern wie:
https://www.shein.com/api/productInfo?goods_id=12345678&country=US
https://www.shein.com/category/api/getCategoryList?cat_id=2030&page=1&limit=40
Der HTML-Weg ist einfacher zu starten, aber langsamer (jede Seite ~1,5–3 MB) und fehleranfälliger bei Layoutänderungen. Der API-Weg ist schneller (~50–200 KB pro Antwort), stabiler und besser für Massen-Extraktion geeignet. Der Haken: Shein schützt diese Endpunkte aggressiv.
Sheins Anti-Bot-Stack: Akamai Bot Manager und smdeviceid
Shein setzt auf Akamai Bot Manager – einen der anspruchsvollsten Bot-Schutzsysteme auf dem Markt. Wenn Sie Shein scrapen, kämpfen Sie nicht gegen einfache Rate-Limits, sondern gegen Verhaltensanalyse, TLS-Fingerprinting und Device-Telemetrie.
Das _abck-Cookie und bm_sz
Akamai setzt beim ersten Seitenaufruf ein _abck-Cookie sowie ein bm_sz-Cookie. Das _abck-Cookie wird durch JavaScript-Sensor-Telemetrie validiert. Der Akamai-Sensor (sensor_data) sammelt Browsereigenschaften: Canvas-Fingerprint, WebGL-Renderer, installierte Schriftarten, Mausbewegungsmuster, Touch-Events und über 100 weitere Signale. Nur wenn dieser Sensor gültige Daten liefert, wird _abck von einem vorläufigen in einen gültigen Zustand überführt – erkennbar an der fehlenden ~-1~-Signatur im Cookiewert.
Warum headless Chrome allein scheitert: Standard-Puppeteer- oder Playwright-Instanzen mit Standard-TLS-Fingerprints und Default-User-Agents werden von Akamai zuverlässig erkannt. Die navigator.webdriver-Eigenschaft, fehlende Plugin-Arrays und ungewöhnliche Canvas-Hashs sind sofortige Blockade-Gründe. Sie erhalten HTTP 403 oder – schlimmer – HTTP 412 mit einem leeren Body, der nur den Refresh des _abck-Cookies erzwingt.
smdeviceid – der Geräte-Token
Shein verwendet zusätzlich einen smdeviceid-Header oder -Cookie, der eine gerätebasierte Identifikation ermöglicht. Dieser Token wird clientseitig generiert und ist an spezifische Browser-Fingerprints gekoppelt. Wenn Sie Anfragen ohne gültige smdeviceid senden, stuft Shein diese als nicht-browserbasiert ein und blockiert sie – selbst wenn _abck gültig ist.
Datenlokalisierung: Wo Produkt-, Preis- und Bestandsdaten liegen
Um einen effektiven Shein Produkt Scraper zu bauen, müssen Sie wissen, wo die Daten physisch in der Antwort liegen. Hier die drei wichtigsten Quellen:
1. Produktseiten-JSON-Blobs
Auf jeder Produktseite finden Sie ein Inline-Script mit dem Variablennamen productIntroData oder gbProductDetail. Die Struktur sieht vereinfacht so aus:
{
"productIntroData": {
"detail": {
"goods_id": "12345678",
"goods_sn": "swdress07123456789",
"goods_name": "Ruched Bodycon Midi Dress",
"cat_id": "2030",
"retailPrice": {"amount": "45.99", "amountWithSymbol": "$45.99"},
"salePrice": {"amount": "19.99", "amountWithSymbol": "$19.99"},
"skuList": [
{"skuCode": "12345678-1", "color": "Black", "size": "S", "stock": 342},
{"skuCode": "12345678-2", "color": "Black", "size": "M", "stock": 0}
]
}
}
}
Die Felder retailPrice und salePrice liefern die Shein Preisdaten, während skuList[].stock den Bestand pro Variante angibt. goods_id ist der universelle Produktidentifikator, cat_id die Kategorie-ID.
2. Kategorie-Feed-Endpunkte
Für Katalog-Scraping rufen Sie Kategorie-Listen ab. Die Endpunkte verwenden cat_id und Paginierungsparameter:
GET /category/v2/getCategoryList?cat_id=2030&page=1&page_size=40&country=US
Die Antwort enthält ein Array von goods_id-Werten mit minimalem Preis- und Bild-Stub. Für vollständige Daten müssen Sie dann jeden goods_id einzeln über den Produkt-Endpunkt abrufen.
3. Such- und Filter-APIs
Sheins Such-API (/api/search/v1/search) akzeptiert keyword, sort und page-Parameter. Dies ist nützlich für Keyword-basierte Preisüberwachung, z. B. „sommerkleid“ oder „oversized hoodie“.
Rate-Limits und warum rotierende Residential Proxies zwingend sind
Shein lokalisiert Währung, Preis, Verfügbarkeit und sogar Produkttitel nach Geo-Region. Ein Produkt, das in den USA für $19,99 verfügbar ist, kann in Deutschland €24,99 kosten oder ganz aus dem Sortiment entfernt sein. Das bedeutet: Sie müssen nicht nur rotieren, sondern geo-gezielt rotieren.
Aus praktischen Tests und Community-Berichten ergeben sich folgende Richtwerte für Rate-Limits pro IP:
- Ohne gültiges _abck: 1–3 Anfragen, dann HTTP 403/412.
- Mit gültigem _abck und smdeviceid: ca. 50–80 Anfragen/min pro IP, bevor weiche Blocks (HTTP 412) einsetzen.
- Bei wiederholten Blocks: IP wird für 24–72 Stunden auf eine interne Blocklist gesetzt.
Für Massen-Scraping – z. B. 50.000 Produkte pro Lauf – benötigen Sie daher IP-Rotation. Datacenter-Proxies werden von Akamai fast sofort erkannt, da deren IP-Subnetze bekannt sind. Mobile Proxies sind zuverlässig, aber teuer und langsam (200–500 ms Latenz). Residential Proxies bieten den besten Kompromiss aus Vertrauenswürdigkeit, Geschwindigkeit (50–150 ms) und Preis.
| Proxy-Typ | Akamai-Erkennungsrate | Latenz | Preis (ca.) | Eignung für Shein |
|---|---|---|---|---|
| Datacenter | Sehr hoch (>90%) | 10–30 ms | $0,5–1 / GB | Nicht empfohlen |
| Residential (rotierend) | Niedrig (<10%) | 50–150 ms | $2–5 / GB | Beste Wahl |
| Mobile | Sehr niedrig (<3%) | 200–500 ms | $8–15 / GB | Für kritische Läufe |
Mit ProxyHat können Sie pro Anfrage eine neue IP erzwingen und gleichzeitig das Zielland festlegen – z. B. -country-US für US-Preise oder -country-DE für Euro-Preise. Das ist entscheidend, weil Shein Preisdaten sich je nach Region unterscheiden.
Python-Implementierung mit curl_cffi und ProxyHat
Für TLS-Fingerprint-Matching empfehlen wir curl_cffi – eine Python-Bibliothek, die libcurl mit BoringSSL verwendet und Chrome-TLS-Fingerprints nachahmt. Das löst das Problem, dass Python requests mit einem TLS-1.3-Fingerprint daherkommt, der sofort von Akamai als nicht-browserbasiert erkannt wird.
Hier ein vollständiges Beispiel, das einen Shein-Produkt-Endpunkt über ProxyHat abruft:
from curl_cffi import requests as cffi_requests
import json
# ProxyHat Residential Proxy mit Geo-Targeting USA
proxy_url = "http://user-country-US:PASSWORT@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": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.shein.com/",
"smdeviceid": "GENERIERTE_DEVICE_ID_HIER",
}
goods_id = "12345678"
url = f"https://www.shein.com/api/productInfo?goods_id={goods_id}&country=US"
response = cffi_requests.get(
url,
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome131",
timeout=15,
)
if response.status_code == 200:
data = response.json()
detail = data.get("productIntroData", {}).get("detail", {})
print(f"Produkt: {detail.get('goods_name')}")
print(f"Retail: {detail.get('retailPrice', {}).get('amountWithSymbol')}")
print(f"Sale: {detail.get('salePrice', {}).get('amountWithSymbol')}")
for sku in detail.get("skuList", [])[:3]:
print(f" SKU {sku['skuCode']}: stock={sku['stock']}")
else:
print(f"Blockiert: HTTP {response.status_code}")
Eine gekürzte Beispielantwort sieht so aus:
{
"productIntroData": {
"detail": {
"goods_id": "12345678",
"goods_name": "Ruched Bodycon Midi Dress",
"retailPrice": {"amount": "45.99", "amountWithSymbol": "$45.99"},
"salePrice": {"amount": "19.99", "amountWithSymbol": "$19.99"},
"skuList": [
{"skuCode": "12345678-1", "color": "Black", "size": "S", "stock": 342},
{"skuCode": "12345678-2", "color": "Black", "size": "M", "stock": 0}
]
}
},
"code": 0,
"msg": "success"
}
Paginierung, Sticky Sessions und Backoff-Strategien
Paginierung
Kategorie-Feeds paginieren mit page und page_size (max. 40 pro Seite). Für einen Kategorie-Scan iterieren Sie:
for page in range(1, max_pages + 1):
url = f"https://www.shein.com/category/v2/getCategoryList?cat_id={cat_id}&page={page}&page_size=40&country=US"
resp = fetch_with_proxy(url, session_id=f"cat-{cat_id}-p{page}")
if resp.status_code == 412:
refresh_abck_cookie()
time.sleep(2)
continue
goods_ids = extract_goods_ids(resp.json())
save_to_db(goods_ids)
Sticky Sessions für Währungskonsistenz
Ein kritischer Fehler ist IP-Rotation mitten in einem Produkt-Lauf. Wenn Anfrage 1 von einer US-IP kommt und Anfrage 2 von einer DE-IP, erhalten Sie inkonsistente Währungen – $19,99 für SKU A, €22,99 für SKU B. Verwenden Sie sticky Sessions mit ProxyHat:
proxy_url = "http://user-country-US-session-myrun001:PASSWORT@gate.proxyhat.com:8080"
Die Session-ID myrun001 hält dieselbe IP für die Dauer Ihres Laufs – typischerweise 10–30 Minuten. So bleibt die Währung konsistent. Für den nächsten Lauf verwenden Sie myrun002, um eine neue IP zu erhalten.
Backoff und _abck-Refresh
Bei HTTP 412 ist der _abck-Cookie abgelaufen oder invalidiert. Die korrekte Reaktion ist:
- Warten Sie 2–5 Sekunden (exponentiell, max. 60 s).
- Rufen Sie eine „ungefährliche“ Seite auf (z. B.
/), um_abckzu erneuern. - Rotieren Sie die IP, wenn 412 erneut auftritt.
- Loggen Sie den Vorfall und fahren Sie fort.
import time
def fetch_with_retry(url, max_retries=3):
for attempt in range(max_retries):
resp = cffi_requests.get(url, headers=headers, proxies=proxies, impersonate="chrome131")
if resp.status_code == 200:
return resp.json()
elif resp.status_code == 412:
wait = min(2 ** attempt, 60)
print(f"412 – warte {wait}s, versuche IP-Rotation")
rotate_proxy_ip()
time.sleep(wait)
elif resp.status_code == 403:
print("403 – IP blockiert, rotiere sofort")
rotate_proxy_ip()
time.sleep(5)
raise Exception(f"Max Retries überschritten für {url}")
ProxyHat-spezifisches Setup
ProxyHat bietet Residential, Mobile und Datacenter Proxies. Für Shein-Scraping empfehlen wir ausschließlich Residential Proxies mit Geo-Targeting. Die Einrichtung erfolgt über den ProxyHat-Dashboard-Bereich.
Die Verbindungsdetails:
- Gateway:
gate.proxyhat.com - HTTP-Port:
8080 - SOCKS5-Port:
1080 - Geo-Targeting:
user-country-US:pass@gate.proxyhat.com:8080 - Stadt-Level:
user-country-DE-city-berlin:pass@gate.proxyhat.com:8080 - Sticky Session:
user-session-abc123:pass@gate.proxyhat.com:8080
Preise und Pakete finden Sie auf der ProxyHat-Preisseite. Eine Übersicht der verfügbaren Länder finden Sie unter ProxyHat-Standorte. Weitere Anwendungsfälle für Web-Scraping finden Sie unter Web-Scraping-Anwendungsfälle und SERP-Tracking.
Ethik, TOS und rechtliche Grenzen
Beim Scrapen von Shein müssen Sie rechtliche und ethische Grenzen beachten. Sheins Nutzungsbedingungen verbieten automatisierte Datenerfassung in den meisten Fällen. Obwohl das Scraping öffentlich zugänglicher Produktdaten in vielen Gerichtsbarkeiten nicht automatisch illegal ist, gibt es Grauzonen:
- CFAA (USA): Der Computer Fraud and Abuse Act kann bei Umgehung technischer Zugriffskontrollen greifen. Das Umgehen von Akamai Bot Manager könnte als „Zugriffskontrollumgehung“ interpretiert werden.
- GDPR (EU): Produktdaten enthalten keine personenbezogenen Daten, aber wenn Sie Bewertungen oder Nutzer-Generated Content scrapen, greift die DSGVO.
- Nur öffentliche Daten: Scrapen Sie ausschließlich öffentlich sichtbare Produktdaten – keine Checkout-Flows, keine Kontodaten, keine nicht-öffentlichen APIs.
Wenn Sie Shein-Daten für Preisüberwachung oder Marktforschung benötigen, prüfen Sie, ob ein offizieller Affiliate-Feed verfügbar ist. Shein betreibt ein Affiliate-Programm über Netzwerke wie ShareASale oder LTK, das strukturierte Produkt-Feeds mit Preisen, Verfügbarkeit und Deep-Links anbietet. Für viele Anwendungsfälle ist das der rechtlich sicherere und technisch einfachere Weg.
Daumenregel: Wenn Sie mehr als 10.000 Produkte pro Tag abrufen müssen und kein Affiliate-Partner sind, überlegen Sie, ob der Aufwand für Anti-Bot-Umgehung das ROI-Verhältnis rechtfertigt. Ein Affiliate-Feed kostet nichts und liefert saubere CSV/XML-Daten.
Häufige Fehler und Edge Cases
- Fester User-Agent ohne Browser-Impersonation:
requestsmit Default-UA wird sofort blockiert. Verwenden Sie curl_cffi mitimpersonate="chrome131". - Kein Referer-Header: API-Anfragen ohne
Referer: https://www.shein.com/werden als Cross-Site-Attacke eingestuft. - Währungsmischung durch IP-Rotation: Verwenden Sie sticky Sessions für zusammenhängende Produkt-Läufe.
- Ignorieren von cat_id-Wechseln: Shein ändert gelegentlich Kategorie-IDs. Hardcodieren Sie nicht – rufen Sie die Kategorie-Baum-API regelmäßig ab.
- Kein Retry bei 412: HTTP 412 ist kein permanenter Block. Es ist ein temporärer _abck-Refresh. Behandeln Sie ihn mit Backoff, nicht mit Abbruch.
Key Takeaways
- API-Endpunkte > HTML-Parsing: Nutzen Sie
/api/productInfound Kategorie-Feeds statt gerenderte Seiten zu parsen – schneller, stabiler, weniger Daten. - Akamai ist der Hauptgegner: Ohne gültiges
_abck,smdeviceidund TLS-Fingerprint-Matching kommen Sie nicht weit. - curl_cffi + Residential Proxies: Diese Kombination bietet die beste Erfolgsquote. Datacenter-Proxies sind für Shein nutzlos.
- Geo-Targeting ist Pflicht: Shein lokalisiert Preise und Verfügbarkeit. Verwenden Sie
-country-US,-country-DEetc. - Sticky Sessions für Konsistenz: Verwenden Sie
-session--IDs, um Währungsmischung zu vermeiden. - Prüfen Sie Affiliate-Feeds: Für viele Anwendungsfälle ist der offizielle Weg rechtlich sicherer und technisch einfacher.
Bereit, loszulegen? Konfigurieren Sie Ihre ProxyHat-Residential-Proxies im Dashboard und beginnen Sie mit einem kleinen Testlauf von 100 Produkten, bevor Sie hochskalieren.






