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

简介: 唯品会 item_get 接口用于获取商品详情,包括基础信息、价格、库存、规格、促销、店铺等数据,适用于电商比价、竞品分析、数据分析等场景。接口需通过 appkey + access_token 认证,支持字段筛选,调用时需注意频率限制与数据合规使用。

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

  1. 接口功能与定位
    核心功能:获取唯品会指定商品的全方位详情数据,包括但不限于商品基本信息、价格体系、库存状态、规格参数、促销活动等
    数据特点:返回数据与唯品会 APP / 网页端展示保持一致,包含平台特有的折扣信息、限时活动等
    应用场景:
    电商比价工具:对比不同平台同款商品价格
    竞品分析系统:监控竞争对手商品策略
    导购平台:为用户提供商品详细信息
    数据分析工具:研究电商市场趋势
  2. 认证机制
    唯品会开放平台采用 appkey + access_token 的认证方式,具体流程如下:
    开发者在唯品会开放平台注册应用,获取 appkey 和 appsecret
    使用 appkey 和 appsecret 获取 access_token(有有效期限制)
    每次接口调用时,在请求头或参数中携带 access_token 进行身份验证
  3. 核心参数与响应结构
    请求参数
    参数名 类型 是否必填 说明
    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 = "https://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"
    })

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"

# 初始化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参数指定所需字段,提高接口响应速度
    合规使用:获取的商品数据需遵守唯品会开放平台的使用规范,不得用于非法用途
  2. 常见错误及解决方案
    错误码 说明 解决方案
    400 请求参数错误 检查请求参数是否完整、格式是否正确
    401 未授权或 token 无效 重新获取 access_token
    403 权限不足 检查应用是否已申请相关接口权限
    404 商品不存在 确认 goods_id 是否正确有效
    429 调用频率超限 降低调用频率,实现请求限流
    500 服务器内部错误 稍后重试,或联系唯品会技术支持
  3. 数据解析要点
    价格相关字段可能为字符串类型,需要转换为数值类型
    图片 URL 可能需要特殊处理才能直接访问
    规格数据结构可能较为复杂,需要仔细解析
    促销信息可能有多种类型,需要根据业务需求进行分类处理
    部分字段可能为 null 或不存在,需要做容错处理
    四、应用场景与扩展建议
    典型应用场景
    电商比价平台:对比不同平台商品价格
    竞品分析系统:监控竞争对手商品策略
    导购平台:为用户提供详细的商品信息
    数据分析工具:分析电商市场趋势和商品特征
    扩展建议
    实现批量获取商品详情功能,支持多线程并发请求
    添加商品价格变化监控,及时获取价格调整信息
    结合搜索接口,实现按关键词获取商品列表并查看详情
    开发数据导出功能,支持 CSV、Excel 等格式
    实现商品详情页面生成功能,用于快速搭建导购平台
    通过合理使用唯品会 item_get 接口,开发者可以高效获取唯品会商品的详细数据,为电商运营和数据分析提供有力支持。使用时需遵守唯品会开放平台的相关规定,确保数据使用的合法性和合规性。
相关文章
|
3月前
|
存储 分布式计算 大数据
基于Python大数据的的电商用户行为分析系统
本系统基于Django、Scrapy与Hadoop技术,构建电商用户行为分析平台。通过爬取与处理海量用户数据,实现行为追踪、偏好分析与个性化推荐,助力企业提升营销精准度与用户体验,推动电商智能化发展。
|
3月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的台风灾害分析及预测系统
针对台风灾害预警滞后、精度不足等问题,本研究基于Python与大数据技术,构建多源数据融合的台风预测系统。利用机器学习提升路径与强度预测准确率,结合Django框架实现动态可视化与实时预警,为防灾决策提供科学支持,显著提高应急响应效率,具有重要社会经济价值。
|
3月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
4月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
356 102
|
4月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
380 104
|
4月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
295 103
|
4月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
218 82
|
3月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
314 3
|
3月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
552 3

推荐镜像

更多