唯品会item_get - 获得vip商品详情深度分析及 Python 实现

唯品会的 item_get 接口是用于获取唯品会平台商品详情的核心接口,能够获取商品的完整信息,包括基础属性、价格、库存、规格、促销活动、店铺信息等。该接口对于电商数据分析、竞品监控、多平台商品对比等场景具有重要价值。 一、接口核心特性分析

  1. 接口功能与定位
  • 核心功能:获取唯品会指定商品的全方位详情数据,包括但不限于商品基本信息、价格体系、库存状态、规格参数、促销活动等

  • 数据特点:返回数据与唯品会 APP / 网页端展示保持一致,包含平台特有的折扣信息、限时活动等

  • 应用场景

    • 电商比价工具:对比不同平台同款商品价格
    • 竞品分析系统:监控竞争对手商品策略
    • 导购平台:为用户提供商品详细信息
    • 数据分析工具:研究电商市场趋势
  1. 认证机制

唯品会开放平台采用 appkey + access_token 的认证方式,具体流程如下:

  • 开发者在唯品会开放平台注册应用,获取 appkeyappsecret
  • 使用 appkeyappsecret 获取 access_token(有有效期限制)
  • 每次接口调用时,在请求头或参数中携带 access_token 进行身份验证
  1. 核心参数与响应结构 请求参数
参数名 类型 是否必填 说明
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']}")

三、接口调用注意事项

  1. 调用限制与规范
  • QPS 限制:唯品会开放平台对 API 调用有严格的 QPS 限制,通常为 10-20 次 / 秒
  • 数据缓存:建议对商品详情数据进行缓存(缓存时间建议 30-60 分钟),减少重复调用
  • 字段筛选 :不需要全部字段时,通过fields参数指定所需字段,提高接口响应速度
  • 合规使用:获取的商品数据需遵守唯品会开放平台的使用规范,不得用于非法用途
  1. 常见错误及解决方案
错误码 说明 解决方案
400 请求参数错误 检查请求参数是否完整、格式是否正确
401 未授权或 token 无效 重新获取 access_token
403 权限不足 检查应用是否已申请相关接口权限
404 商品不存在 确认 goods_id 是否正确有效
429 调用频率超限 降低调用频率,实现请求限流
500 服务器内部错误 稍后重试,或联系唯品会技术支持
  1. 数据解析要点
  • 价格相关字段可能为字符串类型,需要转换为数值类型
  • 图片 URL 可能需要特殊处理才能直接访问
  • 规格数据结构可能较为复杂,需要仔细解析
  • 促销信息可能有多种类型,需要根据业务需求进行分类处理
  • 部分字段可能为 null 或不存在,需要做容错处理

四、应用场景与扩展建议

典型应用场景

  • 电商比价平台:对比不同平台商品价格
  • 竞品分析系统:监控竞争对手商品策略
  • 导购平台:为用户提供详细的商品信息
  • 数据分析工具:分析电商市场趋势和商品特征

扩展建议

  • 实现批量获取商品详情功能,支持多线程并发请求
  • 添加商品价格变化监控,及时获取价格调整信息
  • 结合搜索接口,实现按关键词获取商品列表并查看详情
  • 开发数据导出功能,支持 CSV、Excel 等格式
  • 实现商品详情页面生成功能,用于快速搭建导购平台 通过合理使用唯品会 item_get 接口,开发者可以高效获取唯品会商品的详细数据,为电商运营和数据分析提供有力支持。使用时需遵守唯品会开放平台的相关规定,确保数据使用的合法性和合规性
相关推荐
sinat_267611911 天前
Trae AI 进行 Android 从0 到 1的一键开发
kotlin·android studio·trae
阆遤2 天前
利用TRAE对nanobot进行安全分析并优化
python·安全·ai·trae·nanobot
Molesidy2 天前
【VSCode】VSCode或者Trae的扩展文件夹以及用户设置文件夹的路径更改到指定位置
ide·编辑器·trae
yosh'joy!!2 天前
下载Trae使用
ai·trae
豆包MarsCode3 天前
只需一个指令,让 OpenClaw 安排 TRAE 干活
trae
sugar15693 天前
Trae快速构建自己项目的docker镜像
docker·容器·trae
sugar15693 天前
Trae 添加项目规则,快速完成crmeb项目本地开发环境搭建
docker·容器·trae
欧简墨4 天前
kotlin Android Extensions插件迁移到viewbinding总结
android·trae
arbboter4 天前
【AI编程】约束即设计:AI时代的人机边界重构
ai编程·ai工作流·人机协作·trae·声明式执行·流程编排
进击的雷神6 天前
Trae AI IDE 完全指南:从入门到精通
大数据·ide·人工智能·trae