在电商数据采集与店铺管理场景中,批量获取淘宝店铺所有商品是核心需求之一。淘宝开放平台提供了标准化 API 接口,支持按店铺、类目、时间等维度拉取商品全量数据,涵盖标题、价格、SKU、库存、销量等关键字段。本文将从接口选型、参数配置、代码实现、数据解析全流程展开讲解,适用于店铺运营、ERP 系统对接、竞品分析等场景。
一、核心主题与适用场景
适用场景
- 店铺商家:批量同步商品至 ERP 系统、库存监控、商品批量上下架
- 竞品分析:抓取竞品店铺商品、价格走势、SKU 规格对比
- 数据聚合:多店铺商品整合、选品工具开发、市场调研
- 开发者:淘宝开放平台 API 接入、通用商品数据接口实现
二、淘宝店铺商品核心 API 接口(官方)
淘宝开放平台提供3 类核心接口用于获取店铺商品,覆盖全量商品、列表商品、搜索商品场景,需注意接口权限差异(商家授权 / 第三方应用权限)。
表格
| 接口名称 | 接口方法名 | 核心能力 | 适用场景 | 权限要求 |
| 店铺商品列表(全量) | taobao.shop.get.items |
按店铺账号获取全量商品,支持分页 | 商家自有店铺商品同步、全店商品采集 | 商家授权(需店铺 token) |
| 批量商品详情查询 | taobao.items.list.get |
批量获取商品详情(单次≤20 个 ID) | 已知商品 ID 批量拉取详情、库存 / 价格监控 | 通用开发者权限 |
| 店铺类目商品查询 | taobao.items.search |
按类目 / 关键词查询店铺商品 | 类目商品筛选、竞品选品分析 | 通用开发者权限 |
| 淘宝客店铺商品 | taobao.tbk.shop.recommend.get |
获取店铺推荐商品(含佣金 / 优惠券) | 淘宝客选品、推广商品采集 | 淘宝客联盟权限 |
重点接口详解
1. taobao.shop.get.items(商家专属全量商品接口)
核心优势:直接获取商家店铺下所有商品,无需手动提取商品 ID,支持按时间、状态筛选(在售 / 售中 / 下架),是商家批量采集的首选接口。
必填参数:
session:店铺授权 token(商家授权获取)nick:店铺账号(卖家昵称)page_no:分页页码(默认 1)page_size:每页条数(最大 200,推荐 100-200)status:商品状态(onsale = 在售,all = 全部)
2. taobao.items.search(通用搜索接口)
核心优势:支持类目 ID、关键词、店铺 ID多维筛选,可精准获取店铺指定类目商品,适合竞品类目分析。
必填参数:
q:关键词 / 店铺 ID(可传店铺昵称精准查询)cat:类目 ID(可选,筛选指定类目)page_no/page_size:分页参数fields:指定返回字段(提升效率)
三、前置准备:获取 API 调用权限
1. 注册淘宝开放平台账号
- 访问:https://open.taobao.com/,用淘宝账号登录
- 完成实名认证(个人 / 企业),进入开发者中心
2. 创建应用并获取密钥
- 开发者中心 → 应用管理 → 创建新应用
- 应用类型选择电商工具 / 数据工具,填写基本信息
- 审核通过后,获取AppKey、AppSecret(核心密钥,需保密)
3. 申请接口权限
- 进入API 权限管理,搜索目标接口(如
taobao.shop.get.items) - 提交权限申请(注明用途:如 “店铺商品批量同步”)
- 等待审核(1-3 个工作日)
4. 获取授权 Token(商家专属接口)
- 商家需通过OAuth2.0 授权,将店铺账号授权给你的应用
- 授权流程:
- 构造授权 URL(替换 AppKey 与回调地址)url
https://oauth.taobao.com/authorize?response_type=code&client_id=你的AppKey&redirect_uri=你的回调地址&view=web
- 店铺账号登录并授权,回调地址返回
code - 用
code换取access_token(授权 token) access_token有效期 30 天,需定期刷新
四、Python 调用淘宝店铺商品 API(完整示例)
以下以获取店铺在售全量商品为例,提供可直接运行的 Python 代码,包含签名生成、请求发送、数据分页、JSON 解析全流程。
1. 环境准备
安装依赖库:
bash
运行
pip install requests
2. 核心代码(商家全量商品接口)
python
运行
import requests import time import json import hashlib class TaobaoShopClient: def __init__(self, app_key, app_secret, access_token): self.app_key = app_key self.app_secret = app_secret self.access_token = access_token self.api_url = "https://eco.taobao.com/router/rest" # 淘宝开放平台网关 def generate_sign(self, params): """生成淘宝API签名(MD5加密)""" # 1. 参数按key字典排序 sorted_params = sorted(params.items()) # 2. 拼接参数串 param_str = "".join([f"{k}{v}" for k, v in sorted_params]) # 3. 前后加AppSecret,MD5加密 sign_str = f"{self.app_secret}{param_str}{self.app_secret}" return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper() def request(self, method, params): """通用API请求方法""" # 公共参数 public_params = { "method": method, "app_key": self.app_key, "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"), "format": "json", "v": "2.0", "sign_method": "md5", "access_token": self.access_token } # 合并公共参数与业务参数 all_params = {**public_params, **params} # 生成签名 all_params["sign"] = self.generate_sign(all_params) try: # 发送POST请求 resp = requests.post(self.api_url, data=all_params, timeout=15) resp.raise_for_status() # 抛出HTTP错误 return resp.json() except Exception as e: return {"error": f"请求失败:{str(e)}"} def get_shop_all_items(self, shop_nick, page_no=1, page_size=200, status="onsale"): """获取淘宝店铺所有商品(分页)""" params = { "nick": shop_nick, # 店铺账号昵称 "page_no": page_no, "page_size": page_size, "status": status, # 在售商品:onsale,全部:all "fields": "num_iid,title,price,sku,stock,volume,category_id,pic_url,publish_time" # 指定返回字段 } return self.request("taobao.shop.get.items", params) def parse_shop_items(self, json_data): """解析店铺商品数据(结构化)""" try: # 淘宝API返回结构:第一层为接口方法名+_response items_response = json_data.get("taobao_shop_get_items_response", {}) result = items_response.get("shop_item_get_response", {}) total_results = result.get("total_results", 0) # 商品总数 items = result.get("items", {}).get("item", []) # 商品列表 # 结构化解析 parsed_items = [] for item in items: parsed_items.append({ "商品ID": item.get("num_iid"), "商品标题": item.get("title"), "售价": item.get("price"), "库存": item.get("stock", 0), "销量": item.get("volume", 0), "类目ID": item.get("category_id"), "主图": item.get("pic_url"), "发布时间": item.get("publish_time"), "SKU": item.get("sku", "") # SKU详情需单独解析 }) return { "total": total_results, "items": parsed_items } except Exception as e: return {"error": f"解析失败:{str(e)}"} # ===================== 配置信息(替换为自己的) ===================== APP_KEY = "你的淘宝开放平台AppKey" APP_SECRET = "你的淘宝开放平台AppSecret" ACCESS_TOKEN = "店铺授权获取的access_token" SHOP_NICK = "目标店铺账号昵称" # 如:xx旗舰店 # 初始化客户端 client = TaobaoShopClient(APP_KEY, APP_SECRET, ACCESS_TOKEN) # ===================== 批量获取全店商品 ===================== if __name__ == "__main__": all_items = [] total_items = 0 page = 1 # 循环获取所有分页数据 while True: print(f"正在获取第 {page} 页商品...") # 获取当前页商品 response = client.get_shop_all_items(SHOP_NICK, page_no=page, page_size=200) # 解析数据 parsed_data = client.parse_shop_items(response) if "error" in parsed_data: print(f"获取失败:{parsed_data['error']}") break # 累加商品数据 items = parsed_data["items"] if not items: break all_items.extend(items) total_items = parsed_data["total"] # 分页终止条件:当前页商品数 < 每页条数,或已获取全部 if len(items) < 200: break page += 1 time.sleep(1) # 限流,避免触发平台风控 # 输出结果 print(f"共获取 {total_items} 个商品,实际解析 {len(all_items)} 个") # 保存至JSON文件 with open("taobao_shop_items.json", "w", encoding="utf-8") as f: json.dump(all_items, f, ensure_ascii=False, indent=2) print("商品数据已保存至 taobao_shop_items.json")
3. 通用商品解析(第三方应用 / 非商家场景)
若无需商家授权,可通过 **taobao.items.search** 接口,按店铺关键词查询商品:
python
运行
def get_shop_items_by_search(shop_nick, page_no=1, page_size=100): """通过搜索接口获取店铺商品(非商家授权)""" params = { "q": shop_nick, # 店铺昵称作为关键词 "page_no": page_no, "page_size": page_size, "fields": "num_iid,title,price,volume,pic_url" } return client.request("taobao.items.search", params) # 调用示例 search_response = get_shop_items_by_search("xx旗舰店") print(search_response)
五、关键参数与字段说明
1. 核心返回字段(店铺商品)
表格
| 字段 | 含义 | 解析方式 |
num_iid |
商品唯一 ID | 直接取值,用于后续详情查询 |
title |
商品标题 | 包含品牌、型号、规格等信息 |
price |
商品售价 | 字符串类型,需转 float 计算 |
stock |
库存数量 | 商家接口返回真实库存,第三方接口可能为空 |
volume |
销量 | 30 天销量 / 总销量(平台规则) |
sku |
SKU 规格信息 | 需单独解析,包含颜色、尺寸、内存等 |
pic_url |
主图链接 | 可直接访问的商品主图 |
category_id |
类目 ID | 用于商品分类归类 |
publish_time |
发布时间 | 商品上架时间 |
2. 分页参数
page_no:页码,从 1 开始page_size:每页条数,淘宝 API 最大支持200 条 / 页,推荐 100-200,平衡请求效率与响应体积- 分页终止:当返回的商品列表为空,或商品总数 ≤ (页码 - 1)* 每页条数时,停止采集
六、限流与风控规避(重要)
淘宝 API 对接口调用频率有严格限制,需遵守以下规则避免封禁:
- 频率限制:
- 个人开发者:QPS≤2,日调用量≤1000
- 企业开发者:QPS≤50,日调用量≤10000(可申请提升)
- 商家专属接口:按店铺授权额度限制,建议1 秒 1 次
- 限流处理:
- 遇
429(限流)、10003(频率超限)错误,立即停止请求,指数退避重试(1s→2s→4s→8s) - 批量采集时,每获取 1 页数据,休眠 1-2 秒
- IP 与设备风控:
- 避免单 IP 高频请求,商用场景建议使用静态代理 IP
- 多店铺采集时,轮换不同 AppKey / 设备信息
七、常见问题与解决方案
- 权限不足(403 错误)
- 原因:未申请接口权限、授权 token 失效
- 解决:在开放平台补全接口权限,重新获取 access_token
- 接口返回空数据
- 原因:店铺无在售商品、分页参数错误、店铺昵称错误
- 解决:核对店铺账号,调整
page_no/status参数
- SKU 数据缺失
- 原因:未在
fields中指定sku字段 - 解决:请求时
fields添加sku参数,单独解析 SKU 数组
- 数据量过大(超 10 万条)
- 原因:店铺商品数过多,单脚本采集效率低
- 解决:分布式采集(多线程 / 多进程)、分时段采集、增量更新(仅获取新增 / 修改商品)
八、扩展方向
- 数据存储:将解析后的商品数据存入MySQL/PostgreSQL,建立商品数据表,支持快速查询
- 实时监控:结合定时任务(如 APScheduler),定期采集店铺商品,实现价格、库存变动监控
- SKU 精细化解析:单独调用
taobao.item.sku.get接口,获取 SKU 详细规格、价格、库存 - 跨平台整合:结合京东、拼多多 API,实现多平台店铺商品统一管理
九、合规声明
- 淘宝 API 数据采集需遵守淘宝开放平台用户协议,仅用于合法商业 / 学习场景,禁止批量倒卖数据、破坏平台规则
- 非商家授权采集竞品商品时,需控制频率,避免对平台服务器造成压力
- 商用场景建议联系淘宝商务,获取官方授权接口,降低合规风险