2026年大规模抓取Shein数据的API与HTML权衡
在2026年,大规模抓取Shein数据已成为时尚零售价格情报和市场分析的核心需求。Shein每天上新数千款商品,价格和库存波动频繁,对价格监控、竞品分析和趋势预测团队来说,实时数据采集至关重要。然而,Shein的反爬技术栈在2026年已显著升级,直接解析渲染HTML和调用内部JSON API之间的权衡变得尤为关键。
Shein的前端页面通过React/Next.js渲染,HTML中嵌入了大量数据JSON blob(如productIntroData和gbProductDetail),但直接解析HTML面临两个问题:一是页面结构频繁变动导致选择器失效,二是Akamai Bot Manager会在检测到自动化行为时返回挑战页面而非真实内容。相比之下,Shein的内部API端点(如/api/productInfo和商品列表JSON接口)返回结构化数据,更稳定且解析成本更低,但这些端点同样受Akamai保护。
核心结论:优先使用内部JSON API端点,仅在API不可用时回退到HTML解析。两种方式都需要配合高质量住宅代理才能稳定运行。
Shein反爬技术栈深度解析
Akamai Bot Manager与_abck Cookie
Shein使用Akamai Bot Manager作为其核心反爬防线。Akamai通过以下机制识别自动化流量:
- _abck Cookie:Akamai的核心会话令牌,通过浏览器端JavaScript传感器生成。每次请求都会验证此cookie的有效性。
- bm_sz Cookie:辅助令牌,与_abck配合进行设备指纹验证。
- sensor_data遥测:Akamai的传感器脚本会采集大量浏览器环境数据(canvas指纹、WebGL参数、字体列表、navigator属性等),生成sensor_data负载发送至Akamai服务器进行验证。
- smdeviceid设备令牌:Shein额外使用的设备识别token,绑定到特定浏览器环境,用于跨会话追踪可疑行为。
纯headless Chrome(如Puppeteer/Selenium默认配置)在2026年几乎无法通过Akamai检测。原因在于:标准headless Chrome的navigator.webdriver属性、自动化CDP痕迹、以及缺失的浏览器插件指纹会被Akamai传感器标记。即使使用stealth插件,Akamai的传感器仍能检测到Canvas渲染差异和WebGL哈希不匹配。
为什么headless Chrome会失败
关键问题在于TLS指纹(JA3/JA4)和HTTP/2指纹。Akamai不仅检查JavaScript环境,还检查底层网络层指纹。标准headless Chrome使用的TLS库与真实浏览器存在细微差异,Akamai将这些差异作为辅助信号。此外,请求频率模式(如固定间隔、无鼠标移动轨迹)也会触发行为分析模型。
因此,成功的策略是:使用TLS指纹模拟库(如curl_cffi)直接请求API端点,配合住宅代理轮换IP,而非依赖headless浏览器。
数据定位:JSON Blob与API端点
商品详情页数据结构
Shein商品详情页的HTML中包含两个关键JSON blob:
productIntroData:包含商品基本信息、图片URL、描述、尺码表等。gbProductDetail:包含SKU级别的价格、库存、颜色/尺码变体信息。
对应的内部API端点为:
GET https://www.shein.com/api/productInfo?goods_id=12345678&cat_id=1
# 商品列表/分类端点
GET https://www.shein.com/api/goods_list?cat_id=1982&page=1&page_size=40关键字段映射:
| 字段 | API路径 | 说明 |
|---|---|---|
| goods_id | productInfo.goods_id | 商品唯一标识 |
| retailPrice | productInfo.retailPrice.amount | 原价 |
| salePrice | productInfo.salePrice.amount | 售价 |
| stock | skuList[].stock | SKU级库存数量 |
| cat_id | goods_list.cat_id | 分类ID |
分类Feed端点
要获取整个目录,需要遍历分类树。Shein的分类端点返回goods_id列表,可配合cat_id参数分页获取。每个分类通常包含500-2000个商品,每页40条,需处理50+页分页。
速率限制与代理轮换策略
Shein对单IP的速率限制大致为:
- API端点:约30-50请求/分钟/IP后开始返回412状态码或Akamai挑战页。
- HTML页面:约60-80请求/分钟/IP后触发频控。
- 硬封锁:超过阈值后IP会被临时封禁约24小时。
对于大规模采集(如每日10万+商品),单IP远远不够。按50请求/分钟计算,10万商品需要约33小时——这在实时价格监控场景中不可接受。使用100个并发住宅代理IP可将时间压缩至约20分钟。
地理定位是必须的。Shein根据访问IP的地理位置本地化货币、价格和库存。例如,美国IP看到的是USD定价和美区库存,德国IP看到的是EUR定价和欧区库存。如果你的目标市场是美国,必须使用美国住宅IP:
http://user-country-US:pass@gate.proxyhat.com:8080
# 德国市场
http://user-country-DE:pass@gate.proxyhat.com:8080
# 特定城市级定位
http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080更多可用地区请查看ProxyHat代理位置列表。
Python实战:curl_cffi + ProxyHat采集Shein价格数据
以下是一个完整的工作示例,使用curl_cffi模拟Chrome TLS指纹,通过ProxyHat住宅代理路由请求,采集Shein商品价格和库存数据。
import json
import time
from curl_cffi import requests
# ProxyHat住宅代理配置 - 美国市场
PROXY_URL = "http://user-country-US:YourPassword@gate.proxyhat.com:8080"
def fetch_shein_product(goods_id: str, session_id: str = None):
"""通过Shein内部API获取商品价格和库存数据"""
# 构建带sticky session的代理URL,确保同一会话使用同一IP
proxy = PROXY_URL
if session_id:
proxy = proxy.replace(
"user-country-US",
f"user-country-US-session-{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/120.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/p-{goods_id}-cat.html",
}
for attempt in range(3):
try:
response = requests.get(
url,
headers=headers,
proxies={"http": proxy, "https": proxy},
impersonate="chrome120",
timeout=15
)
# 处理412状态码(Akamai挑战)
if response.status_code == 412:
print(f"[412] Akamai challenge for goods_id={goods_id}, "
f"attempt {attempt+1}")
time.sleep(2 ** attempt) # 指数退避
continue
if response.status_code == 200:
data = response.json()
product = extract_product_fields(data)
return product
else:
print(f"HTTP {response.status_code} for goods_id={goods_id}")
time.sleep(1)
except Exception as e:
print(f"Error: {e}, retrying...")
time.sleep(2 ** attempt)
return None
def extract_product_fields(raw: dict) -> dict:
"""从API响应中提取关键字段"""
info = raw.get("info", {}).get("productIntroData", raw.get("info", {}))
return {
"goods_id": info.get("goods_id"),
"goods_name": info.get("goods_name"),
"retailPrice": info.get("retailPrice", {}).get("amount"),
"salePrice": info.get("salePrice", {}).get("amount"),
"currency": info.get("salePrice", {}).get("currency"),
"stock": sum(
sku.get("stock", 0) for sku in info.get("skuList", [])
),
"timestamp": int(time.time())
}
# 示例调用
if __name__ == "__main__":
result = fetch_shein_product("12345678", session_id="shein-us-001")
print(json.dumps(result, indent=2))截断的示例响应:
{
"goods_id": "12345678",
"goods_name": "Solid Drop Shoulder Oversized Bomber Jacket",
"retailPrice": "42.99",
"salePrice": "18.99",
"currency": "USD",
"stock": 3470,
"timestamp": 1735689600
}关于curl_cffi的impersonate参数:它模拟Chrome 120的TLS指纹(JA3/JA4)和HTTP/2设置,使请求在网络层与真实Chrome浏览器无法区分。这是绕过Akamai网络层检测的关键。更多技术细节请参考ProxyHat官方文档。
分页处理与Sticky Session
分页策略
对于分类级采集,需要遍历多页商品列表:
def scrape_category(cat_id: str, max_pages: int = 60):
"""采集整个分类的商品ID列表"""
all_goods = []
for page in range(1, max_pages + 1):
# 每页使用不同session以轮换IP
session_id = f"cat-{cat_id}-p{page}"
proxy = build_proxy(country="US", session_id=session_id)
url = f"https://www.shein.com/api/goods_list"
params = {"cat_id": cat_id, "page": page, "page_size": 40}
response = requests.get(
url, params=params,
headers=headers,
proxies={"https": proxy},
impersonate="chrome120",
timeout=15
)
if response.status_code == 200:
goods = response.json().get("info", {}).get("goods", [])
if not goods: # 空页表示分类结束
break
all_goods.extend([g["goods_id"] for g in goods])
time.sleep(0.8) # 请求间隔约750ms
elif response.status_code == 412:
# Akamai挑战 - 切换IP重试
time.sleep(3)
continue
return all_goodsSticky Session与货币一致性
当采集同一商品的多个SKU或翻页时,必须使用sticky session确保所有请求来自同一IP。原因在于:如果中途IP切换到不同国家,返回的货币和价格会不一致,导致数据污染。
# 同一商品的所有SKU请求使用相同session
http://user-country-US-session-shein-prod-12345:pass@gate.proxyhat.com:8080ProxyHat的sticky session在IP可用期间保持同一出口IP(通常约30分钟),足够完成单个商品的完整采集周期。
412退避与_abck刷新
当收到412状态码时,表示Akamai要求重新验证_abck cookie。处理逻辑:
- 立即停止当前IP的请求,等待5-10秒。
- 切换到新的session ID(即新IP)继续请求。
- 若频繁412,降低全局请求速率至20请求/分钟/IP。
- 记录被封锁的goods_id,稍后用全新IP批次重试。
常见错误与边缘情况
- 货币不一致:未使用sticky session导致同一商品的不同请求返回不同货币价格。解决:每个商品采集周期内固定session ID。
- 库存为零的误判:Shein的库存数据按SKU级别返回,某些SKU可能仅在某些地区有货。务必检查
skuList中每个变体的stock字段,而非只看汇总值。 - 商品下架检测:下架商品API返回HTTP 200但
goods_id对应字段为空或salePrice为null。需在提取逻辑中处理null值。 - 地区限制商品:部分商品仅在特定市场销售。使用美国IP可能看不到仅面向欧洲的商品。解决方案:多地区并行采集。
- CDN缓存差异:Shein使用CDN缓存API响应,不同地区CDN节点的缓存版本可能不同。添加
Cache-Control: no-cache头可减少缓存命中,但会增加源站负载。
伦理、合规与TOS考量
大规模抓取Shein数据时,必须注意以下合规边界:
- 仅采集公开商品数据:价格、库存、商品名称、图片URL等公开可见信息。不触碰用户账户、购物车、结账流程或任何需要登录的数据。
- 遵守robots.txt:检查Shein的robots.txt文件,尊重其爬虫访问规则。
- CFAA风险:根据美国《计算机欺诈和滥用法》(CFAA),绕过技术访问控制措施可能构成违法行为。仅采集无需认证的公开数据,不尝试破解Akamai的加密传感器。
- GDPR合规:若采集涉及欧盟用户生成的数据(如评论中的用户ID),需遵守GDPR的数据处理原则。商品价格和库存数据本身不涉及个人数据,但用户评论数据需谨慎处理。
- 请求频率控制:即使技术上可以更高频率采集,也应将请求速率控制在合理范围内,避免对目标站点造成实质性负担。
何时使用官方Affiliate Feed:如果你的数据需求是定期获取全量目录和价格(而非实时监控),Shein的官方联盟/affiliate计划可能提供结构化数据Feed,无需自行爬取。这种方式合规风险为零,但数据更新频率可能低于自行采集(通常为每日或每周更新)。对于实时价格监控和竞品分析场景,自行采集仍是更可行的方案。
ProxyHat配置与最佳实践
针对Shein采集场景的ProxyHat配置建议:
- 代理类型:住宅代理(residential)是首选,因为Shein对数据中心IP的封锁更激进。移动代理可作为备选,但成本更高。
- 并发数:建议50-100个并发session,每个session保持在30-40请求/分钟以内。
- 地理定位:根据目标市场选择
-country-US、-country-DE、-country-GB等。查看完整可用地区。 - 协议:HTTP代理(端口8080)适用于大多数场景。若需要更高安全性,可使用SOCKS5(端口1080)。
# SOCKS5配置示例
socks5://user-country-US-session-shein01:pass@gate.proxyhat.com:1080关于成本估算:以每日采集10万商品计算,每商品约2个请求(列表+详情),共20万请求。按ProxyHat住宅代理流量计费,约需5-10 GB/月的数据流量。具体定价请查看ProxyHat定价页面。
更多代理使用场景可参考Web Scraping用例和SERP追踪用例。
关键要点总结
大规模抓取Shein数据的核心策略:
- 优先使用内部JSON API端点(
/api/productInfo、/api/goods_list),而非解析HTML。- 使用
curl_cffi模拟Chrome TLS指纹,配合ProxyHat住宅代理绕过Akamai Bot Manager。- 每个商品采集周期使用sticky session确保货币和价格一致性。
- 控制每IP请求速率在30-40请求/分钟,收到412后立即切换IP。
- 仅采集公开商品数据,遵守robots.txt和CFAA/GDPR合规要求。
- 对于低频全量目录需求,评估官方affiliate feed是否更合适。
常见问题
2026年大规模抓取Shein数据是什么?
指在2026年技术环境下,系统性采集Shein电商平台商品目录、价格、库存等公开数据的过程。与单页手动抓取不同,大规模采集需要处理反爬体系(Akamai Bot Manager)、IP轮换、地理定位、分页遍历和速率控制等工程挑战,通常使用住宅代理和TLS指纹模拟技术实现。
为什么大规模抓取Shein数据对代理用户很重要?
Shein根据访问IP的地理位置本地化价格、货币和库存,单IP请求超过约50次/分钟即触发Akamai封锁。代理用户需要住宅代理实现地理定位(确保采集目标市场的正确价格)和IP轮换(突破速率限制实现规模化采集)。没有高质量代理,大规模采集在技术上几乎不可行。
哪种代理类型最适合大规模抓取Shein数据?
住宅代理(residential proxy)是最佳选择。Shein对数据中心IP的检测和封锁更为激进,而住宅IP来自真实ISP分配的家用宽带,具有更高的信任评分。移动代理也可用但成本更高。建议使用支持sticky session和国家级地理定位的住宅代理服务,如ProxyHat的-country-US和-session-参数。
如何在大规模抓取Shein数据时避免被封锁?
关键策略包括:使用curl_cffi模拟Chrome TLS指纹绕过Akamai网络层检测;每IP控制在30-40请求/分钟以内;使用sticky session确保同一商品采集周期内IP一致;收到412状态码后立即切换新IP并指数退避;配合真实浏览器User-Agent和Referer头;避免固定间隔请求,添加随机延迟。






