做时尚零售价格情报的团队,几乎都绕不开Shein。问题是:2026年大规模抓取Shein数据,早已不是“requests + BeautifulSoup”就能搞定的时代。Shein部署了Akamai Bot Manager、设备指纹、TLS指纹校验和动态价格本地化,直接用headless Chrome或普通HTTP库请求,往往在第一轮就被403或412挡掉。本文从工程实战角度,讲清楚API端点与渲染HTML的取舍、反爬栈原理、代理选型,以及一段可直接跑通的Python代码。
2026年大规模抓取Shein数据:先搞清楚API还是HTML
Shein的页面本质是SPA,商品详情和列表数据并非直接写在HTML里,而是在首屏渲染时通过内部JSON端点注入。这意味着你有两条路线:
- 路线A:解析渲染后的HTML — 用Playwright/Puppeteer加载页面,再从
<script>标签里的productIntroData或gbProductDetailJSON blob提取数据。优点是贴近真实浏览器;缺点是慢、贵、资源占用高,且仍可能被Akamai拦截。 - 路线B:直接请求内部API — Shein有一组
/api/productInfo、商品列表feed等JSON端点,返回结构化字段(goods_id、retailPrice、salePrice、stock)。速度快、数据干净,但需要正确携带_abck、bm_sz、smdeviceid等令牌,否则返回412。
对于价格情报场景,路线B效率高一个数量级:一次API请求通常在200–400ms返回,而渲染一个详情页要3–6秒并占用数百MB内存。但路线B的门槛在于反爬令牌的获取与维护。下面先拆解Shein的反爬栈。
Shein的反爬栈:Akamai Bot Manager与设备指纹
_abck、bm_sz与sensor_data
Shein使用Akamai Bot Manager作为核心防线。其工作流程是:
- 首次请求时,Akamai下发
bm_szcookie并注入一段JS,执行后生成_abckcookie。 _abck的值由sensor_data遥测计算而来——包含canvas指纹、WebGL参数、屏幕分辨率、时区、鼠标轨迹等几十项浏览器特征。- 后续每次请求都会校验
_abck;若sensor_data缺失或与TLS指纹不匹配,Akamai返回412 Precondition Failed或静默重定向到验证页。
这就是为什么裸的headless Chrome也会被拦:默认的Chromium TLS指纹、navigator特征和sensor_data生成逻辑与真实浏览器存在差异,Akamai的检测模型能识别这些偏差。
smdeviceid设备令牌
除了Akamai,Shein还会下发smdeviceid——一个长期设备标识,与sm4av等cookie配合用于风控画像。这个token一旦被标记为异常流量,该设备的所有请求都会进入更严格的挑战流程。因此每个代理IP应绑定独立的设备画像,不能多IP共用一套cookie。
数据在哪里:商品详情与分类feed端点
商品详情:productIntroData / gbProductDetail
在商品详情页(shein.com/[locale]/p-p-[goods_id].html)中,核心数据嵌在页面内联JSON里:
productIntroData— 包含SKU列表、颜色/尺码矩阵、库存、价格。gbProductDetail— 包含商品标题、主图、分类路径、品牌等元数据。- 关键字段:
goods_id、goods_sn、retailPrice.amount、salePrice.amount、mall_warehouse_stock或stock。
分类列表feed
分类页通过类似/api/category/[cat_id]/goods?page=[n]&limit=40的端点返回商品数组,每条记录含goods_id、缩略图、当前售价。配合cat_id层级遍历,可以批量发现SKU。一个典型分类可能有200–800个商品,需分页抓取。
速率限制与代理选型
Shein对单IP的请求频率有隐性阈值。根据实测,同一IP在5分钟内请求超过约80–120次就极易触发412或临时封禁。这远低于SERP类站点的容忍度,因此轮换住宅代理是刚需,而非可选项。
更关键的是:Shein会根据IP所在国家本地化货币、价格和库存。用美国IP访问看到的是USD定价和美区仓库存;换成德国IP,同一商品可能显示EUR价格、不同库存,甚至不同SKU上架状态。做跨市场价格比对时,如果IP国家与目标市场不一致,数据就是错的。
| 代理类型 | 适合场景 | 缺点 |
|---|---|---|
| 数据中心代理 | 低风险站点、内部测试 | Shein几乎100%识别并拦截 |
| 住宅代理(轮换) | 批量发现SKU、分类遍历 | 每次IP变更需重新获取_abck |
| 住宅代理(sticky session) | 详情页抓取、价格一致性 | 需控制单IP请求量 |
| 移动代理 | 高对抗场景补充 | 成本高、延迟波动大 |
推荐策略:分类遍历用每次请求轮换IP(-country-US),详情页抓取用sticky session锁定同一IP 10–30分钟,保证一次任务内货币和价格口径一致。ProxyHat支持在用户名中直接指定国家与会话ID,详见可用地区列表。
实战:用curl_cffi + ProxyHat抓取Shein商品数据
为什么用curl_cffi而非requests?因为它能模拟Chrome的TLS/JA3指纹,这是绕过Akamai第一层校验的前提。配合ProxyHat住宅代理,整体链路如下:
1. curl命令行快速验证
curl -x http://user-country-US-session-shein01:pass@gate.proxyhat.com:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ..." \
-H "Accept: application/json" \
"https://www.shein.com/api/productInfo?goods_id=12345678"
2. Python完整示例
from curl_cffi import requests as cffi_requests
import json, time, random
PROXY = "http://user-country-US-session-shein01:pass@gate.proxyhat.com:8080"
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/",
}
def fetch_product(goods_id, session_id="shein01"):
proxy = f"http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080"
url = f"https://www.shein.com/api/productInfo?goods_id={goods_id}"
for attempt in range(4):
try:
r = cffi_requests.get(url, headers=HEADERS, proxies={"http": proxy, "https": proxy},
impersonate="chrome124", timeout=15)
if r.status_code == 200:
return r.json()
elif r.status_code == 412:
# _abck 失效,换 session 重新获取令牌
session_id = f"shein{random.randint(1000,9999)}"
time.sleep(2 ** attempt)
continue
else:
print(f"status {r.status_code}, retry")
time.sleep(2 ** attempt)
except Exception as e:
print(f"err: {e}, retry")
time.sleep(2 ** attempt)
return None
data = fetch_product("12345678")
print(json.dumps(data, indent=2)[:600])
3. 截断的示例响应
{
"goods_id": "12345678",
"goods_sn": "swdress07123456789",
"retailPrice": { "amount": "29.99", "currency": "USD" },
"salePrice": { "amount": "19.99", "currency": "USD" },
"mall_warehouse_stock": [
{ "mall_code": "US", "stock": 120, "sku_code": "SKU-A-Red-S" },
{ "mall_code": "US", "stock": 0, "sku_code": "SKU-A-Red-M" }
],
"productIntroData": { ... }
}
注意retailPrice是原价、salePrice是当前售价,库存按SKU和仓库拆分。做价格情报时务必记录mall_code,因为同一商品在不同仓的库存和上架状态可能不同。
分页、sticky session与412重试
分类遍历分页
def crawl_category(cat_id, country="US"):
results = []
for page in range(1, 21): # 上限保护
sid = f"cat{page}_{random.randint(100,999)}"
proxy = f"http://user-country-{country}-session-{sid}:pass@gate.proxyhat.com:8080"
url = f"https://www.shein.com/api/category/{cat_id}/goods?page={page}&limit=40"
r = cffi_requests.get(url, headers=HEADERS, proxies={"http": proxy, "https": proxy},
impersonate="chrome124", timeout=15)
if r.status_code != 200:
break
items = r.json().get("goods", [])
if not items:
break
results.extend(items)
time.sleep(random.uniform(1.5, 3.0)) # 人类化节奏
return results
sticky session与货币一致性
抓取同一商品的详情时,整条任务链用同一个-session- ID,确保IP不变、cookie画像连续、货币口径一致。一旦遇到412,说明_abck过期或被挑战,此时丢弃当前session并换新ID,让ProxyHat分配新住宅IP重新走令牌获取流程。
退避策略
- 412 → 指数退避(2、4、8秒)+ 换session。
- 403 → 该IP已被标记,立即轮换。
- 5xx → 短退避1–2秒重试,通常为边缘节点抖动。
- 正常200 → 保持0.8–2秒随机间隔,避免恒定速率被识别为机器人。
建议将整体成功率目标设在90%以上;低于这个数字通常意味着代理池质量或TLS指纹出了问题。可参考网页抓取用例中的监控指标设计。
合规与伦理边界
抓取Shein数据必须守住几条线:
- 只取公开商品数据:商品标题、价格、库存、图片URL属于公开信息。不要尝试访问用户账户、订单、购物车或结账流程。
- 遵守robots.txt与ToS:Shein的服务条款通常禁止自动化访问;违反ToS可能触发民事索赔,在极端情况下可能涉及美国《计算机欺诈和滥用法》(CFAA)相关争议,尽管CFAA针对“未授权访问”的适用范围在Van Buren案后有所收窄。
- GDPR/CCPA:商品数据本身一般不含个人信息,但若抓取评论中包含用户昵称、头像等,需按GDPR和CCPA处理。最稳妥的做法是只存商品字段,丢弃任何用户生成内容中的个人标识。
- 速率克制:即便代理能支撑高并发,也不应以压垮服务器为目的。合理上限是商业情报需求,而非全量镜像。
如果你的需求是结构化、稳定、合规的商品feed,优先考虑Shein官方联盟(affiliate)API或合作数据计划。官方feed无需对抗反爬,数据质量有SLA保障,适合长期价格监控。爬虫方案更适合临时性、广覆盖、官方feed未覆盖的市场。关于代理成本与方案选择,可查看ProxyHat定价。更详细的代理参数说明见官方文档。
关键要点总结
- 优先走内部JSON端点(
/api/productInfo、分类feed),效率远高于渲染HTML。- Shein反爬核心是Akamai
_abck+sensor_data+TLS指纹;headless Chrome裸跑大概率被拦。- 用curl_cffi模拟Chrome TLS指纹 + ProxyHat住宅代理 + 地理定位(
-country-US/DE)是当前最稳的组合。- 分类遍历用轮换IP,详情抓取用sticky session保证货币一致;412即换session。
- 只抓公开商品数据,不碰账户/结账;长期需求优先评估官方affiliate feed。
准备好开始抓取?在SERP与价格监控用例中可以找到更多关于并发控制和成功率监控的实践。如果你需要特定国家或城市的住宅IP,查看ProxyHat全球节点即可按区域配置。






