在电商运营、数据分析和竞品监控等场景中,实时获取淘宝商品数据至关重要。本文将详细介绍如何通过淘宝API 高效获取商品实时数据,并提供完整的代码实现方案。
一、API 接入基础
1. 注册与认证
首先需要完成开发者注册:
- 注册账号:登录
- 创建应用:在控制台创建 Web 应用,获取
ApiKey
和ApiSecret
- 申请权限:申请
taobao.item_get
等相关 API 权限
2. API 请求基础
淘宝 API 采用 RESTful 架构,请求流程包括:
- 使用 HTTPS 协议发送请求
- 所有参数需要 URL 编码
- 请求参数需要签名验证
- 响应格式支持 JSON/XML
二、核心代码实现
以下是使用 Python 实现的淘宝 API 客户端,包含签名生成、请求发送和结果解析功能:
import hashlib
import time
import requests
import json
from typing import Dict, List, Optional
class TaobaoAPI:
"""淘宝开放平台API客户端"""
def __init__(self, app_key: str, app_secret: str, format: str = "json"):
self.app_key = app_key
self.app_secret = app_secret
self.format = format
self.base_url = "https://eco.taobao.com/router/rest"
self.session = requests.Session()
def generate_sign(self, params: Dict) -> str:
"""生成API请求签名"""
# 1. 参数排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数
sign_str = self.app_secret
for k, v in sorted_params:
sign_str += f"{k}{v}"
sign_str += self.app_secret
# 3. MD5加密
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def execute(self, method: str, params: Dict) -> Optional[Dict]:
"""执行API请求"""
# 公共参数
common_params = {
"method": method,
"app_key": self.app_key,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": self.format,
"v": "2.0",
"sign_method": "md5"
}
# 合并参数
all_params = {**common_params, **params}
# 生成签名
all_params["sign"] = self.generate_sign(all_params)
# 发送请求
try:
response = self.session.get(self.base_url, params=all_params, timeout=10)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON解析错误: {e}")
return None
def get_item_detail(self, item_id: str, fields: str = "") -> Optional[Dict]:
"""获取商品详情"""
if not fields:
fields = "num_iid,title,price,promotion_price,item_url,desc_short,seller_id,nick,brand_name,cid"
params = {
"num_iid": item_id,
"fields": fields
}
result = self.execute("taobao.item_get", params)
if result and "item_get_response" in result:
return result["item_get_response"].get("item", {})
return None
def get_item_list(self, item_ids: List[str], fields: str = "") -> List[Dict]:
"""批量获取商品详情"""
results = []
for item_id in item_ids:
item_data = self.get_item_detail(item_id, fields)
if item_data:
results.append(item_data)
# 控制请求频率,避免限流
time.sleep(0.5)
return results
三、数据采集实战
1. 单商品数据获取
# 使用示例
if __name__ == "__main__":
# 替换为你的AppKey和AppSecret
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
api = TaobaoAPI(APP_KEY, APP_SECRET)
# 获取单个商品详情
item_id = "612345678901" # 示例商品ID
item_data = api.get_item_detail(item_id)
if item_data:
print(f"商品标题: {item_data.get('title')}")
print(f"价格: {item_data.get('price')}")
print(f"促销价: {item_data.get('promotion_price')}")
else:
print("获取商品详情失败")
2. 批量数据采集
def batch_collect_items(item_ids: List[str], output_file: str) -> None:
"""批量采集商品数据并保存到文件"""
api = TaobaoAPI(APP_KEY, APP_SECRET)
all_items = []
try:
print(f"开始采集商品数据,共{len(item_ids)}个商品")
for i, item_id in enumerate(item_ids):
print(f"正在采集第{i+1}/{len(item_ids)}个商品: {item_id}")
item_data = api.get_item_detail(item_id)
if item_data:
all_items.append(item_data)
print(f"商品 {item_id} 采集成功")
else:
print(f"商品 {item_id} 采集失败")
# 控制请求频率
time.sleep(0.5)
# 保存数据
with open(output_file, "w", encoding="utf-8") as f:
json.dump(all_items, f, ensure_ascii=False, indent=2)
print(f"数据采集完成,已保存到 {output_file}")
except Exception as e:
print(f"采集过程中发生错误: {e}")
# 保存已采集的数据
with open(f"{output_file}.partial", "w", encoding="utf-8") as f:
json.dump(all_items, f, ensure_ascii=False, indent=2)
print(f"已将部分数据保存到 {output_file}.partial")
四、高级功能实现
1. 商品价格监控
import sqlite3
from datetime import datetime
class PriceMonitor:
"""商品价格监控系统"""
def __init__(self, db_path: str = "price_monitor.db"):
self.db_path = db_path
self.init_db()
def init_db(self) -> None:
"""初始化数据库"""
conn = sqlite3.connect(self.db_path)
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS item_prices
(item_id TEXT, title TEXT, price REAL, promotion_price REAL, record_time TEXT)''')
conn.commit()
conn.close()
def record_price(self, item_id: str, title: str, price: float, promotion_price: float) -> None:
"""记录商品价格"""
conn = sqlite3.connect(self.db_path)
c = conn.cursor()
record_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
c.execute("INSERT INTO item_prices VALUES (?, ?, ?, ?, ?)",
(item_id, title, price, promotion_price, record_time))
conn.commit()
conn.close()
def get_price_history(self, item_id: str) -> List[Dict]:
"""获取商品价格历史"""
conn = sqlite3.connect(self.db_path)
c = conn.cursor()
c.execute("SELECT * FROM item_prices WHERE item_id=?", (item_id,))
rows = c.fetchall()
conn.close()
history = []
for row in rows:
history.append({
"item_id": row[0],
"title": row[1],
"price": row[2],
"promotion_price": row[3],
"record_time": row[4]
})
return history
# 使用示例
def monitor_price(item_id: str) -> None:
api = TaobaoAPI(APP_KEY, APP_SECRET)
monitor = PriceMonitor()
item_data = api.get_item_detail(item_id)
if item_data:
monitor.record_price(
item_id=item_id,
title=item_data.get("title", ""),
price=float(item_data.get("price", 0)),
promotion_price=float(item_data.get("promotion_price", 0))
)
print(f"商品 {item_id} 价格记录成功")
else:
print(f"商品 {item_id} 价格记录失败")
五、性能优化与注意事项
-
API 限流处理
- 普通应用 QPS 限制为 1-5 次 / 秒
- 使用指数退避算法处理限流:
time.sleep(2**retry_count)
-
数据缓存策略
- 短期高频访问的数据使用内存缓存(如 Redis)
- 定期更新缓存数据,避免数据过期
-
异常处理机制
- 添加请求重试逻辑(建议 3 次)
- 记录详细的错误日志,便于排查问题
-
合规性要求
- 遵守淘宝开放平台 API 使用规范
- 不进行恶意爬取,合理控制请求频率
- 仅用于合法商业用途
六、总结
通过本文介绍的 API 接入方法和代码实现,你可以高效获取淘宝商品的实时数据。根据业务需求,你还可以进一步扩展功能,如添加定时监控任务、构建数据分析仪表盘等。在实际应用中,要特别注意 API 限流和数据合规性问题,确保系统稳定运行。