淘宝关键词搜索 API 是电商应用中常用的功能之一,可帮助开发者获取与关键词匹配的商品列表。以下是针对该 API 的深度解析与完整示例:
一、核心 API 接口选择
- 推荐接口:taobao.items.search
功能:通过关键词搜索淘宝商品,支持分页、筛选和排序
权限等级:需申请并通过审核
返回数据:商品列表(含标题、价格、图片、销量等) - 备选接口:taobao.taobaoke.items.get
功能:获取淘宝客推广商品(含佣金信息)
适用场景:用于推广返利类应用
限制:需绑定淘宝客账号
二、开发准备 - 申请应用与权限
注册淘宝开放平台账号
创建应用并完成实名认证
申请taobao.items.search接口权限
获取 AppKey 和 AppSecret - 理解签名机制
淘宝 API 使用 MD5 签名验证请求合法性,签名生成步骤:
将所有请求参数(除 sign 外)按字母升序排列
拼接参数名和参数值(不包含特殊符号)
在首尾各追加 AppSecret
对拼接字符串进行 MD5 加密并转为大写
三、完整代码示例
以下是使用 Python 实现淘宝关键词搜索 API 的完整示例:
python
运行
import hashlib
import time
import requests
import json
import math
from typing import List, Dict, Any
class TaobaoAPI:
def init(self, app_key: str, app_secret: str):
"""初始化淘宝API客户端"""
self.app_key = app_key
self.app_secret = app_secret
self.api_url = "https://eco.taobao.com/router/rest"
def generate_sign(self, params: Dict[str, Any]) -> 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 call(self, method: str, params: Dict[str, Any] = None) -> Dict[str, Any]:
"""调用淘宝API"""
if params is None:
params = {}
# 公共参数
common_params = {
"app_key": self.app_key,
"method": method,
"format": "json",
"v": "2.0",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"sign_method": "md5"
}
# 合并参数
all_params = {**common_params, **params}
# 生成签名
all_params["sign"] = self.generate_sign(all_params)
# 发送请求
response = requests.get(self.api_url, params=all_params)
return response.json()
class TaobaoSearchAPI(TaobaoAPI):
def search_items(self,
keyword: str,
page_no: int = 1,
page_size: int = 40,
sort: str = "default",
price_from: float = None,
price_to: float = None,
has_discount: bool = False,
is_tmall: bool = False) -> Dict[str, Any]:
"""
搜索淘宝商品
Args:
keyword: 搜索关键词
page_no: 页码
page_size: 每页数量(最大40)
sort: 排序方式(default, price_asc, price_desc, sale_desc, credit_desc)
price_from: 价格下限
price_to: 价格上限
has_discount: 是否有折扣
is_tmall: 是否仅天猫商品
"""
method = "taobao.items.search"
# 构建请求参数
params = {
"q": keyword,
"page_no": page_no,
"page_size": page_size,
"sort": sort,
"fields": "num_iid,title,nick,pic_url,price,original_price,"
"detail_url,seller_cids,props,location,sell_count"
}
# 可选参数
if price_from is not None:
params["price_from"] = price_from
if price_to is not None:
params["price_to"] = price_to
if has_discount:
params["has_discount"] = "true"
if is_tmall:
params["is_tmall"] = "true"
return self.call(method, params)
def search_all_items(self,
keyword: str,
max_pages: int = 10,
**kwargs) -> List[Dict[str, Any]]:
"""
搜索所有匹配商品(自动处理分页)
Args:
keyword: 搜索关键词
max_pages: 最大获取页数
**kwargs: 其他搜索参数
"""
all_items = []
# 获取第一页以确定总页数
first_page = self.search_items(keyword, page_no=1, **kwargs)
# 检查是否有错误
if "error_response" in first_page:
print(f"搜索失败: {first_page['error_response']['msg']}")
return all_items
# 获取总结果数
total_results = first_page.get("items_search_response", {}).get("total_results", 0)
if total_results == 0:
print(f"未找到匹配的商品: {keyword}")
return all_items
# 计算总页数
total_pages = math.ceil(total_results / kwargs.get("page_size", 40))
total_pages = min(total_pages, max_pages) # 限制最大页数
print(f"找到 {total_results} 个商品,共 {total_pages} 页")
# 分页获取商品
for page in range(1, total_pages + 1):
print(f"正在获取第 {page}/{total_pages} 页...")
result = self.search_items(keyword, page_no=page, **kwargs)
# 提取商品列表
items = result.get("items_search_response", {}).get("items", {}).get("item", [])
all_items.extend(items)
# 避免触发限流
time.sleep(1)
print(f"成功获取 {len(all_items)} 个商品")
return all_items
使用示例
if name == "main":
# 替换为你的AppKey和AppSecret
app_key = "你的AppKey"
app_secret = "你的AppSecret"
# 初始化API客户端
api = TaobaoSearchAPI(app_key, app_secret)
# 搜索示例:手机,价格5000-10000元,按销量排序
items = api.search_all_items(
keyword="手机",
price_from=5000,
price_to=10000,
sort="sale_desc",
max_pages=3
)
# 处理搜索结果
if items:
# 保存结果到JSON文件
with open("search_results.json", "w", encoding="utf-8") as f:
json.dump(items, f, ensure_ascii=False, indent=2)
# 分析结果
print(f"平均价格: {sum(float(item['price']) for item in items) / len(items):.2f}元")
print(f"最高销量: {max(int(item.get('sell_count', 0)) for item in items)}")
四、API 响应数据解析
- 成功响应示例
json
{
"items_search_response": {
"total_results": 1258,
"items": {
"item": [
]{ "num_iid": 612345678901, "title": "2025新款旗舰智能手机 12GB+256GB", "nick": "品牌官方旗舰店", "pic_url": "https://img.alicdn.com/item.jpg", "price": "7999.00", "original_price": "8999.00", "detail_url": "https://item.taobao.com/item.htm?id=612345678901", "seller_cids": "50011993", "props": [ {"name": "品牌", "value": "华为"}, {"name": "屏幕尺寸", "value": "6.7英寸"} ], "location": "广东 深圳", "sell_count": "2345" }, { "num_iid": 623456789012, "title": "专业游戏手机 电竞级配置", "nick": "游戏装备专营店", "pic_url": "https://img.alicdn.com/item2.jpg", "price": "5999.00", "detail_url": "https://item.taobao.com/item.htm?id=623456789012", "sell_count": "1876" }
}
}
} - 错误响应示例
json
{
"error_response": {
"code": 40001,
"msg": "Missing Required Arguments",
"sub_code": "isv.missing-required-argument",
"sub_msg": "缺少必选参数: q"
}
}
五、关键参数与使用技巧 - 排序参数(sort)
default:默认排序(综合)
price_asc:价格从低到高
price_desc:价格从高到低
sale_desc:销量从高到低
credit_desc:信用从高到低 - 筛选条件
price_from/price_to:价格区间
has_discount:是否有折扣
is_tmall:是否仅天猫商品
location:发货地(如 "浙江 杭州") - 性能优化建议
合理设置page_size(最大 40)以减少请求次数
使用缓存机制避免重复查询相同关键词
实现异步请求处理大量数据
六、常见问题与解决方案 - 签名错误
原因:参数排序错误、编码问题或时间戳偏差
解决方案:
确保参数按字典序排序
所有参数使用 UTF-8 编码
同步服务器时间(误差不超过 15 分钟) - 权限不足
原因:未申请或未通过接口权限审核
解决方案:
在控制台检查权限状态
补充完整的应用信息和使用场景说明
联系淘宝开放平台客服协助审核 - 频率限制
默认配额:新应用 500 次 / 天
解决方案:
实现请求频率控制(如每秒不超过 1 次)
通过控制台申请提升 API 调用配额
使用缓存减少重复请求
七、应用场景扩展
电商选品工具:
分析关键词搜索结果
发现热门商品和潜在机会
价格监控系统:
定期搜索特定关键词商品
监控价格波动和促销活动
智能推荐引擎:
根据用户搜索历史推荐相关商品
结合用户画像提升推荐精准度
营销数据分析:
分析不同关键词的搜索热度
优化广告投放策略和关键词选择
通过以上示例,开发者可以快速实现淘宝关键词搜索功能,并根据业务需求进行扩展和优化。在实际应用中,建议结合数据缓存、异步处理和错误重试机制,提高系统稳定性和性能。