为何httpx请求Shopee API返回价格与网页显示不一致?
问题原因及解决办法
原因分析
- 地域/会话差异:Shopee会根据请求的IP地域、用户会话(Cookie)、语言偏好返回对应区域的定价。你的httpx请求是无状态的,没有携带浏览器中的地域标识、会话Cookie等信息,API返回的是默认/其他区域的价格,和浏览器中印尼区域的定价不一致。
- 缺少关键请求头:除了User-Agent,Shopee的API需要额外的头信息来验证请求合法性并识别区域,比如语言头、来源头、Referer等,缺失这些会导致返回非目标数据。
- 会话令牌缺失:原商品URL中的
sp_atk是Shopee的会话验证令牌,浏览器请求时会自动携带相关会话信息(Cookie中包含),而你的httpx请求未携带,导致API返回非用户会话对应的价格。
解决步骤
1. 补充完整请求头
从浏览器的网络请求中复制Shopee API请求的完整头信息,至少添加以下关键头:
headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36", "Accept-Language": "id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7", "x-api-source": "pc", "Referer": "https://shopee.co.id/S-B-Golden-Curry-Bumbu-Kari-Japanese-Curry-Mix-Medium-Hot-220-gr-i.65323877.3343602079?sp_atk=0b471505-cfca-491b-b7a2-453d455eecf6&xptdk=0b471505-cfca-491b-b7a2-453d455eecf6", "Cookie": "这里粘贴浏览器中Shopee站点的Cookie内容" }
注意:Cookie需要从浏览器登录Shopee印尼站后复制,有效期内有效。
2. 确保请求IP为印尼地域
如果你的服务器不在印尼,需要使用印尼地区的代理IP,否则Shopee会根据IP返回对应区域的价格。修改httpx请求添加代理:
proxies = { "http://": "http://your-indonesia-proxy:port", "https://": "http://your-indonesia-proxy:port" } resp = httpx.get(url, headers=headers, proxies=proxies)
3. 验证价格单位(可选)
Shopee部分API返回的价格是以微印尼盾为单位(即实际价格 × 1000000),但你的情况中数值差异主要由地域/会话导致,不过可以验证:将返回的price除以1000000,看是否符合实际价格。
4. 使用正确的API参数
确保API请求的shopid和itemid与商品页面一致,同时可以尝试在请求参数中添加sp_atk令牌:
url = f"https://shopee.co.id/api/v4/item/get?shopid=65323877&itemid=3343602079&sp_atk=0b471505-cfca-491b-b7a2-453d455eecf6"
内容的提问来源于stack exchange,提问作者Hal
相关产品推荐
相关产品推荐

