×

淘宝 item_search_img 接口深度分析及 Python 实现

万邦科技Lex 万邦科技Lex 发表于2025-08-29 11:36:52 浏览311 评论0

抢沙发发表评论

注册账号免费测试淘宝图片搜索API接口

淘宝item_get_app接口是淘宝开放平台提供的用于获取淘宝 APP 端商品详情原始数据的接口,相比 PC 端接口,它能返回更贴近移动端展示的商品信息,包括 APP 专属价格、移动端促销活动、APP 端详情页结构等。该接口主要服务于需要对接淘宝移动端商品数据的开发者,适用于电商导购、比价工具、数据分析等场景。

一、接口核心特性分析

1. 接口定位与功能

  • 接口名称item_get_app(淘宝 APP 商品详情获取)

  • 功能:获取淘宝商品在移动端的完整详情数据,包括基础信息、价格、库存、规格、详情页内容、促销活动等

  • 数据特点:返回 APP 端特有的数据结构,与 PC 端item_get接口在字段和格式上有差异

  • 权限要求:需要申请 "商品详情" 相关权限,个人开发者和企业开发者均可申请

2. 认证机制

采用淘宝开放平台统一的appkey + appsecret + session三重认证机制:


  • appkeyappsecret:通过开放平台注册应用获得

  • session:通过用户授权获得的访问令牌,代表用户授权应用访问其数据

  • 签名机制:参数按 ASCII 升序排序后拼接,结合 appsecret 进行 MD5 加密生成签名

3. 核心参数与响应结构

核心请求参数

参数名类型是否必填说明
methodString接口方法名,固定为taobao.item_get_app
app_keyString应用的 appkey
sessionString用户授权 session
timestampString时间戳,格式yyyy-MM-dd HH:mm:ss
signString签名
num_iidString商品 ID
is_promotionString是否获取促销信息,值为 "1" 时获取

响应核心字段

响应数据以item_get_app_response为根节点,主要包含以下几类信息:


  • 商品基础信息:标题、主图、价格、销量、店铺信息等

  • 规格参数:SKU 信息、规格属性、库存等

  • 详情页内容:移动端富文本详情、图片列表等

  • 促销信息:优惠券、满减活动、APP 专享价等

  • 服务信息:售后保障、配送方式等

二、Python 脚本实现

下面是调用item_get_app接口的 Python 实现,包含签名生成、接口调用和数据解析功能:


import requests

import hashlib

import time

import json

import logging

from typing import Dict, Optional


# 配置日志

logging.basicConfig(

    level=logging.INFO,

    format="%(asctime)s - %(levelname)s - %(message)s"

)


class TaobaoItemGetAppAPI:

    def __init__(self, appkey: str, appsecret: str, session: str):

        """

        初始化淘宝item_get_app接口客户端

        :param appkey: 淘宝开放平台appkey

        :param appsecret: 淘宝开放平台appsecret

        :param session: 用户授权session

        """

        self.appkey = appkey

        self.appsecret = appsecret

        self.session = session

        self.base_url = "https://eco.taobao.com/router/rest"

        self.session = requests.Session()


    def _generate_sign(self, params: Dict) -> str:

        """生成淘宝API签名"""

        # 1. 按参数名ASCII升序排序

        sorted_params = sorted(params.items(), key=lambda x: x[0])

        # 2. 拼接为key=value格式

        sign_str = "".join([f"{k}{v}" for k, v in sorted_params])

        # 3. 首尾拼接appsecret并MD5加密

        sign_str = self.appsecret + sign_str + self.appsecret

        return hashlib.md5(sign_str.encode()).hexdigest().upper()


    def _get_timestamp(self) -> str:

        """生成时间戳(yyyy-MM-dd HH:mm:ss)"""

        return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())


    def get_item_details(self, num_iid: str, is_promotion: bool = False) -> Optional[Dict]:

        """

        调用item_get_app接口获取商品详情

        :param num_iid: 商品ID

        :param is_promotion: 是否获取促销信息

        :return: 商品详情数据

        """

        # 构造请求参数

        params = {

            "method": "taobao.item_get_app",

            "app_key": self.appkey,

            "session": self.session,

            "timestamp": self._get_timestamp(),

            "format": "json",

            "v": "2.0",

            "sign_method": "md5",

            "num_iid": num_iid,

            "is_promotion": "1" if is_promotion else "0"

        }


        # 生成签名

        params["sign"] = self._generate_sign(params)


        try:

            # 发送请求

            response = self.session.get(

                self.base_url,

                params=params,

                timeout=15

            )

            response.raise_for_status()

            result = response.json()


            # 处理错误响应

            if "error_response" in result:

                error = result["error_response"]

                logging.error(f"接口错误:{error['msg']}(错误码:{error['code']})")

                return None


            # 提取商品数据

            item_data = result.get("item_get_app_response", {}).get("item", {})

            if not item_data:

                logging.warning("未获取到商品数据")

                return None


            # 格式化返回结果

            return self._format_item_data(item_data)


        except Exception as e:

            logging.error(f"请求异常:{str(e)}")

            return None


    def _format_item_data(self, item_data: Dict) -> Dict:

        """格式化商品数据,提取关键信息"""

        # 提取基础信息

        basic_info = {

            "num_iid": item_data.get("num_iid"),

            "title": item_data.get("title"),

            "desc_short": item_data.get("desc_short"),

            "price": float(item_data.get("price", 0)),

            "orginal_price": float(item_data.get("orginal_price", 0)),

            "sales": int(item_data.get("sales", 0)),

            "total_sold": int(item_data.get("total_sold", 0)),

            "comment_count": int(item_data.get("comment_count", 0)),

            "pic_url": item_data.get("pic_url"),

            "detail_url": item_data.get("detail_url"),

            "is_app_exclusive": item_data.get("is_app_exclusive", False),  # 是否APP专属商品

            "app_exclusive_price": float(item_data.get("app_exclusive_price", 0))  # APP专属价

        }


        # 提取店铺信息

        shop_info = {

            "shop_id": item_data.get("shop_id"),

            "shop_name": item_data.get("shop_name"),

            "shop_type": item_data.get("shop_type"),  # 店铺类型:c2c/b2c

            "seller_id": item_data.get("seller_id"),

            "seller_nick": item_data.get("seller_nick")

        }


        # 提取规格信息

        sku_info = {

            "sku": item_data.get("sku", []),  # SKU列表

            "sku_props": item_data.get("sku_props", []),  # SKU属性

            "props_name": item_data.get("props_name", ""),  # 属性名称

            "stock": int(item_data.get("stock", 0))  # 总库存

        }


        # 提取详情页信息

        detail_info = {

            "detail_image": item_data.get("detail_image", []),  # 详情页图片

            "desc": item_data.get("desc", "")  # 详情页富文本

        }


        # 提取促销信息

        promotion_info = {

            "promotion_price": float(item_data.get("promotion_price", 0)),

            "promotion_type": item_data.get("promotion_type", ""),

            "coupons": item_data.get("coupons", []),  # 优惠券信息

            "activity": item_data.get("activity", "")  # 活动信息

        }


        # 整合所有信息

        return {

            "basic_info": basic_info,

            "shop_info": shop_info,

            "sku_info": sku_info,

            "detail_info": detail_info,

            "promotion_info": promotion_info,

            "raw_data": item_data  # 保留原始数据

        }



# 示例调用

if __name__ == "__main__":

    # 替换为实际参数(从淘宝开放平台获取)

    APPKEY = "your_appkey"

    APPSECRET = "your_appsecret"

    SESSION = "your_session"

    ITEM_ID = "6543217890"  # 淘宝商品ID


    # 初始化API客户端

    api = TaobaoItemGetAppAPI(APPKEY, APPSECRET, SESSION)

    

    # 获取商品详情(包含促销信息)

    item_details = api.get_item_details(ITEM_ID, is_promotion=True)

    

    if item_details:

        # 打印商品基本信息

        print(f"商品ID: {item_details['basic_info']['num_iid']}")

        print(f"商品标题: {item_details['basic_info']['title']}")

        print(f"价格: {item_details['basic_info']['price']}元")

        

        # 若有APP专属价则显示

        if item_details['basic_info']['is_app_exclusive']:

            print(f"APP专属价: {item_details['basic_info']['app_exclusive_price']}元")

            

        print(f"销量: {item_details['basic_info']['sales']}件")

        print(f"店铺: {item_details['shop_info']['shop_name']} ({item_details['shop_info']['shop_type']})")

        

        # 打印促销信息

        if item_details['promotion_info']['coupons']:

            print("\n可用优惠券:")

            for coupon in item_details['promotion_info']['coupons'][:3]:  # 只显示前3个

                print(f"- {coupon.get('title')}: {coupon.get('denomination')}元")

                

        # 打印SKU数量

        print(f"\nSKU数量: {len(item_details['sku_info']['sku'])}")

三、关键技术与避坑指南

1. 图片参数处理要点

  • URL 图片:需确保 URL 为公网可访问(阿里系 CDN 链接最佳),避免使用内网 URL 或需要登录才能访问的图片(如微信相册图片);

  • Base64 图片

    • 必须去掉前缀 data:image/jpeg;base64,,仅保留编码字符串;

    • 图片大小建议≤5MB(过大可能导致请求超时或接口拒绝);

    • 优先使用 JPG 格式(识别成功率高于 PNG/GIF);

  • 图片质量:清晰的商品主图(无水印、无遮挡)识别成功率最高,风景图、模糊图可能返回无结果。

2. 常见错误码与解决方案

错误码错误信息解决方案
10001签名错误检查参数排序(ASCII 升序)、appsecret是否正确、是否遗漏参数(如 timestamp)
218000图片格式错误确保图片为 JPG/PNG/GIF,Base64 编码无多余字符
218001图片不存在或无法访问验证图片 URL 是否有效,本地图片路径是否正确
218002图片识别失败更换清晰的商品主图,避免非商品图片(如人物、风景)
429调用频率超限降低调用频率(默认 QPS=10),实现请求限流(如用time.sleep控制间隔)
110权限不足在淘宝开放平台为应用申请 “item_search_img” 接口权限,等待审核通过

3. 性能与合规优化

  • 请求频率控制:淘宝开放平台对该接口默认 QPS 限制为 10,超过会触发临时封禁(10~30 分钟),建议通过 “请求队列 + 间隔休眠” 控制频率;

  • 数据缓存:相同图片的搜索结果可缓存


群贤毕至

访客