2026年大规模抓取Shein数据:商品、价格与库存爬取实战指南

Shein的Akamai反爬让普通爬虫寸步难行。本文从内部API与渲染HTML的取舍出发,详解_abck/sensor_data机制、住宅代理地理定位、curl_cffi实战代码与412重试逻辑,助你在2026年稳定获取公开商品与价格数据。

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

做时尚零售价格情报的团队,几乎都绕不开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>标签里的productIntroDatagbProductDetail JSON blob提取数据。优点是贴近真实浏览器;缺点是慢、贵、资源占用高,且仍可能被Akamai拦截。
  • 路线B:直接请求内部API — Shein有一组/api/productInfo、商品列表feed等JSON端点,返回结构化字段(goods_idretailPricesalePricestock)。速度快、数据干净,但需要正确携带_abckbm_szsmdeviceid等令牌,否则返回412。

对于价格情报场景,路线B效率高一个数量级:一次API请求通常在200–400ms返回,而渲染一个详情页要3–6秒并占用数百MB内存。但路线B的门槛在于反爬令牌的获取与维护。下面先拆解Shein的反爬栈。

Shein的反爬栈:Akamai Bot Manager与设备指纹

_abck、bm_sz与sensor_data

Shein使用Akamai Bot Manager作为核心防线。其工作流程是:

  1. 首次请求时,Akamai下发bm_sz cookie并注入一段JS,执行后生成_abck cookie。
  2. _abck的值由sensor_data遥测计算而来——包含canvas指纹、WebGL参数、屏幕分辨率、时区、鼠标轨迹等几十项浏览器特征。
  3. 后续每次请求都会校验_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_idgoods_snretailPrice.amountsalePrice.amountmall_warehouse_stockstock

分类列表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全球节点即可按区域配置。

准备开始了吗?

通过AI过滤访问148多个国家的5000多万个住宅IP。

查看价格住宅代理
← 返回博客