唯品会的 item_get
接口是用于获取唯品会平台商品详情的核心接口,能够获取商品的完整信息,包括基础属性、价格、库存、规格、促销活动、店铺信息等。该接口对于电商数据分析、竞品监控、多平台商品对比等场景具有重要价值。 一、接口核心特性分析
- 接口功能与定位
-
核心功能:获取唯品会指定商品的全方位详情数据,包括但不限于商品基本信息、价格体系、库存状态、规格参数、促销活动等
-
数据特点:返回数据与唯品会 APP / 网页端展示保持一致,包含平台特有的折扣信息、限时活动等
-
应用场景:
- 电商比价工具:对比不同平台同款商品价格
- 竞品分析系统:监控竞争对手商品策略
- 导购平台:为用户提供商品详细信息
- 数据分析工具:研究电商市场趋势
- 认证机制
唯品会开放平台采用 appkey + access_token
的认证方式,具体流程如下:
- 开发者在唯品会开放平台注册应用,获取
appkey
和appsecret
- 使用
appkey
和appsecret
获取access_token
(有有效期限制) - 每次接口调用时,在请求头或参数中携带
access_token
进行身份验证
- 核心参数与响应结构 请求参数
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
goods_id |
String | 是 | 商品 ID,可从唯品会商品详情页 URL 中获取 |
access_token |
String | 是 | 访问令牌 |
fields |
String | 否 | 需要返回的字段,多个字段用逗号分隔,默认返回所有字段 |
响应核心字段
- 商品基础信息:商品 ID、名称、主图、详情图、品牌信息等
- 价格信息:原价、唯品会价、折扣率、会员价等
- 库存信息:总库存、规格库存、库存状态等
- 规格参数:规格名称、规格值、对应的价格和库存等
- 促销信息:活动类型、优惠方式、活动时间等
- 店铺信息:店铺 ID、名称、评分、所在地等
- 物流信息:运费、发货地、配送方式等
二、Python 脚本实现
以下是调用唯品会 item_get
接口的完整 Python 实现,包含令牌获取、接口调用、数据解析等功能:
import requests import time import json import logging import hashlib from typing import Dict, Optional, List from requests.exceptions import RequestException
配置日志 logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" )
class VipItemAPI: def init (self, appkey: str, appsecret: str): """ 初始化唯品会API客户端 :param appkey: 唯品会开放平台appkey :param appsecret: 唯品会开放平台appsecret """ self.appkey = appkey self.appsecret = appsecret self.base_url = "api.vip.com" self.access_token = None self.token_expires_at = 0 # token过期时间戳 self.session = requests.Session() # 设置默认请求头 self.session.headers.update({ "Content-Type": "application/json", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" })
python
def _get_access_token(self) -> Optional[str]:
"""获取访问令牌"""
# 检查token是否有效
if self.access_token and self.token_expires_at > time.time() + 60:
return self.access_token
logging.info("获取新的access_token")
url = f"{self.base_url}/oauth2/token"
params = {
"grant_type": "client_credentials",
"client_id": self.appkey,
"client_secret": self.appsecret
}
try:
response = self.session.get(url, params=params, timeout=10)
response.raise_for_status()
result = response.json()
if "access_token" in result:
self.access_token = result["access_token"]
self.token_expires_at = time.time() + result.get("expires_in", 3600)
return self.access_token
else:
logging.error(f"获取access_token失败: {result.get('error_description', '未知错误')}")
return None
except RequestException as e:
logging.error(f"获取access_token请求异常: {str(e)}")
return None
def get_item_details(self, goods_id: str, fields: Optional[str] = None) -> Optional[Dict]:
"""
获取商品详情
:param goods_id: 商品ID
:param fields: 需要返回的字段,多个用逗号分隔
:return: 商品详情数据
"""
# 获取有效的access_token
if not self._get_access_token():
return None
url = f"{self.base_url}/item/get"
# 构建请求参数
params = {
"goods_id": goods_id,
"access_token": self.access_token
}
# 添加需要返回的字段
if fields:
params["fields"] = fields
try:
response = self.session.get(url, params=params, timeout=15)
response.raise_for_status()
result = response.json()
# 检查响应状态
if result.get("code") == 0:
# 格式化商品数据
return self._format_item_data(result.get("data", {}))
else:
logging.error(f"获取商品详情失败: {result.get('message', '未知错误')} (错误码: {result.get('code')})")
return None
except RequestException as e:
logging.error(f"获取商品详情请求异常: {str(e)}")
return None
except json.JSONDecodeError:
logging.error(f"商品详情响应解析失败: {response.text[:200]}...")
return None
def _format_item_data(self, item_data: Dict) -> Dict:
"""格式化商品数据"""
# 基础信息
basic_info = {
"goods_id": item_data.get("goods_id"),
"title": item_data.get("title"),
"sub_title": item_data.get("sub_title"),
"brand": {
"brand_id": item_data.get("brand_id"),
"brand_name": item_data.get("brand_name")
},
"main_images": item_data.get("main_images", []),
"detail_images": item_data.get("detail_images", []),
"detail_url": item_data.get("detail_url"),
"category": {
"category_id": item_data.get("category_id"),
"category_name": item_data.get("category_name"),
"parent_category_id": item_data.get("parent_category_id"),
"parent_category_name": item_data.get("parent_category_name")
}
}
# 价格信息
price_info = {
"original_price": float(item_data.get("original_price", 0)),
"vip_price": float(item_data.get("vip_price", 0)),
"discount": float(item_data.get("discount", 0)),
"member_price": float(item_data.get("member_price", 0)) if item_data.get("has_member_price") else None,
"has_member_price": item_data.get("has_member_price", False)
}
# 库存信息
stock_info = {
"total_stock": int(item_data.get("total_stock", 0)),
"sales_count": int(item_data.get("sales_count", 0)),
"is_in_stock": item_data.get("is_in_stock", False),
"limit_buy_count": int(item_data.get("limit_buy_count", 0)) # 限购数量
}
# 规格信息
sku_info = {
"has_sku": item_data.get("has_sku", False),
"sku_list": []
}
# 处理规格数据
if sku_info["has_sku"] and "skus" in item_data:
for sku in item_data["skus"]:
sku_info["sku_list"].append({
"sku_id": sku.get("sku_id"),
"specs": sku.get("specs", []), # 规格组合,如["红色", "XL"]
"price": float(sku.get("price", 0)),
"original_price": float(sku.get("original_price", 0)),
"stock": int(sku.get("stock", 0)),
"image": sku.get("image")
})
# 促销信息
promotion_info = {
"promotions": item_data.get("promotions", []), # 促销活动列表
"start_time": item_data.get("promotion_start_time"),
"end_time": item_data.get("promotion_end_time"),
"is_promotion": item_data.get("is_promotion", False)
}
# 店铺信息
shop_info = {
"shop_id": item_data.get("shop_id"),
"shop_name": item_data.get("shop_name"),
"shop_type": item_data.get("shop_type"),
"score": float(item_data.get("shop_score", 0)),
"sales_volume": item_data.get("shop_sales_volume")
}
# 物流信息
logistics_info = {
"freight": float(item_data.get("freight", 0)),
"freight_free_threshold": float(item_data.get("freight_free_threshold", 0)),
"delivery_place": item_data.get("delivery_place"),
"shipping_methods": item_data.get("shipping_methods", [])
}
return {
"basic_info": basic_info,
"price_info": price_info,
"stock_info": stock_info,
"sku_info": sku_info,
"promotion_info": promotion_info,
"shop_info": shop_info,
"logistics_info": logistics_info,
"raw_data": item_data # 保留原始数据
}
示例调用
if name == "main": # 替换为实际的appkey和appsecret(从唯品会开放平台获取) APPKEY = "your_appkey" APPSECRET = "your_appsecret" # 替换为目标商品ID GOODS_ID = "12345678"
python
# 初始化API客户端
api = VipItemAPI(APPKEY, APPSECRET)
# 获取商品详情(可以指定需要返回的字段,如:"goods_id,title,vip_price,stock")
item_details = api.get_item_details(GOODS_ID)
if item_details:
print(f"=== 商品详情 ===")
print(f"商品ID: {item_details['basic_info']['goods_id']}")
print(f"商品标题: {item_details['basic_info']['title']}")
print(f"品牌: {item_details['basic_info']['brand']['brand_name']}")
print(f"原价: {item_details['price_info']['original_price']}元")
print(f"唯品会价: {item_details['price_info']['vip_price']}元")
print(f"折扣: {item_details['price_info']['discount']}折")
if item_details['price_info']['has_member_price']:
print(f"会员价: {item_details['price_info']['member_price']}元")
print(f"库存: {item_details['stock_info']['total_stock']}")
print(f"销量: {item_details['stock_info']['sales_count']}")
print(f"店铺: {item_details['shop_info']['shop_name']}")
if item_details['promotion_info']['is_promotion']:
print(f"\n促销活动:")
for promo in item_details['promotion_info']['promotions'][:2]:
print(f"- {promo.get('name')}")
if item_details['sku_info']['has_sku']:
print(f"\n规格数量: {len(item_details['sku_info']['sku_list'])}")
for i, sku in enumerate(item_details['sku_info']['sku_list'][:3], 1):
print(f" 规格{i}: {','.join(sku['specs'])} - {sku['price']}元 - 库存{sku['stock']}")
三、接口调用注意事项
- 调用限制与规范
- QPS 限制:唯品会开放平台对 API 调用有严格的 QPS 限制,通常为 10-20 次 / 秒
- 数据缓存:建议对商品详情数据进行缓存(缓存时间建议 30-60 分钟),减少重复调用
- 字段筛选 :不需要全部字段时,通过
fields
参数指定所需字段,提高接口响应速度 - 合规使用:获取的商品数据需遵守唯品会开放平台的使用规范,不得用于非法用途
- 常见错误及解决方案
错误码 | 说明 | 解决方案 |
---|---|---|
400 | 请求参数错误 | 检查请求参数是否完整、格式是否正确 |
401 | 未授权或 token 无效 | 重新获取 access_token |
403 | 权限不足 | 检查应用是否已申请相关接口权限 |
404 | 商品不存在 | 确认 goods_id 是否正确有效 |
429 | 调用频率超限 | 降低调用频率,实现请求限流 |
500 | 服务器内部错误 | 稍后重试,或联系唯品会技术支持 |
- 数据解析要点
- 价格相关字段可能为字符串类型,需要转换为数值类型
- 图片 URL 可能需要特殊处理才能直接访问
- 规格数据结构可能较为复杂,需要仔细解析
- 促销信息可能有多种类型,需要根据业务需求进行分类处理
- 部分字段可能为 null 或不存在,需要做容错处理
四、应用场景与扩展建议
典型应用场景
- 电商比价平台:对比不同平台商品价格
- 竞品分析系统:监控竞争对手商品策略
- 导购平台:为用户提供详细的商品信息
- 数据分析工具:分析电商市场趋势和商品特征
扩展建议
- 实现批量获取商品详情功能,支持多线程并发请求
- 添加商品价格变化监控,及时获取价格调整信息
- 结合搜索接口,实现按关键词获取商品列表并查看详情
- 开发数据导出功能,支持 CSV、Excel 等格式
- 实现商品详情页面生成功能,用于快速搭建导购平台 通过合理使用唯品会
item_get
接口,开发者可以高效获取唯品会商品的详细数据,为电商运营和数据分析提供有力支持。使用时需遵守唯品会开放平台的相关规定,确保数据使用的合法性和合规性。