在电商数据分析、价格监控和市场调研等场景中,获取淘宝平台的商品数据至关重要。本文将带领你从零开始,接入淘宝关键词搜索 API,实现海量商品数据的采集,并提供完整的代码实现和实践指南。
淘宝 API 接入准备
在接入淘宝 API 之前,需要完成以下准备工作:
- 注册账号:访问注册账号并完成实名认证。
- 创建应用:获取 ApiKey 和 ApiSecret。
- 申请 API 权限:在应用管理中申请
taobao.tbk.dg.material.optional接口的访问权限。 - 安装必要的 Python 库:使用 pip 安装 requests 和其他依赖库。
API 接入核心代码实现
下面是接入淘宝关键词搜索 API 的核心代码实现,包含签名生成、API 调用和数据处理等功能:
import requests
import json
import time
import hashlib
import hmac
from urllib.parse import urlencode
from typing import Dict, Any, List, Optional
class TaobaoAPI:
"""淘宝API客户端"""
def __init__(self, app_key: str, app_secret: str, server_url: str = "https://gw.api.taobao.com/router/rest"):
"""初始化淘宝API客户端
Args:
app_key: 应用的AppKey
app_secret: 应用的AppSecret
server_url: API服务器地址
"""
self.app_key = app_key
self.app_secret = app_secret
self.server_url = server_url
def generate_sign(self, params: Dict[str, Any]) -> str:
"""生成API请求签名
Args:
params: 请求参数
Returns:
签名结果
"""
# 对参数进行排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接参数字符串
sign_str = self.app_secret
for k, v in sorted_params:
sign_str += f"{k}{v}"
sign_str += self.app_secret
# 使用HMAC-SHA1算法生成签名
sign = hmac.new(
self.app_secret.encode("utf-8"),
sign_str.encode("utf-8"),
hashlib.sha1
).hexdigest().upper()
return sign
def call(self, method: str, params: Dict[str, Any]) -> Optional[Dict[str, Any]]:
"""调用淘宝API接口
Args:
method: API方法名
params: 业务参数
Returns:
API返回结果或None
"""
# 公共参数
public_params = {
"app_key": self.app_key,
"method": method,
"format": "json",
"v": "2.0",
"sign_method": "hmac",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
}
# 合并公共参数和业务参数
all_params = {**public_params, **params}
# 生成签名
sign = self.generate_sign(all_params)
all_params["sign"] = sign
# 发送请求
try:
response = requests.post(self.server_url, data=all_params)
response.raise_for_status() # 检查请求是否成功
result = response.json()
return result
except requests.exceptions.RequestException as e:
print(f"请求出错: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON解析出错: {e}")
return None
class TaobaoItemSearch:
"""淘宝商品搜索API"""
def __init__(self, app_key: str, app_secret: str):
"""初始化商品搜索API
Args:
app_key: 应用的AppKey
app_secret: 应用的AppSecret
"""
self.api_client = TaobaoAPI(app_key, app_secret)
def search_items(self, keyword: str, page_no: int = 1, page_size: int = 20,
sort: str = "default", has_coupon: bool = False) -> List[Dict[str, Any]]:
"""搜索商品
Args:
keyword: 搜索关键词
page_no: 页码
page_size: 每页数量
sort: 排序方式,可选值: default(默认), price-asc(价格从低到高),
price-desc(价格从高到低), sale-desc(销量从高到低)
has_coupon: 是否只返回有优惠券的商品
Returns:
商品列表
"""
# 业务参数
params = {
"q": keyword,
"page_no": page_no,
"page_size": page_size,
"sort": sort,
"has_coupon": str(has_coupon).lower(),
"adzone_id": "your_adzone_id", # 推广位ID,需要在淘宝联盟后台获取
}
# 调用API
result = self.api_client.call("taobao.tbk.dg.material.optional", params)
if result:
# 处理返回结果
if "tbk_dg_material_optional_response" in result:
response = result["tbk_dg_material_optional_response"]
if "result_list" in response and "map_data" in response["result_list"]:
items = response["result_list"]["map_data"]
return items
return []
def search_all_pages(self, keyword: str, max_pages: int = 10, page_size: int = 20,
sort: str = "default", has_coupon: bool = False) -> List[Dict[str, Any]]:
"""搜索多页商品数据
Args:
keyword: 搜索关键词
max_pages: 最大搜索页数
page_size: 每页数量
sort: 排序方式
has_coupon: 是否只返回有优惠券的商品
Returns:
所有搜索到的商品列表
"""
all_items = []
for page in range(1, max_pages + 1):
print(f"正在搜索第 {page} 页...")
items = self.search_items(keyword, page, page_size, sort, has_coupon)
if not items:
print(f"第 {page} 页没有找到商品,停止搜索")
break
all_items.extend(items)
# 控制请求频率,避免被限流
time.sleep(1)
print(f"共搜索到 {len(all_items)} 个商品")
return all_items
完整开发流程
以下是使用上述代码接入淘宝 API 的完整开发流程:
- 安装依赖:
pip install requests python-dotenv
2.配置环境变量:
创建.env文件,添加以下内容:
TAOBAO_APP_KEY=你的AppKey
TAOBAO_APP_SECRET=你的AppSecret
3.执行搜索:
python main.py -k "手机" -p 3 --sort price-asc --csv 手机价格数据.csv
开发注意事项与避坑指南
在接入淘宝 API 时,需要注意以下几点:
-
API 权限问题:
- 需要申请
taobao.tbk.dg.material.optional接口的访问权限 - 部分高级功能需要成为会员并绑定推广位
- 需要申请
-
签名生成规则:
- 参数必须按字典序排序
- 签名过程中不要对参数名和参数值进行 URL 编码
- 签名结果需要转换为大写
-
频率限制:
- 免费应用有 QPS 限制,建议每次请求间隔 1 秒以上
- 超出频率限制会返回错误码
isv.access-control-exceed-limit
-
数据解析注意事项:
- 检查返回结果中是否包含预期的字段
- 处理可能的空值或异常数据格式
- 商品图片 URL 可能需要添加协议前缀
-
合规使用:
- 采集的数据仅用于个人学习或合法商业用途
- 避免过度频繁请求,以免影响 API 服务稳定性
- 遵守淘宝开放平台的开发者协议
扩展功能建议
- 数据可视化:使用 Matplotlib 或 Plotly 库将价格分布等数据可视化
- 定时任务:使用 APScheduler 等库实现定时采集数据
- 数据库存储:将数据存入 MySQL 或 MongoDB 等数据库进行长期分析
- 异常处理增强:添加重试机制和更完善的错误处理
通过以上步骤,你可以快速接入淘宝关键词搜索 API,实现海量商品数据的采集和分析。根据实际需求,你还可以进一步扩展功能,构建更强大的电商数据分析系统。