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_idepage— 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:
- JA3/JA4 fingerprint de TLS: o stack TLS do Chrome headless é detectável e difere de navegadores reais em configurações específicas.
- 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.
- 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:
- Backoff exponencial: espere 5s, depois 10s, depois 20s antes de tentar novamente.
- Rotacionar IP: troque o session_id para obter um novo IP residencial.
- Renovar cookies: faça uma requisição GET à homepage da Shein pelo novo IP para obter um novo
_abckválido antes de tentar o endpoint de API novamente. - 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.






