基于Python淘宝商品详情(商品信息主图)API接口

基于 Python 实现淘宝商品详情(含主图)API 接口调用的完整方案,包含接口接入、数据解析、异常处理等核心内容。

注意:淘宝官方 API 需通过阿里开放平台申请权限,本文以通用开放接口为例,实际使用需遵循平台规范。

一、前期准备

  1. 阿里开放平台注册
    • 访问阿里开放平台注册开发者账号,创建应用,获取AppKeyAppSecret
    • 申请taobao.item.get(商品详情)接口权限(需审核)。
  2. 安装依赖库

bash

运行

pip install requests hmac hashlib urllib.parse  # 核心依赖
pip install python-dotenv  # 可选,管理环境变量

二、核心 API 调用代码

1. 基础配置(.env 文件,可选)

env

APP_KEY=你的AppKey
APP_SECRET=你的AppSecret
2. 完整代码实现

python

运行

import requests
import time
import hmac
import hashlib
import urllib.parse
from dotenv import load_dotenv  # 若不用.env可删除
import os

# 加载环境变量(可选)
load_dotenv()

class TaobaoItemAPI:
    """淘宝商品详情API调用类"""
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.gateway_url = "https://eco.taobao.com/router/rest"  # 正式环境网关
        # 沙箱环境网关:https://gw.api.tbsandbox.com/router/rest

    def _generate_sign(self, params):
        """生成API签名(淘宝签名规则)"""
        # 1. 按参数名升序排序
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        # 2. 拼接成key=value格式
        sign_str = ""
        for k, v in sorted_params:
            if v:  # 空值不参与签名
                sign_str += f"{k}{v}"
        # 3. 拼接AppSecret并加密
        sign_str = self.app_secret + sign_str + self.app_secret
        sign = hmac.new(
            self.app_secret.encode("utf-8"),
            sign_str.encode("utf-8"),
            hashlib.md5
        ).hexdigest().upper()
        return sign

    def get_item_detail(self, num_iid, fields=None):
        """
        获取商品详情(含主图)
        :param num_iid: 商品ID(必填)
        :param fields: 需要返回的字段,默认返回核心字段
        :return: 解析后的商品详情字典
        """
        # 默认返回字段(可根据需求扩展)
        if not fields:
            fields = (
                "num_iid,title,pic_url,price,orginal_price,detail_url,"
                "item_imgs,cat_name,brand_name,sell_count,stock"
            )
        
        # 构造请求参数
        params = {
            "method": "taobao.item.get",  # 接口名称
            "app_key": self.app_key,
            "format": "json",
            "v": "2.0",
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
            "sign_method": "md5",
            "num_iid": num_iid,
            "fields": fields
        }

        # 生成签名
        params["sign"] = self._generate_sign(params)

        try:
            # 发送请求
            response = requests.get(
                self.gateway_url,
                params=params,
                timeout=10,
                headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
            )
            response.raise_for_status()  # 抛出HTTP异常
            result = response.json()

            # 处理接口返回
            if "error_response" in result:
                raise Exception(f"接口错误:{result['error_response']['msg']}")
            
            item = result["item_get_response"]["item"]
            return {
                "商品ID": item["num_iid"],
                "商品标题": item["title"],
                "商品主图": item["pic_url"],
                "商品价格": item["price"],
                "原价": item["orginal_price"],
                "商品链接": item["detail_url"],
                "销量": item.get("sell_count", 0),
                "库存": item.get("stock", 0),
                "分类名称": item.get("cat_name", ""),
                "品牌名称": item.get("brand_name", ""),
                "商品图片列表": [img["url"] for img in item.get("item_imgs", [])]
            }

        except requests.exceptions.RequestException as e:
            raise Exception(f"网络请求错误:{str(e)}")
        except Exception as e:
            raise Exception(f"获取商品详情失败:{str(e)}")

# 示例调用
if __name__ == "__main__":
    # 初始化API实例
    api = TaobaoItemAPI(
        app_key=os.getenv("APP_KEY"),  # 或直接填写你的AppKey
        app_secret=os.getenv("APP_SECRET")  # 或直接填写你的AppSecret
    )

    # 调用接口(替换为实际商品ID)
    try:
        item_detail = api.get_item_detail(num_iid="1234567890")
        print("商品详情:")
        for key, value in item_detail.items():
            print(f"{key}: {value}")
        
        # 单独获取主图
        main_image_url = item_detail["商品主图"]
        print(f"\n商品主图URL:{main_image_url}")

        # 下载主图(可选)
        img_response = requests.get(main_image_url, timeout=10)
        with open("taobao_item_main_img.jpg", "wb") as f:
            f.write(img_response.content)
        print("主图已下载到本地:taobao_item_main_img.jpg")

    except Exception as e:
        print(f"错误:{str(e)}")

三、关键说明

1. 接口参数说明
参数名必选说明
num_iid商品 ID(淘宝商品链接中的 ID,如中的 1234567890)
fields需要返回的字段,可参考淘宝开放平台文档
2. 签名规则(核心)

淘宝 API 签名生成步骤:

  1. 将所有请求参数(除 sign 外)按参数名 ASCII 升序排序;
  2. 拼接成key1value1key2value2格式;
  3. 首尾拼接AppSecret,用 MD5 加密后转大写即为 sign。
3. 常见问题
  • 权限不足:需确保应用已申请taobao.item.get接口权限,且账号未被限流;
  • 签名错误:检查参数排序、编码、AppSecret 是否正确;
  • 商品 ID 无效:确认商品 ID 为有效淘宝商品 ID,且商品未下架;
  • 频率限制:淘宝 API 有调用频率限制,需控制调用速度(建议每秒不超过 10 次)。

四、扩展功能

  1. 批量获取商品详情:循环调用get_item_detail方法,注意添加延时避免限流;
  2. 主图批量下载:遍历商品列表,下载主图并按商品 ID 命名;
  3. 数据持久化:将商品详情存入 MySQL/Redis/MongoDB 等数据库;
  4. 异常重试:添加重试机制(如使用tenacity库),处理临时网络错误。

五、合规说明

  1. 调用淘宝 API 需遵守
  2. 商品数据仅可用于合法场景,不得擅自爬取、传播他人商品信息;
  3. 若无需官方 API,可考虑合规的电商数据服务商(需确认资质)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值