1. 当简单请求遭遇Shopee乱码:问题诊断与反爬机制解析
第一次用Python的Requests库抓取Shopee商品页面时,我盯着返回的乱码数据愣了十分钟——既不是熟悉的HTML结构,也不是预期的JSON响应,而是一堆毫无意义的符号组合。这种经历在电商数据采集领域太常见了,特别是面对Shopee这类东南亚头部电商平台时。
乱码现象背后是平台精心设计的多层防御体系。最表层的问题表现为三种典型症状:
- 直接返回空白HTML框架(只有
<div id="app"></div>这类空壳) - 响应体被替换为逗号分隔的加密字符串(如
1,2,3,45,12,5...) - 返回HTTP 200但内容为验证错误提示
深层原因则涉及Shopee的动态渲染架构和行为验证系统。商品数据通过JavaScript动态加载,核心接口需要携带加密签名参数。更棘手的是,平台会实时检测以下特征:
- 请求头完整性(特别是
sec-ch-ua等现代浏览器头) - TLS指纹(如JA3指纹)
- 鼠标移动轨迹和页面停留时间
- 请求间隔的随机性(人类操作存在自然抖动)
python复制# 典型失败案例:直接请求商品页面
import requests
url = "https://shopee.sg/iPhone-15-Pro-256GB-i.123456.789012345"
response = requests.get(url)
print(response.text[:200]) # 输出可能是: ",1,3,5,2,1..." 或空壳HTML
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逆向工程实战:定位真实数据接口的四种方法
破解乱码困局的关键在于绕过前端渲染,直接获取后端API的原始JSON数据。经过上百次测试,我总结出这些有效方法:
2.1 浏览器开发者工具的网络监听
在Chrome中打开Shopee商品页,按F12进入开发者工具:
- 切换到Network(网络)面板
- 勾选"Preserve log"保留请求记录
- 刷新页面并观察XHR请求
- 筛选包含"item"或"get_detail"的接口
典型的数据接口特征:
- 路径包含
/api/v4/item/get - 响应类型为application/json
- 请求头带有
x-api-source等特殊标记
2.2 移动端API嗅探
Shopee对移动端的反爬策略相对宽松,可通过抓包工具捕获APP通信:
- 使用Charles或Fiddler设置代理
- 在手机网络设置中配置代理
- 过滤包含
mtop.taobao或shopee.api的域名 - 复制请求中的
x-sign等鉴权参数
python复制# 模拟移动端API请求示例
headers = {
"User-Agent": "ShopeeMobile/3.15.1 (iPhone; iOS 16.4)",
"X-Requested-With": "XMLHttpRequest",
"X-Api-Source": "rn" # React Native标识
}
params = {
"itemid": 123456789,
"shopid": 987654321,
"signature": "加密签名需逆向获取"
}
2.3 自动化浏览器的请求拦截
使用Playwright这类现代自动化工具,可以监听网络请求而不触发反爬:
python复制from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
def intercept_respon
