Scrapowanie Shein na dużą skalę w 2026: Praktyczny przewodnik po proxy, API i anti-bot

Kompletny przewodnik scrapowania katalogu, cen i stanów magazynowych Shein w 2026: omijanie Akamai Bot Manager, endpointy API, proxy residential i przykłady kodu Python z ProxyHat.

Scraping Shein at Scale in 2026: A Practical Proxy Guide for Price Intelligence

Scrapowanie Shein na dużą skalę w 2026: API vs parsowanie HTML

Scrapowanie Shein na dużą skalę w 2026 wymaga świadomego wyboru między dwiema ścieżkami: parsowaniem renderowanego HTML czy uderzaniem bezpośrednio w wewnętrzne endpointy JSON. Każda z nich ma swoje kompromisy, a zła decyzja kosztuje tygodnie pracy i tysiące zablokowanych żądań.

Shein, podobnie jak wiele dużych platform e-commerce, osadza dane produktowe w dwóch miejscach. Po pierwsze, na stronie produktu znajdziesz osadzone obiekty JSON — productIntroData i gbProductDetail — wewnątrz tagów <script>. Po drugie, istnieją wewnętrzne endpointy API takie jak /api/productInfo oraz endpointy kanałów kategorii, które zwracają czysty JSON z parametrami goods_id i cat_id.

Endpointy API są szybsze, lżejsze i łatwiejsze do przetwarzania — nie musisz renderować JavaScript ani parsować DOM. Ale są też agresywniej chronione przez Akamai Bot Manager, który wymaga ważnego ciasteczka _abck i poprawnego telemetria sensor_data. Parsowanie HTML jest wolniejsze, ale czasem łatwiejsze do zainicjowania, ponieważ strona może renderować dane statycznie dla żądań z prawidłowymi nagłówkami.

Wniosek: jeśli budujesz system price-intelligence działający na tysiącach SKU dziennie, endpointy API są jedyną skalowalną opcją. Jeśli scrapujesz pojedyncze strony produktów okazjonalnie, parsowanie HTML z productIntroData może wystarczyć. W obu przypadkach potrzebujesz proxy residential z geo-targetingiem — Shein lokalizuje walutę, ceny i dostępność na podstawie IP i nagłówków.

Stack anti-bot Shein: Akamai Bot Manager i smdeviceid

Shein korzysta z Akamai Bot Manager jako głównej warstwy ochrony. To nie jest zwykły WAF — to system behavioural fingerprinting, który analizuje TLS handshake, nagłówki HTTP, sekwencję żądań i sygnały z JavaScript po stronie klienta.

Kluczowe elementy ochrony Akamai

  • _abck — ciasteczko sesyjne Akamai, ustawiane po pierwszym żądaniu. Ważność jest weryfikowana przy każdym kolejnym żądaniu. Jeśli sensor_data nie zostało poprawnie wygenerowane, ciasteczko jest oznaczane jako nieprawidłowe (status ~-1 w wartości) i żądania są blokowane kodem 403 lub 412.
  • bm_sz — ciasteczko pomocnicze powiązane z sesją przeglądarki, używane do korelacji telemetrii urządzenia.
  • sensor_data — ładunek telemetrii zbierany przez skrypt Akamai po stronie klienta. Zawiera fingerprint canvas, WebGL, listę czcionek, wymiary ekranu, timing zdarzeń myszy i keyboard. Jest wysyłany jako POST do endpointu Akamai i wymaga poprawnego wygenerowania, aby _abck zostało zweryfikowane.
  • smdeviceid — token identyfikacji urządzenia ustawiany przez skrypt Shein. Jest trwały przez sesje i powiązany z fingerprintem przeglądarki. Brak tego tokenu często skutkuje soft-blockiem (CAPTCHA lub ograniczenie rate limit).

Dlaczego sam headless Chrome nie wystarczy? Narzędzia takie jak Puppeteer czy Playwright uruchamiają Chromium z domyślnymi sygnałami, które Akamai rozpoznaje jako automatyczne: brak sensor_data, nienaturalny timing zdarzeń, fingerprint navigator.webdriver = true, brak interakcji myszy. Nawet z pluginami stealth, Akamai aktualizuje swoje sygnatury regularnie, a wskaźnik blokad dla niezmodyfikowanego headless Chrome na Shein wynosi często ponad 80% przy większej skali.

Rozwiązanie to kombinacja trzech elementów: (1) biblioteki HTTP z dopasowaniem TLS jak curl_cffi, która impersonifikuje fingerprint TLS Chrome; (2) proxy residential z rotacją IP, aby rozproszyć ryzyko; (3) opcjonalnie, rozwiązania do generowania sensor_data lub usług rozwiązywania Akamai, jeśli potrzebujesz pełnej automatyzacji endpointów API.

Gdzie znajdują się dane: JSON blobs i endpointy API

Shein osadza dane produktowe w kilku miejscach. Zrozumienie struktury jest kluczowe, zanim zaczniesz pisać jakikolwiek Shein product scraper.

Strona produktu — productIntroData i gbProductDetail

Na stronie produktu pod adresem https://www.shein.com/[kategorię]-p-[goods_id].html, Shein osadza duży obiekt JSON w tagu <script>. Zawiera on:

  • productIntroData — główne dane produktu: nazwa, opis, obrazy, atrybuty, warianty SKU.
  • gbProductDetail — szczegóły handlowe: retailPrice, salePrice, unitPrice, informacje o promocjach.
  • Pola SKU i inventory — mallStock, stock, skuList z dostępnością per wariant rozmiar/kolor.

Endpointy API — productInfo i category feed

Dla scrapowania na dużą skalę, endpointy API są wydajniejsze:

# Endpoint API szczegółów produktu
GET https://www.shein.com/api/productInfo?goods_id=1234567&cat_id=1730

# Endpoint listy kategorii (feed produktów)
GET https://www.shein.com/api/category/goods?cat_id=1730&page=1&page_size=40

# Endpoint wyszukiwania
GET https://www.shein.com/api/search?q=dress&page=1&page_size=40

Parametry kluczowe:

  • goods_id — unikalny identyfikator produktu (np. 1234567).
  • cat_id — identyfikator kategorii (np. 1730 dla sukienek).
  • page i page_size — paginacja, domyślnie 40 produktów na stronę.

Odpowiedź API jest czystym JSON i zawiera te same pola co productIntroData, ale bez narzutu HTML. Dla Shein price data w skali, to jest właściwa ścieżka.

Rate limity i strategia proxy residential

Shein stosuje agresywne rate limity per IP. Na podstawie testów i donieszeń społeczności, orientacyjne progi to:

  • ~80–120 żądań/min na jedno IP residential z poprawnymi ciasteczkami Akamai.
  • ~20–40 żądań/min na jedno IP datacenter — często zablokowane wcześniej przez Akamai na podstawie reputacji ASN.
  • Po przekroczeniu limitu: HTTP 412 Precondition Failed (wymagany refresh _abck) lub 403 Forbidden (hard block IP).

Dlaczego rotacja residential proxy jest obowiązkowa? Shein lokalizuje wszystko na podstawie IP:

  • Waluta — IP z USA widzi ceny w USD, IP z Niemiec w EUR, IP z Polski w PLN.
  • Dostępność — niektóre produkty są dostępne tylko w wybranych regionach.
  • Ceny — Shein stosuje regionalne strategie cenowe; ten sam produkt może kosztować $12.99 w USA i €14.99 w Niemczech.

Bez geo-targetingu otrzymasz niespójne dane cenowe, jeśli Twoje proxy rotuje między krajami losowo. ProxyHat umożliwia geo-targetowanie na poziomie kraju i miasta poprzez flagi w nazwie użytkownika.

Cecha Residential Datacenter Mobile
Wskaźnik blokad na Shein Niski (~5–10%) Wysoki (~50–70%) Bardzo niski (~2–5%)
Latencja 200–500ms 50–100ms 300–800ms
Geo-targeting (kraj/miasto) Tak Ograniczony Tak
Koszt Średni Niski Wysoki
Najlepsze zastosowanie Scraping na dużą skalę Testowanie, dev Wrażliwe cele

Dla scrapowania Shein, residential proxy z geo-targetingiem to optymalny kompromis między kosztem a niezawodnością. Sprawdź dostępne lokalizacje na stronie lokalizacji ProxyHat i porównaj plany na stronie cennika.

Praktyczny przykład: Python, curl_cffi i ProxyHat

Poniżej znajduje się działający przykład Shein product scraper używający curl_cffi do dopasowania TLS fingerprint Chrome, routowanego przez ProxyHat residential proxy z geo-targetingiem USA.

from curl_cffi import requests
import json

# ProxyHat residential proxy z geo-targetingiem USA
proxy_url = "http://user-country-US:pass@gate.proxyhat.com:8080"

# Endpoint API Shein
url = "https://www.shein.com/api/productInfo"
params = {
    "goods_id": "1234567",
    "cat_id": "1730",
}

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": "application/json, text/plain, */*",
    "Accept-Language": "en-US,en;q=0.9",
    "Referer": "https://www.shein.com/Women-Dresses-c-1730.html",
}

response = requests.get(
    url,
    params=params,
    headers=headers,
    proxies={"http": proxy_url, "https": proxy_url},
    impersonate="chrome120",
    timeout=15,
)

data = response.json()
product = data.get("info", {}).get("productIntroData", {})
detail = product.get("detail", {})

result = {
    "goods_id": product.get("goods_id"),
    "retailPrice": detail.get("retailPrice", {}),
    "salePrice": detail.get("salePrice", {}),
    "stock": detail.get("stock", "N/A"),
}
print(json.dumps(result, indent=2))

Przykładowa (skrócona) odpowiedź:

{
  "goods_id": "1234567",
  "retailPrice": {
    "amount": "29.99",
    "amountWithSymbol": "$29.99"
  },
  "salePrice": {
    "amount": "12.99",
    "amountWithSymbol": "$12.99"
  },
  "stock": 1842
}

Kluczowe elementy tego przykładu:

  • impersonate="chrome120"curl_cffi replikuje TLS fingerprint Chrome 120, co jest kluczowe dla przejścia wstępnej weryfikacji Akamai.
  • user-country-US w nazwie użytkownika ProxyHat — wymusza IP z USA, zapewniając ceny w USD i dostępność dla rynku amerykańskiego.
  • Referer ustawiony na stronę kategorii — Shein weryfikuje nagłówek Referer dla żądań API.

Paginacja, sticky sessions i logika backoff

Paginacja kanałów kategorii

Aby scrapować pełne kategorie, iteruj przez strony używając parametrów page i page_size:

import time
from curl_cffi import requests

base_url = "https://www.shein.com/api/category/goods"
proxy_url = "http://user-country-DE:pass@gate.proxyhat.com:8080"

all_products = []
for page in range(1, 51):  # max 50 stron = 2000 produktów
    params = {"cat_id": "1730", "page": page, "page_size": 40}
    resp = requests.get(
        base_url,
        params=params,
        proxies={"http": proxy_url, "https": proxy_url},
        impersonate="chrome120",
        timeout=15,
    )
    if resp.status_code == 412:
        print(f"412 na stronie {page} — refresh _abck potrzebny")
        break
    goods = resp.json().get("info", {}).get("goods", [])
    if not goods:
        break
    all_products.extend(goods)
    time.sleep(1.5)  # szanuj rate limit ~40 req/min

Sticky sessions dla spójności waluty

Jeśli rotujesz IP między żądaniami, możesz otrzymać ceny w różnych walutach w tej samej sesji scrapowania. ProxyHat obsługuje sticky sessions poprzez flagę session w nazwie użytkownika:

# Sticky session — to samo IP przez całą sesję scrapowania
proxy_url = "http://user-country-DE-session-shein-de-001:pass@gate.proxyhat.com:8080"

# Wszystkie żądania z tym session ID wychodzą z tego samego IP
# Gwarantując spójność waluty (EUR) i dostępności (Niemcy)</pre></pre>

<h3>Backoff i obsługa 412/_abck refresh</h3>
<p>Kiedy Shein zwraca <strong>412</strong>, oznacza to że ciasteczko <code>_abck</code> wymaga odświeżenia. Strategia:</p>
<ol>
<li><strong>Natychmiastowy backoff</strong> — zatrzymaj żądania na 5–10 sekund.</li>
<li><strong>Rotacja IP</strong> — zmień session ID w ProxyHat, aby otrzymać nowe IP bez historii blokad.</li>
<li><strong>Ponowne pobranie ciasteczek</code> — wykonaj żądanie GET na stronę główną Shein, aby otrzymać nowe <code>_abck</code> i <code>bm_sz</code>.</li>
<li><strong>Eksponencjalny backoff</strong> — jeśli 412 się powtarza, zwiększaj odstęp: 5s, 10s, 20s, 40s.</li>
</ol>

<pre><code>import time

def fetch_with_backoff(url, params, proxy_url, max_retries=5):
    for attempt in range(max_retries):
        resp = requests.get(
            url, params=params,
            proxies={"http": proxy_url, "https": proxy_url},
            impersonate="chrome120",
            timeout=15,
        )
        if resp.status_code == 200:
            return resp.json()
        elif resp.status_code == 412:
            wait = 5 * (2 ** attempt)  # 5, 10, 20, 40, 80s
            print(f"412 — backoff {wait}s, attempt {attempt+1}")
            time.sleep(wait)
            # Rotuj IP zmieniając session ID
            proxy_url = proxy_url.replace(
                "session-shein-001",
                f"session-shein-{attempt+2:03d}"
            )
        else:
            print(f"HTTP {resp.status_code} — abort")
            return None
    return None

Etyka, TOS i kiedy użyć oficjalnego feedu

Scrapowanie Shein wymaga świadomości prawnej i etycznej. Kilka kluczowych punktów:

  • Tylko dane publiczne — scrapeuj wyłącznie informacje o produktach widoczne bez logowania: ceny, opisy, zdjęcia, stany magazynowe. Nigdy nie próbuj scrapować danych kont, koszyka, checkoutu ani informacji osobistych.
  • CFAA — w USA, Computer Fraud and Abuse Act może mieć zastosowanie, jeśli omijasz mechanizmy autoryzacji. Scrapowanie danych publicznych jest ogólnie chronione przez orzeczenia jak hiQ Labs v. LinkedIn, ale omijanie Akamai Bot Manager może być interpretowane jako omijanie kontroli dostępu.
  • RODO/GDPR — jeśli przetwarzasz dane osobowe użytkowników (np. recenzje z imionami), podlegasz RODO. Dane produktowe nie są danymi osobowymi, ale zachowaj ostrożność przy recenzjach i ocenach.
  • Rate limiting — utrzymuj rozsądne tempo (poniżej 100 żądań/min na IP) i używaj backoff. Nie próbuj DDoS serwisu.
  • robots.txt — sprawdzaj i respektuj https://www.shein.com/robots.txt przed rozpoczęciem.

Kiedy oficjalny feed jest lepszy? Shein posiada program afiliacyjny z dostępem do feedów produktowych XML/CSV. Jeśli Twoim celem jest price intelligence dla porównywarek lub cashback, feed afiliacyjny oferuje:

  • Strukturalne dane bez ryzyka blokad.
  • Aktualizacje co 24h lub częściej.
  • Pełną zgodność z TOS.
  • Linki śledzenia z prowizją.

Feed afiliacyjny nie pokazuje jednak stany magazynowe w czasie rzeczywistym ani nie obejmuje wszystkich wariantów SKU. Jeśli potrzebujesz danych granularnych per-SKU z częstotliwością godzinową, scrapowanie z proxy pozostaje jedyną opcją.

Więcej informacji o implementacji proxy znajdziesz w dokumentacji ProxyHat oraz na stronach web scraping i SERP tracking.

Najważniejsze wnioski

Kluczowe zasady scrapowania Shein w 2026:

  • Używaj endpointów API (/api/productInfo, /api/category/goods) zamiast parsowania HTML dla skalowalności.
  • Akamai Bot Manager wymaga dopasowania TLS (curl_cffi), poprawnych ciasteczek (_abck, bm_sz) i tokenu smdeviceid.
  • Residential proxy z geo-targetingiem (np. user-country-US) jest obowiązkowe — Shein lokalizuje ceny, walutę i dostępność na podstawie IP.
  • Sticky sessions (user-session-xxx) zapewniają spójność waluty w obrębie jednej sesji scrapowania.
  • Utrzymuj tempo poniżej ~100 żądań/min na IP i implementuj eksponencjalny backoff przy HTTP 412.
  • Scrapeuj wyłącznie dane publiczne — przestrzegaj TOS, RODO i CFAA. Rozważ feed afiliacyjny, jeśli nie potrzebujesz danych w czasie rzeczywistym.

Gotowy, aby zacząć?

Dostęp do ponad 50 mln rezydencjalnych IP w ponad 148 krajach z filtrowaniem AI.

Zobacz cenyProxy rezydencjalne
← Powrót do Bloga