Raspar Shein em Escala em 2026: Guia Prático de Proxies e Extração de Dados

Guia de implementação para raspar catálogo, preços e estoque da Shein em 2026, cobrindo a stack anti-bot da Akamai, endpoints de API interna, rotação de proxies residenciais e exemplos em Python com curl_cffi.

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

Raspar a Shein em escala em 2026 é, antes de tudo, um exercício de escolha de camada de dados. A Shein é um dos maiores sites de e-commerce de moda do mundo, com milhões de SKUs atualizados diariamente, e a forma como você acessa esses dados — renderizar HTML ou consultar endpoints JSON internos — determina sua taxa de sucesso, custo de proxy e frequência de bloqueios. Este guia cobre a stack anti-bot da Shein, onde os dados realmente vivem, limites de taxa realistas e uma implementação Python funcional usando proxies residenciais do ProxyHat.

Por que raspar Shein em escala em 2026 é um problema técnico

A Shein opera em mais de 150 países e serve páginas localizadas dinamicamente: moeda, preço, disponibilidade de estoque e até mesmo o catálogo visível mudam conforme o país e o dispositivo do visitante. Ao raspar Shein em escala, você não está lidando com uma única loça — está lidando com dezenas de versões geográficas que exigem IPs residenciais geo-direcionados para obter dados consistentes.

O desafio técnico central é que a Shein protege seu catálogo com a stack anti-bot da Akamai Bot Manager, que combina fingerprinting de TLS/JA3, análise de comportamento do navegador, cookies de sessão (_abck, bm_sz) e telemetria de sensor_data gerada por JavaScript ofuscado. Um navegador headless Chrome sem modificação falha na verificação de sensor_data em segundos, recebendo um HTTP 403 ou um desafio interminável. A Shein também emite um token de dispositivo smdeviceid que persiste entre sessões e é correlacionado com padrões de navegação.

Trade-off: endpoints de API vs. HTML renderizado

Existem duas abordagens principais para extrair dados da Shein, e a escolha impacta diretamente sua arquitetura de scraping:

Abordagem Vantagens Desvantagens
HTML renderizado (página de produto completa) Dados embutidos em blobs JSON na página (productIntroData, gbProductDetail); funciona sem descobrir endpoints internos Requer renderização JS completa; alto custo de CPU; mais lento; mais suscetível a bloqueios por padrão de navegação
Endpoints de API interna (/api/productInfo, feeds de categoria) JSON puro, leve, rápido, menor volume de transferência; ideal para paralelização em escala Requer cookies _abck válidos; parâmetros mudam entre versões do site; risco de 412/403 sem sensor_data correto

Para scraping de catálogo em escala (milhares de SKUs), endpoints de API interna são significativamente mais eficientes. Para monitoramento de poucos produtos com alta frequência, o HTML renderizado com extração de blobs JSON embutidos pode ser mais robusto, pois não depende de parâmetros de API que mudam.

Onde os dados vivem: campos, parâmetros e localização

Blobs JSON na página de produto

Ao carregar uma página de produto como https://www.shein.com/Produto-p-12345.html, a Shein embute dois grandes blobs JSON diretamente no HTML:

  • productIntroData: contém metadados do produto, descrição, atributos (cor, tamanho, material), imagens e variações de SKU.
  • gbProductDetail: contém detalhes de preço (retailPrice, salePrice), informações de estoque por SKU, avaliações agregadas e dados de envio.

Esses blobs são injetados em tags <script> na página. Um seletor XPath ou regex pode extraí-los sem executar JavaScript, se você conseguir passar pela camada anti-bot da Akamai primeiro.

Endpoints de API interna

A Shein expõe endpoints JSON internos usados pelo front-end para carregar listas de categoria e detalhes de produto. Os mais relevantes:

  • /api/productInfo?goods_id=12345 — retorna detalhes completos de um produto, incluindo retailPrice, salePrice, stock por SKU, imagens e atributos.
  • Feeds de categoria com parâmetros cat_id e page — retornam listas paginadas de goods_id, preços e thumbnails.

Os parâmetros goods_id e cat_id são identificadores internos da Shein. O goods_id identifica um produto de forma única; o cat_id identifica uma categoria (ex.: vestidos, blusas). A paginação usa um parâmetro page simples, mas o número máximo de páginas por categoria varia e pode exigir descoberta dinâmica.

Exemplo de resposta truncada do endpoint /api/productInfo

{
  "code": 0,
  "msg": "success",
  "info": {
    "goods_id": "12345",
    "goods_name": "Vestido Midi Floral",
    "retailPrice": {"amount": "49.99", "currency": "USD"},
    "salePrice": {"amount": "29.99", "currency": "USD"},
    "stock": 847,
    "sku_list": [
      {"sku_code": "SKU-A1", "size": "S", "stock": 120, "price": "29.99"},
      {"sku_code": "SKU-A2", "size": "M", "stock": 95, "price": "29.99"}
    ],
    "cat_id": "2030",
    "img": "https://img.shein.com/..."
  }
}

Este é o formato que você quer para price intelligence: retailPrice (preço de referência), salePrice (preço atual/promocional) e stock (disponibilidade agregada e por SKU).

A stack anti-bot da Shein: Akamai Bot Manager e smdeviceid

_abck, bm_sz e sensor_data

A Akamai Bot Manager usa um cookie chamado _abck que é definido na primeira requisição e validado continuamente. O cookie passa por múltiplos estágios: inicialmente inválido, depois validado por um script JavaScript ofuscado que gera sensor_data — uma string longa contendo telemetria do navegador (canvas fingerprint, fontes instaladas, WebGL renderer, timing de eventos, etc.). Sem um _abck validado, requisições a endpoints de API retornam HTTP 403 ou 412.

O cookie bm_sz é um token complementar que rastreia a sessão de bot detection. Juntos, _abck + bm_sz + sensor_data formam a tríade que a Akamai usa para distinguir navegadores reais de scrapers.

smdeviceid: o token de dispositivo

A Shein adiciona uma camada extra: o token smdeviceid, um identificador de dispositivo persistente gerado via JavaScript e armazenado em localStorage. Esse token é enviado em requisições subsequentes e correlacionado com padrões de navegação. Se você raspar milhares de produtos com o mesmo smdeviceid, a Shein pode detectar atividade automatizada mesmo com IPs diferentes.

Por que Chrome headless puro falha

Um Chrome headless sem modificações falha por três motivos principais:

  1. JA3/JA4 fingerprint de TLS: o stack TLS do Chrome headless é detectável e difere de navegadores reais em configurações específicas.
  2. sensor_data inválido ou ausente: o script da Akamai detecta propriedades do ambiente headless (navigator.webdriver, ausência de plugins, canvas fingerprint estéril) e gera sensor_data que falha na validação.
  3. Comportamento não humano: requisições em rajada sem tempo de permanência na página, sem scroll, sem eventos de mouse são flagrantes para análise comportamental.

Por isso, a estratégia mais eficaz em 2026 combina: (1) bibliotecas que imitam fingerprints de TLS de navegadores reais (curl_cffi, tls-client), (2) proxies residenciais rotativos com geo-direcionamento, e (3) sessões sticky para manter consistência de moeda e catálogo.

Limites de taxa realistas e por que proxies residenciais são obrigatórios

A Shein não publica limites de taxa oficiais para scraping, mas evidência empírica da comunidade de scraping indica que um único IP residencial consegue sustentar aproximadamente 5–15 requisições por minuto a endpoints de produto antes de receber um 403/412 da Akamai. Datacenter IPs são bloqueados quase imediatamente — a Akamai classifica ranges de datacenter como suspeitos por padrão.

Para raspar Shein em escala — digamos, 50.000 SKUs por dia com atualização de preço a cada 6 horas — você precisa de:

  • Rotação de IPs residenciais: cada requisição (ou pequeno lote) sai de um IP residencial diferente, diluindo o padrão de tráfego.
  • Geo-direcionamento: a Shein localiza preço, moeda e disponibilidade por país. Raspar do Brasil retorna preços em BRL; dos EUA, em USD. Para price intelligence consistente, você precisa fixar o país (ex.: sempre EUA ou sempre Alemanha).
  • Sessões sticky: ao paginar uma categoria ou seguir links de produto, manter o mesmo IP por alguns minutos evita inconsistências de moeda e catálogo.

Com proxies residenciais rotativos do ProxyHat, você pode geo-direcionar por país e cidade. Para a Shein, recomendamos fixar o país em US ou DE para obter um catálogo estável em USD ou EUR, respectivamente.

Implementação prática: Python + curl_cffi + ProxyHat

A biblioteca curl_cffi permite fazer requisições HTTP com fingerprints de TLS que imitam navegadores reais (Chrome, Safari, Firefox). Combinada com proxies residenciais do ProxyHat, é a stack mais leve e eficaz para raspar endpoints de API da Shein sem um navegador completo.

Configuração do proxy ProxyHat

O ProxyHat usa um gateway único em gate.proxyhat.com. O geo-direcionamento e o ID de sessão são passados no campo de usuário:

# HTTP proxy com geo-direcionamento para EUA
http://user-country-US:sua_senha@gate.proxyhat.com:8080

# HTTP proxy com geo-direcionamento para Alemanha (Berlim)
http://user-country-DE-city-berlin:sua_senha@gate.proxyhat.com:8080

# Sessão sticky (mesmo IP por sessão)
http://user-session-abc123-country-US:sua_senha@gate.proxyhat.com:8080

# SOCKS5
socks5://user-country-US:sua_senha@gate.proxyhat.com:1080

Exemplo completo em Python

import json
import time
import random
from curl_cffi import requests

PROXYHAT_USER = "user"
PROXYHAT_PASS = "sua_senha"

def get_proxy(country="US", session_id=None):
    user = f"{PROXYHAT_USER}"
    if session_id:
        user += f"-session-{session_id}"
    user += f"-country-{country}"
    return f"http://{user}:{PROXYHAT_PASS}@gate.proxyhat.com:8080"

def fetch_product_info(goods_id, country="US", session_id=None):
    proxy = get_proxy(country, session_id)
    url = f"https://www.shein.com/api/productInfo?goods_id={goods_id}"
    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": f"https://www.shein.com/Produto-p-{goods_id}.html",
    }
    try:
        resp = requests.get(
            url,
            headers=headers,
            proxies={"http": proxy, "https": proxy},
            impersonate="chrome131",
            timeout=15,
        )
        if resp.status_code == 412 or resp.status_code == 403:
            # _abck expirou ou foi rejeitado — rotacionar IP e tentar novamente
            return None, resp.status_code
        data = resp.json()
        if data.get("code") == 0 and "info" in data:
            info = data["info"]
            return {
                "goods_id": info.get("goods_id"),
                "name": info.get("goods_name"),
                "retail_price": info.get("retailPrice", {}).get("amount"),
                "sale_price": info.get("salePrice", {}).get("amount"),
                "currency": info.get("salePrice", {}).get("currency"),
                "stock": info.get("stock"),
                "cat_id": info.get("cat_id"),
            }, 200
        return None, resp.status_code
    except Exception as e:
        print(f"Erro: {e}")
        return None, 0

def scrape_products(goods_ids, country="US"):
    results = []
    for i, gid in enumerate(goods_ids):
        session_id = f"shein-batch-{i // 20}"  # sticky a cada 20 produtos
        product, status = fetch_product_info(gid, country, session_id)
        if product:
            results.append(product)
        elif status in (403, 412):
            # Backoff exponencial + nova sessão
            time.sleep(random.uniform(5, 10))
            product, status = fetch_product_info(gid, country, f"retry-{i}")
            if product:
                results.append(product)
        time.sleep(random.uniform(0.5, 1.5))  # rate limiting humano
    return results

# Exemplo de uso
if __name__ == "__main__":
    ids = ["12345", "12346", "12347", "12348", "12349"]
    data = scrape_products(ids, country="US")
    print(json.dumps(data, indent=2, ensure_ascii=False))

Resposta truncada esperada

[
  {
    "goods_id": "12345",
    "name": "Vestido Midi Floral",
    "retail_price": "49.99",
    "sale_price": "29.99",
    "currency": "USD",
    "stock": 847,
    "cat_id": "2030"
  },
  {
    "goods_id": "12346",
    "name": "Blusa Cropped Tricot",
    "retail_price": "19.99",
    "sale_price": "12.99",
    "currency": "USD",
    "stock": 312,
    "cat_id": "1850"
  }
]

Paginação, sessões sticky e tratamento de 412/_abck

Paginação de categoria

Feeds de categoria da Shein usam parâmetros cat_id e page. Para coletar todos os goods_id de uma categoria, itere páginas até receber uma resposta vazia ou um número de itens abaixo do esperado:

def scrape_category(cat_id, max_pages=100, country="US"):
    all_goods_ids = []
    session_id = f"cat-{cat_id}"
    for page in range(1, max_pages + 1):
        proxy = get_proxy(country, session_id)
        url = f"https://www.shein.com/category/{cat_id}/?page={page}"
        resp = requests.get(
            url,
            headers={"User-Agent": "Mozilla/5.0 ..."},
            proxies={"http": proxy, "https": proxy},
            impersonate="chrome131",
            timeout=15,
        )
        if resp.status_code != 200:
            break
        # Extrair goods_ids do HTML ou JSON da resposta
        goods_ids = parse_goods_ids(resp.text)
        if not goods_ids:
            break
        all_goods_ids.extend(goods_ids)
        time.sleep(random.uniform(1.0, 2.0))
    return all_goods_ids

Sessões sticky para consistência de moeda

Se você paginar uma categoria inteira com IPs diferentes a cada requisição, pode receber preços em moedas diferentes (USD, EUR, BRL) dependendo do IP de saída. Para evitar isso, use um ID de sessão sticky que mantém o mesmo IP residencial por um período. No ProxyHat, basta adicionar -session-{id} ao usuário:

# Mesmo IP por toda a sessão de paginação
http://user-session-cat-2030-country-US:senha@gate.proxyhat.com:8080

Para trabalhos longos, rotacione o session_id a cada 50–100 requisições para evitar que um único IP acumule tráfego suspeito.

Backoff e refresh de _abck

Quando você recebe HTTP 412 ou 403, o cookie _abck foi invalidado. A estratégia de recuperação:

  1. Backoff exponencial: espere 5s, depois 10s, depois 20s antes de tentar novamente.
  2. Rotacionar IP: troque o session_id para obter um novo IP residencial.
  3. Renovar cookies: faça uma requisição GET à homepage da Shein pelo novo IP para obter um novo _abck válido antes de tentar o endpoint de API novamente.
  4. Limite de tentativas: após 3 falhas consecutivas, pause a thread/worker por 60s.
def refresh_abck(proxy, country="US"):
    """Faz uma requisição à homepage para obter cookies _abck frescos."""
    resp = requests.get(
        "https://www.shein.com/",
        headers={"User-Agent": "Mozilla/5.0 ..."},
        proxies={"http": proxy, "https": proxy},
        impersonate="chrome131",
        timeout=15,
    )
    # curl_cffi mantém cookies automaticamente na sessão
    return resp

Erros comuns e casos de borda

1. Usar proxies datacenter

Proxies datacenter são bloqueados pela Akamai em segundos. A Shein, como grande varejista, tem regras agressivas contra ranges de datacenter. Use sempre proxies residenciais ou móveis.

2. Ignorar geo-localização

Raspar sem fixar o país resulta em preços inconsistentes — um produto pode aparecer a $29.99 em uma requisição e €27.99 na próxima, dependendo do IP. Sempre use -country-US ou -country-DE no usuário do proxy.

3. Reutilizar smdeviceid em todas as requisições

Se você gerar um smdeviceid único e reutilizá-lo em 10.000 requisições, a Shein pode correlacionar o token com padrões de bot. Gere tokens novos por sessão sticky ou omita o header se o endpoint funcionar sem ele.

4. Não respeitar robots.txt

Verifique sempre o robots.txt da Shein antes de raspar. Embora robots.txt não seja legalmente vinculativo, respeitá-lo demonstra boa fé e reduz risco legal. Saiba mais sobre as diretrizes em RFC 9309.

5. Raspar dados de conta ou checkout

Nunca acesse endpoints de checkout, conta de usuário, carrinho ou dados pessoais. Isso viola os Termos de Serviço da Shein e pode configurar violação do Computer Fraud and Abuse Act (CFAA) nos EUA ou do GDPR na Europa. Limite-se a dados públicos de produto: preço, estoque, nome, imagens, categoria.

Ética, ToS e quando usar o feed oficial de afiliados

Raspar dados públicos de produto (preço, estoque, nome, imagens) é geralmente aceitável sob a doutrina de uso justo de dados públicos, mas há limites importantes:

  • Dados públicos apenas: não acesse endpoints que exijam login ou dados de conta.
  • Frequência razoável: não sobrecarregue a infraestrutura da Shein. Limite-se ao que você precisa para sua análise de mercado.
  • GDPR/CCPA: se você coletar dados de usuários (avaliações com nomes, por exemplo), esteja ciente das obrigações de privacidade. O GDPR se aplica a dados pessoais de residentes na UE.
  • Termos de Serviço: verifique os ToS da Shein antes de iniciar. Alguns ToS proíbem scraping explicitamente, o que pode resultar em bloqueio de IP ou ações legais.

Quando o feed de afiliados é melhor

A Shein opera um programa de afiliados que, em alguns casos, oferece acesso a um feed de produtos em XML/CSV com dados de preço, estoque e imagens. Se seu caso de uso é price intelligence de longo prazo com atualização diária, o feed de afiliados pode ser mais confiável e legalmente seguro que scraping. A trade-off é que feeds de afiliados podem ter latência maior (atualização diária vs. em tempo real) e podem não incluir todos os SKUs.

Para monitoramento em tempo real ou near-real-time (ex.: detectar flash sales em minutos), scraping com proxies residenciais ainda é a única opção viável.

Configuração específica do ProxyHat

O ProxyHat oferece proxies residenciais, móveis e datacenter. Para raspar a Shein, use exclusivamente proxies residenciais com geo-direcionamento. Veja os detalhes em nossa página de preços e lista de localizações disponíveis.

Para casos de uso avançados como SERP tracking e web scraping em larga escala, consulte nossos guias em SERP tracking e web scraping. A documentação técnica completa está em docs.proxyhat.com.

Parâmetros recomendados para Shein

Parâmetro Valor recomendado
Tipo de proxy Residencial
País US ou DE (para catálogo estável)
Rotação Sticky session a cada 20–50 requisições
Rate limit por IP 5–15 req/min
Porta HTTP 8080
Porta SOCKS5 1080
Backoff em 412/403 5s → 10s → 20s, máx 3 tentativas

Principais takeaways

Key Takeaways:

  • Escolha da camada de dados: endpoints de API interna (/api/productInfo) são mais eficientes para escala; HTML renderizado é melhor para poucos produtos com alta frequência.
  • Stack anti-bot: a Shein usa Akamai Bot Manager (_abck, bm_sz, sensor_data) + smdeviceid. Chrome headless puro é bloqueado em segundos.
  • Proxies residenciais são obrigatórios: proxies datacenter são bloqueados pela Akamai. Use geo-direcionamento (-country-US) para consistência de moeda e catálogo.
  • Rate limit realista: 5–15 req/min por IP residencial. Para 50.000 SKUs/dia, planeje rotação de sessões e backoff.
  • Sessões sticky: mantêm o mesmo IP por 20–50 requisições para evitar inconsistências de moeda ao paginar categorias.
  • Ética: limite-se a dados públicos de produto. Não acesse checkout, conta ou dados pessoais. Considere o feed de afiliados para monitoramento de longo prazo.

Raspar Shein em escala em 2026 exige uma combinação de técnica de TLS matching, proxies residenciais geo-direcionados, sessões sticky para consistência e respeito a limites de taxa realistas. Com a stack ProxyHat + curl_cffi descrita acima, você pode construir um pipeline de price intelligence robusto que sustenta dezenas de milhares de requisições por dia com uma taxa de sucesso acima de 90%. Comece com um lote pequeno, valide sua taxa de sucesso e escale gradualmente.

Pronto para começar?

Acesse mais de 50M de IPs residenciais em mais de 148 países com filtragem por IA.

Ver preçosProxies residenciais
← Voltar ao Blog