Скрейпинг Shein в масштабе 2026 — это задача, которая разделяется на два принципиально разных подхода: парсинг отрендеренного HTML через headless-браузер или прямой запрос к внутренним JSON-эндпоинтам Shein. Первый путь медленнее, дороже и легче детектируется; второй — быстрее, но требует точного воспроизведения TLS-отпечатка и заголовков, иначе Akamai Bot Manager возвращает 403 или 412 ещё до полезной нагрузки. В этом руководстве мы разберём, как scrape Shein на уровне каталога, цен и остатков, используя резидентные прокси с геотаргетингом через ProxyHat.
Скрейпинг Shein в масштабе 2026: API-эндпоинты против HTML
У Shein есть два слоя данных. Внешний — это серверный рендеринг страниц товара и категорий, где базовая информация встроена в HTML через inline-скрипты с объектами productIntroData и gbProductDetail. Внутренний — это набор JSON-эндпоинтов вида /api/productInfo/getDetail и /api/category/v3/list, которые фронтенд вызывает через XHR после загрузки страницы. Эти эндпоинты возвращают структурированный JSON с полями retailPrice, salePrice, stock, skuList и метаданными товара.
Таблица ниже показывает ключевые различия:
| Подход | Скорость | Детекция | Полнота данных | Стоимость |
|---|---|---|---|---|
| Headless Chrome (HTML) | ~3–8 сек/страница | Высокая | Ограничена DOM | Высокая (CPU/RAM) |
| Прямые JSON-эндпоинты | ~200–500 мс/запрос | Средняя (TLS-отпечаток) | Полная | Низкая |
| Официальный affiliate feed | Зависит от API | Нет | По договору | Бесплатно/комиссия |
Для ценовой разведки и мониторинга остатков прямые JSON-эндпоинты — очевидный выбор: они в 10–20 раз быстрее и дают структурированные поля без XPath-парсинга. Но они защищены агрессивным anti-bot стеком, который нужно понимать, чтобы обходить.
Anti-bot стек Shein: Akamai Bot Manager и smdeviceid
Shein использует Akamai Bot Manager — один из самых распространённых коммерческих anti-bot решений. Его механизм основан на нескольких компонентах:
- Cookie
_abck— основной токен сессии, который Akamai проверяет на каждом запросе. Генерируется через JavaScript-сенсор, который собирает telemetry о браузере: canvas fingerprint, WebGL-параметры, тайминги событий, navigator properties. - Cookie
bm_sz— вспомогательный токен, связанный с_abck, обновляется при каждом вызове сенсора. sensor_data— payload, который JavaScript Akamai отправляет на эндпоинт/_bm/...для валидации сессии. Без корректногоsensor_datacookie_abckостаётся в состоянии «challenge» и запросы блокируются.smdeviceid— device token, который Shein генерирует на стороне клиента и передаёт в заголовках. Уникален для каждого устройства и привязан к гео-сессии.
Почему headless Chrome «из коробки» не работает? Akamai Bot Manager детектирует признаки автоматизации: navigator.webdriver=true, отсутствие реальных user interactions, несовпадение TLS-отпечатка с заявленным User-Agent, девиантные тайминги. Даже с Puppeteer-stealth или playwright-stealth Akamai часто возвращает challenge-страницу после 5–15 запросов с одного IP.
Решение — комбинировать HTTP-клиент с корректным TLS-отпечатком (например, curl_cffi в режиме impersonate=chrome) с ротацией резидентных IP-адресов. Это даёт скорость HTTP-запросов и правдоподобный сетевой профиль.
Где лежат данные: productIntroData, gbProductDetail и category-feeds
На странице товара Shein (/product/p/XXXXXX.html) базовая информация встроена в inline-JSON. Два ключевых блока:
productIntroData— содержит название, описание, изображения, размеры, цвета, базовые атрибуты товара.gbProductDetail— содержит SKU-структуру:goods_id,goods_sn,retailPrice,salePrice,stockпо каждому размеру/цвету.
Для категорий Shein использует эндпоинты вида:
https://www.shein.com/api/category/v3/list?cat_id=177&page=1&page_size=40&sort=popularity
https://www.shein.com/api/productInfo/getDetail?goods_id=12345678&country=US
Параметр cat_id идентифицирует категорию (например, 177 — платья), goods_id — конкретный товар. Параметр country определяет локализацию: валюту, цену, доступность и даже состав ассортимента. Это критически важно — один и тот же goods_id может иметь разную цену и наличие в США и Германии.
Rate limits, геолокация и почему нужна ротация резидентных прокси
Shein не публикует публичные rate limits, но эмпирические наблюдения показывают: с одного IP-адреса можно сделать примерно 30–80 запросов к JSON-эндпоинтам до появления 412-ответа или challenge-страницы. После блокировки IP обычно остаётся в «теневом бане» 6–24 часа.
Поскольку Shein локализует цены, валюту и наличие по гео, простая ротация IP без геотаргетинга приводит к несогласованным данным. Например, запрос с индийского IP вернёт цены в INR и другой набор товаров, чем с американского. Для ценовой разведки на конкретном рынке нужен IP из той же страны.
Решение — резидентные прокси с геотаргетингом по стране и опционально по городу. ProxyHat поддерживает формат:
http://user-country-US:pass@gate.proxyhat.com:8080
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080
Для Shein price data по рынку США используется -country-US, для Германии — -country-DE, и так далее. Это гарантирует, что JSON-ответы содержат корректную локализацию для каждого рынка.
Рабочий пример: Python + curl_cffi + ProxyHat
Ниже — пример Shein product scraper на Python с использованием curl_cffi для TLS-имитации и ProxyHat для ротации резидентных IP. Код запрашивает детали товара через внутренний эндпоинт и парсит цену и остатки.
from curl_cffi import requests
import json
# ProxyHat residential proxy with US geo-targeting
proxy_url = "http://user-country-US:YOUR_PASSWORD@gate.proxyhat.com:8080"
session = requests.Session(impersonate="chrome")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/124.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.shein.com/",
}
url = "https://www.shein.com/api/productInfo/getDetail"
params = {
"goods_id": "12345678",
"country": "US",
"currency": "USD",
"language": "en",
}
resp = session.get(
url,
params=params,
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
timeout=15,
)
data = resp.json()
product = data.get("info", {}).get("goods", {})
result = {
"goods_id": product.get("goods_id"),
"goods_name": product.get("goods_name"),
"retailPrice": product.get("retailPrice", {}).get("amount"),
"salePrice": product.get("salePrice", {}).get("amount"),
"currency": product.get("retailPrice", {}).get("currency"),
"stock": product.get("stock", ""),
}
print(json.dumps(result, indent=2, ensure_ascii=False))
Пример усечённого ответа:
{
"goods_id": "12345678",
"goods_name": "Solid Drop Shoulder Tee",
"retailPrice": "19.99",
"salePrice": "12.99",
"currency": "USD",
"stock": "In stock"
}
Обратите внимание: retailPrice — это «зачёркнутая» цена, salePrice — текущая цена со скидкой. Поле stock может содержать строку «In stock», «In stock, only 5 left!» или быть пустым при отсутствии товара.
Пагинация, sticky-сессии и обработка 412/_abck
Пагинация по категории
Категорийный эндпоинт поддерживает параметры page и page_size. Типичная стратегия — проходить страницы с шагом 1, останавливаясь при пустом результате или достижении конца. Однако при ротации IP между запросами можно получить несогласованные данные из-за разной локализации.
import time
all_goods = []
for page in range(1, 50):
proxy = f"http://user-country-US-session-cat{page}:YOUR_PASSWORD@gate.proxyhat.com:8080"
resp = session.get(
"https://www.shein.com/api/category/v3/list",
params={"cat_id": "177", "page": page, "page_size": 40, "country": "US"},
headers=headers,
proxies={"http": proxy, "https": proxy},
timeout=15,
)
items = resp.json().get("info", {}).get("goods", [])
if not items:
break
all_goods.extend(items)
time.sleep(1.5)
Sticky-сессии для консистентности валюты
ProxyHat поддерживает параметр -session- в username, который закрепляет IP за сессией. Это полезно, когда нужно пройти пагинацию с одного IP, чтобы получить единообразные цены и валюту:
proxy = "http://user-country-US-session-batch001:YOUR_PASSWORD@gate.proxyhat.com:8080"
Сессия batch001 будет держать один и тот же IP до 10–30 минут (в зависимости от настроек), после чего ProxyHat выдаст новый IP из того же пула country-US.
Backoff и обновление _abck
При получении HTTP 412 или 403 с challenge-страницей нужно:
- Пауза 5–15 секунд перед повторной попыткой.
- Смена IP через новую сессию ProxyHat (новый
-session-ID). - Очистка cookies и повторный запрос к главной странице для получения свежего
_abck. - При повторных 412 — экспоненциальный backoff: 10с, 20с, 40с, затем смена геопула.
import time, random
def fetch_with_backoff(url, params, max_retries=4):
for attempt in range(max_retries):
session_id = f"retry{attempt}-{random.randint(1000,9999)}"
proxy = f"http://user-country-US-session-{session_id}:YOUR_PASSWORD@gate.proxyhat.com:8080"
try:
resp = session.get(url, params=params, headers=headers,
proxies={"http": proxy, "https": proxy}, timeout=15)
if resp.status_code == 200:
return resp.json()
elif resp.status_code in (403, 412):
wait = 5 * (2 ** attempt) + random.uniform(0, 3)
time.sleep(wait)
session.cookies.clear()
else:
resp.raise_for_status()
except Exception:
time.sleep(5 * (2 ** attempt))
return None
Этика, TOS и когда лучше использовать официальный feed
Парсинг публично доступных товарных данных для ценовой аналитики — серая зона. Ключевые принципы:
- Только публичные данные: цены, названия, изображения, остатки. Никакого доступа к личным кабинетам, заказам или checkout-процессам.
- Соблюдение
robots.txt: проверьте robots.txt Shein перед скрейпингом. Если эндпоинт запрещён — не парсите его. - CFAA и GDPR: в США Computer Fraud and Abuse Act может применяться к «несанкционированному доступу» к серверам. В ЕС GDPR регулирует обработку персональных данных — товарные данные персональными не являются, но лог-данные серверов могут содержать IP пользователей.
- Rate limits
Если ваша задача — affiliate-монетизация или интеграция каталога в свой магазин, у Shein есть официальная affiliate-программа с product feed. Это легальный путь, который покрывает базовые поля: цену, изображение, категорию, affiliate-ссылку. Скрейпинг оправдан, когда нужны данные, которых нет в feed: остатки по SKU, история цен, локализованные цены по нескольким странам одновременно.
Настройка ProxyHat и внутренние ресурсы
Для начала работы с Shein price data через ProxyHat:
- Зарегистрируйтесь на dashboard.proxyhat.com и получите credentials.
- Изучите тарифы — резидентные прокси тарифицируются по трафику, выберите план с запасом по объёму.
- Проверьте доступные локации — ProxyHat покрывает основные рынки Shein: США, Германия, Великобритания, Франция, Япония.
- Ознакомьтесь с use-case для веб-скрейпинга и SERP-трекинга для паттернов ротации.
- Полная документация по подключению — на docs.proxyhat.com.
Key Takeaways
- Прямые JSON-эндпоинты Shein (
/api/productInfo/getDetail,/api/category/v3/list) в 10–20 раз быстрее HTML-парсинга и дают структурированные поля.- Akamai Bot Manager с
_abck,bm_szиsensor_dataблокирует headless Chrome после 5–15 запросов. Решение —curl_cffiсimpersonate=chrome+ резидентные прокси.- Геотаргетинг обязателен: Shein локализует цены, валюту и наличие. Используйте
-country-US,-country-DEи т.д.- Sticky-сессии (
-session-) обеспечивают консистентность валюты при пагинации.- При 412/403 — backoff, смена сессии, очистка cookies, повторный запрос главной страницы для свежего
_abck.- Для affiliate-задач рассмотрите официальный feed Shein — это легальнее и проще.
FAQ
Что такое скрейпинг Shein в масштабе 2026?
Это автоматизированный сбор каталога, цен и остатков Shein через внутренние JSON-эндпоинты с обходом Akamai Bot Manager. В 2026 году ключевой вызов — не парсинг HTML, а поддержание валидной сессии с корректным TLS-отпечатком и ротацией резидентных IP с геотаргетингом.
Почему скрейпинг Shein в масштабе важен для пользователей прокси?
Shein локализует цены, валюту и наличие по гео. Без геотаргетированных прокси вы получаете несогласованные данные. Резидентные прокси с геотаргетингом обеспечивают корректную локализацию и распределяют нагрузку, чтобы избежать блокировок Akamai после 30–80 запросов с одного IP.
Какой тип прокси лучше всего подходит для скрейпинга Shein?
Резидентные прокси с геотаргетингом по стране. Datacenter-прокси детектируются Akamai быстрее. Mobile-прокси работают, но дороже и медленнее. Резидентные — оптимальный баланс правдоподобности, скорости и цены. SOCKS5 (порт 1080) можно использовать, но HTTP (порт 8080) проще для JSON-API.
Как избежать блокировок при скрейпинге Shein?
Используйте curl_cffi с impersonate=chrome для TLS-имитации, ротируйте резидентные IP с геотаргетингом через ProxyHat, держите 1–2 запроса/сек на IP, применяйте sticky-сессии для пагинации, и при 412/403 делайте экспоненциальный backoff с очисткой cookies и сменой session-ID.






