一、核心接口与权限准备
-
关键接口
taobao.items.onsale.get
:获取店铺在售商品列表(含价格、库存、销量等核心字段)。taobao.items.inventory.get
:获取仓库中商品(未上架商品)。taobao.shop.get
:通过店铺昵称获取店铺ID(需先调用此接口获取seller_id
)。
-
权限申请流程
-
注册开发者账号 :访问淘宝开放平台,完成企业实名认证(个人开发者需芝麻信用650分以上)。
-
创建应用:选择"自用型"应用,申请"电商基础API"权限包(含商品、订单等接口)。
-
获取三元组:
app_key
:应用唯一标识。app_secret
:加密密钥(需保密)。session_key
:通过OAuth2.0授权获取(需店铺管理员扫码授权,有效期30天)。
-
二、API调用实战步骤
1. 获取店铺ID
python
python
import requests
import time
import hashlib
def get_shop_id(app_key, app_secret, seller_nick):
method = "taobao.shop.get"
params = {
"app_key": app_key,
"method": method,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "2.0",
"sign_method": "hmac",
"seller_nick": seller_nick,
"fields": "seller_id" # 仅需返回店铺ID
}
# 生成HMAC_MD5签名
sorted_params = sorted(params.items(), key=lambda x: x[0])
raw_str = ''.join([f"{k}{v}" for k, v in sorted_params]) + app_secret
sign = hashlib.md5(raw_str.encode()).hexdigest().upper()
params["sign"] = sign
response = requests.post(
"https://eco.taobao.com/router/rest",
data=params,
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
return response.json()["shop_get_response"]["shop"]["seller_id"]
# 示例调用
seller_nick = "示例店铺" # 替换为目标店铺昵称
app_key = "你的AppKey"
app_secret = "你的AppSecret"
shop_id = get_shop_id(app_key, app_secret, seller_nick)
print(f"店铺ID: {shop_id}")
2. 分页获取在售商品
python
python
def get_shop_items(app_key, app_secret, session_key, seller_id, page_no=1, page_size=100):
method = "taobao.items.onsale.get"
params = {
"app_key": app_key,
"method": method,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "2.0",
"sign_method": "hmac",
"session": session_key, # 店铺授权token
"seller_id": seller_id,
"page_no": page_no,
"page_size": page_size,
"fields": "num_iid,title,price,pic_url,quantity,modified" # 自定义返回字段
}
# 生成签名(同上)
sorted_params = sorted(params.items(), key=lambda x: x[0])
raw_str = ''.join([f"{k}{v}" for k, v in sorted_params]) + app_secret
sign = hashlib.md5(raw_str.encode()).hexdigest().upper()
params["sign"] = sign
response = requests.post(
"https://eco.taobao.com/router/rest",
data=params,
headers={"Content-Type": "application/x-www-form-urlencoded"}
)
return response.json()
# 示例调用
session_key = "你的SessionKey" # 通过OAuth2.0获取
items_data = get_shop_items(app_key, app_secret, session_key, shop_id)
print(f"第1页商品数: {len(items_data['items_onsale_get_response']['items']['item'])}")
3. 自动翻页获取全部商品
python
python
def get_all_shop_items(app_key, app_secret, session_key, seller_id, page_size=100):
all_items = []
page_no = 1
while True:
items_data = get_shop_items(app_key, app_secret, session_key, seller_id, page_no, page_size)
if "error_response" in items_data:
print(f"错误: {items_data['error_response']['msg']}")
break
items = items_data["items_onsale_get_response"]["items"]["item"]
if not items:
break
all_items.extend(items)
total_results = items_data["items_onsale_get_response"]["total_results"]
print(f"已获取 {len(all_items)}/{total_results} 个商品")
if len(all_items) >= total_results:
break
page_no += 1
time.sleep(1) # 避免触发限流
return all_items
# 示例调用
all_items = get_all_shop_items(app_key, app_secret, session_key, shop_id)
with open("shop_items.json", "w", encoding="utf-8") as f:
import json
json.dump(all_items, f, ensure_ascii=False, indent=2)
print("商品数据已保存至 shop_items.json")
三、关键注意事项
-
签名算法
- 淘宝API要求使用
HMAC_MD5
或MD5
签名,参数需按ASCII码升序排列,时间戳格式为YYYY-MM-DD HH:MM:SS
。
- 淘宝API要求使用
-
分页与限流
- 单页最多返回200条商品,建议设置
page_size=100
以平衡效率与稳定性。 - 每次请求间隔≥1秒,避免触发QPS限制(默认50次/秒)。
- 单页最多返回200条商品,建议设置
-
错误处理
- 权限不足 :检查
session_key
是否过期或API未授权。 - 签名失败:确认参数排序和签名算法正确。
- 网络超时:设置重试机制(如最多重试3次)。
- 权限不足 :检查
-
数据存储
- 将商品ID、标题、价格等核心字段存入数据库(如MySQL),图片URL可单独存储至对象存储(如OSS)。
四、合规性要求
- 禁止爬虫:淘宝明确禁止绕过API直接爬取网页数据,违规可能导致IP封禁或法律诉讼。
- 数据使用限制:不得将商品数据用于转售或未经授权的竞品分析。
- 隐私保护:买家昵称、收货地址等敏感字段需脱敏处理。
五、扩展应用场景
- 竞品监控:定时抓取商品价格、销量,分析对手策略。
- 选品系统:结合关键词API筛选高销量、低差评商品。
- 库存预警:实时同步SKU库存,低于阈值时自动通知。