在电商数据分析、竞品监控、市场调研等场景中,淘宝关键词搜索数据具有极高的价值。通过调用淘宝开放平台的关键词搜索 API,开发者可以快速获取商品列表、价格、销量、店铺信息等核心数据,实现自动化数据采集与分析。本文将详细讲解淘宝关键词搜索 API 的接入流程、权限申请、签名算法实现,并提供 Node.js 和 Python 两种主流语言的完整代码示例,帮助开发者快速上手。
一、前置准备
1.1 注册淘宝开放者账号
- 访问注册开发者账号。
- 完成实名认证,认证通过后即可。
1.2 创建应用并获取密钥
- 登录选择「电商 API 应用」类型。
- 填写应用名称、应用描述、回调地址等信息(回调地址可填写本地测试地址,如
http://localhost:3000/callback)。 - 在「应用详情」中获取核心密钥:
- Api Key:接口调用唯一标识
- Api Secret:应用密钥(需妥善保管,避免泄露)
1.3 申请 API 权限
淘宝关键词搜索核心 API 为「taobao.tbk.item.get」,需单独申请权限:
- 进入「接口管理」→「申请接口」,搜索「taobao.tbk.item.get」。
- 提交申请理由,等待平台审核。
- 审核通过后,在「已申请接口」中查看接口详情,确认接口调用限制(如 QPS 限制、每日调用次数)。
1.4 了解 API 基础规则
-
接口地址:
http://gw.api.taobao.com/router/rest(HTTP/HTTPS 均可) -
请求方式:GET
-
签名算法:MD5(平台统一签名规则)
-
响应格式:JSON/XML(默认 JSON)
-
核心参数:
参数名 类型 说明 是否必填 method String 接口名称(固定为 taobao.tbk.item.get)是 app_key String 应用 App Key 是 timestamp String 时间戳(格式:yyyy-MM-dd HH:mm:ss,如 2025-12-01 10:00:00) 是 format String 响应格式(json/xml,默认 json) 否 v String 接口版本(固定为 2.0) 是 sign String 签名结果 是 q String 搜索关键词(如 "手机""羽绒服") 是 page_no Number 页码(默认 1,最大支持 100) 否 page_size Number 每页条数(默认 20,最大支持 40) 否 sort String 排序方式(total_sales:销量降序;price_asc:价格升序;price_desc:价格降序) 否
二、核心技术:签名算法实现
淘宝 API 的签名机制是保障接口安全的关键,签名生成步骤如下:
- 收集所有请求参数(包括公共参数和业务参数),排除 sign 参数。
- 将参数按参数名 ASCII 码升序排序。
- 拼接排序后的参数为 "key1value1key2value2..." 格式。
- 在拼接字符串前后分别加上 App Secret,形成 "secret + 拼接串 + secret"。
- 对最终字符串进行 MD5 加密,转换为大写,得到 sign 值。
示例:假设参数为app_key=123456、method=taobao.tbk.item.get、timestamp=2025-12-01 10:00:00、v=2.0、q=手机,App Secret 为abcdef,则:
- 排序后参数:app_key、method、q、timestamp、v
- 拼接串:
app_key123456methodtaobao.tbk.item.getq手机timestamp2025-12-01 10:00:00v2.0 - 待加密串:
abcdefapp_key123456methodtaobao.tbk.item.getq手机timestamp2025-12-01 10:00:00v2.0abcdef - MD5 加密后大写即为 sign 值。
三、Node.js 实现:API 调用与数据解析
3.1 环境准备
确保已安装 Node.js(建议 v14+),创建项目并安装依赖:
mkdir taobao-api-node
cd taobao-api-node
npm init -y
npm install axios md5 # axios用于HTTP请求,md5用于签名加密
3.2 完整代码实现
const axios = require('axios');
const md5 = require('md5');
// 配置信息(替换为自己的App Key和App Secret)
const CONFIG = {
appKey: '你的App Key',
appSecret: '你的App Secret',
apiUrl: 'http://gw.api.taobao.com/router/rest'
};
/**
* 生成淘宝API签名
* @param {Object} params - 请求参数(公共参数+业务参数)
* @returns {String} sign - 签名结果
*/
function generateSign(params) {
// 1. 按参数名ASCII升序排序
const sortedKeys = Object.keys(params).sort((a, b) => a.localeCompare(b));
// 2. 拼接参数串
let signStr = '';
sortedKeys.forEach(key => {
signStr += `${key}${params[key]}`;
});
// 3. 前后拼接App Secret,MD5加密后大写
return md5(CONFIG.appSecret + signStr + CONFIG.appSecret).toUpperCase();
}
/**
* 调用淘宝关键词搜索API
* @param {String} keyword - 搜索关键词
* @param {Number} pageNo - 页码(默认1)
* @param {Number} pageSize - 每页条数(默认20)
* @param {String} sort - 排序方式(默认total_sales)
* @returns {Promise<Object>} 解析后的商品数据
*/
async function searchTaobaoItems(keyword, pageNo = 1, pageSize = 20, sort = 'total_sales') {
try {
// 1. 构建公共参数
const publicParams = {
app_key: CONFIG.appKey,
method: 'taobao.tbk.item.get',
timestamp: new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
}).replace(/\//g, '-'), // 格式:yyyy-MM-dd HH:mm:ss
format: 'json',
v: '2.0'
};
// 2. 构建业务参数
const businessParams = {
q: keyword,
page_no: pageNo,
page_size: pageSize,
sort: sort
};
// 3. 合并参数并生成签名
const allParams = { ...publicParams, ...businessParams };
allParams.sign = generateSign(allParams);
// 4. 发送GET请求
const response = await axios.get(CONFIG.apiUrl, { params: allParams });
const result = response.data;
// 5. 错误处理
if (result.error_response) {
throw new Error(`API调用失败:${result.error_response.msg}(错误码:${result.error_response.code})`);
}
// 6. 解析数据(提取核心字段)
const rawItems = result.tbk_item_get_response.results.n_tbk_item;
const parsedItems = rawItems.map(item => ({
商品ID: item.num_iid,
商品标题: item.title,
商品短标题: item.short_title,
价格: item.zk_final_price, // 折扣价
原价: item.reserve_price,
销量: item.total_sales,
店铺名称: item.seller_nick,
店铺类型: item.user_type === 1 ? '天猫' : '淘宝',
商品图片: item.pict_url,
商品链接: item.item_url,
佣金比例: item.commission_rate, // 淘宝客佣金比例(千分比)
佣金金额: item.commission_amount // 佣金金额(分)
}));
return {
搜索关键词: keyword,
页码: pageNo,
每页条数: pageSize,
总条数: result.tbk_item_get_response.total_results,
商品列表: parsedItems
};
} catch (error) {
console.error('API调用异常:', error.message);
throw error;
}
}
// 测试调用
(async () => {
try {
const data = await searchTaobaoItems('手机', 1, 20, 'total_sales');
console.log('淘宝关键词搜索结果:');
console.log(JSON.stringify(data, null, 2));
} catch (error) {
console.error('测试调用失败:', error);
}
})();
3.3 运行与调试
- 替换代码中的
appKey和appSecret为自己的密钥。 - 执行命令运行代码:
node index.js
- 成功响应后,将输出格式化的商品数据(包含商品 ID、价格、销量、店铺信息等核心字段)。
四、Python 实现:API 调用与数据解析
4.1 环境准备
确保已安装 Python(建议 v3.7+),创建项目并安装依赖:
mkdir taobao-api-python
cd taobao-api-python
pip install requests # requests用于HTTP请求(Python内置hashlib实现MD5,无需额外安装)
4.2 完整代码实现
import requests
import hashlib
import time
from datetime import datetime
# 配置信息(替换为自己的App Key和App Secret)
CONFIG = {
"appKey": "你的App Key",
"appSecret": "你的App Secret",
"apiUrl": "http://gw.api.taobao.com/router/rest"
}
def generate_sign(params):
"""
生成淘宝API签名
:param params: 请求参数(字典)
:return: sign(字符串)
"""
# 1. 按参数名ASCII升序排序
sorted_items = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数串
sign_str = ""
for key, value in sorted_items:
sign_str += f"{key}{value}"
# 3. 前后拼接App Secret,MD5加密后大写
sign_str = CONFIG["appSecret"] + sign_str + CONFIG["appSecret"]
md5_obj = hashlib.md5(sign_str.encode("utf-8"))
return md5_obj.hexdigest().upper()
def search_taobao_items(keyword, page_no=1, page_size=20, sort="total_sales"):
"""
调用淘宝关键词搜索API
:param keyword: 搜索关键词
:param page_no: 页码(默认1)
:param page_size: 每页条数(默认20)
:param sort: 排序方式(默认total_sales)
:return: 解析后的商品数据(字典)
"""
try:
# 1. 构建公共参数
public_params = {
"app_key": CONFIG["appKey"],
"method": "taobao.tbk.item.get",
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "2.0"
}
# 2. 构建业务参数
business_params = {
"q": keyword,
"page_no": page_no,
"page_size": page_size,
"sort": sort
}
# 3. 合并参数并生成签名
all_params = {**public_params, **business_params}
all_params["sign"] = generate_sign(all_params)
# 4. 发送GET请求
response = requests.get(CONFIG["apiUrl"], params=all_params, timeout=30)
result = response.json()
# 5. 错误处理
if "error_response" in result:
error_msg = result["error_response"]["msg"]
error_code = result["error_response"]["code"]
raise Exception(f"API调用失败:{error_msg}(错误码:{error_code})")
# 6. 解析数据(提取核心字段)
raw_items = result["tbk_item_get_response"]["results"]["n_tbk_item"]
parsed_items = []
for item in raw_items:
parsed_items.append({
"商品ID": item["num_iid"],
"商品标题": item["title"],
"商品短标题": item["short_title"],
"价格": item["zk_final_price"],
"原价": item["reserve_price"],
"销量": item["total_sales"],
"店铺名称": item["seller_nick"],
"店铺类型": "天猫" if item["user_type"] == 1 else "淘宝",
"商品图片": item["pict_url"],
"商品链接": item["item_url"],
"佣金比例": item["commission_rate"],
"佣金金额": item["commission_amount"]
})
return {
"搜索关键词": keyword,
"页码": page_no,
"每页条数": page_size,
"总条数": result["tbk_item_get_response"]["total_results"],
"商品列表": parsed_items
}
except Exception as e:
print(f"API调用异常:{str(e)}")
raise e
# 测试调用
if __name__ == "__main__":
try:
data = search_taobao_items("手机", 1, 20, "total_sales")
print("淘宝关键词搜索结果:")
import json
print(json.dumps(data, ensure_ascii=False, indent=2))
except Exception as e:
print(f"测试调用失败:{str(e)}")
4.3 运行与调试
-
替换代码中的
appKey和appSecret为自己的密钥。 -
执行命令运行代码:
python main.py
3.成功后将输出结构化的商品数据,可直接用于后续分析或存储。
五、常见问题与注意事项
5.1 签名错误(error_code: 15)
- 检查参数排序是否按 ASCII 升序(尤其是中文参数名,需确认编码一致)。
- 确认 App Secret 是否正确(注意大小写)。
- 时间戳格式是否正确(必须为
yyyy-MM-dd HH:mm:ss,且与淘宝服务器时间误差不超过 10 分钟)。
5.2 权限不足(error_code: 11)
- 确认已申请「taobao.tbk.item.get」接口权限。
- 个人开发者账号部分接口权限受限,建议使用企业账号。
- 检查应用是否已上线(未上线应用可能有调用次数限制)。
5.3 调用频率限制
- 淘宝 API 默认 QPS 限制为 10(每秒最多 10 次请求),超过会返回限流错误。
- 建议在代码中添加请求间隔(如
time.sleep(0.1)),避免限流。 - 查看应用的调用次数统计,避免超出每日限额。
5.4 数据解析注意事项
- 商品标题可能包含 HTML 标签(如
<em>),需根据需求清洗。 - 价格字段为字符串类型,需转换为数字后再进行计算。
- 佣金金额单位为 "分",需除以 100 转换为元。
六、扩展场景
- 多关键词批量搜索:循环调用 API,传入不同关键词,批量采集数据。
- 分页数据获取 :根据
total_results字段,自动循环获取所有页码数据。 - 数据存储:将解析后的商品数据存入 MySQL、MongoDB 或 Excel,用于长期分析。
- 定时采集 :结合 Node.js 的
node-schedule或 Python 的schedule库,实现定时监控商品价格、销量变化。
总结
本文详细讲解了淘宝关键词搜索 API 的接入流程、签名算法原理,并提供了 Node.js 和 Python 的完整实现代码。开发者只需完成开放平台账号注册、应用创建、权限申请,即可通过示例代码快速实现 API 调用与数据解析。在实际使用中,需注意遵守淘宝开放平台的调用规则,合理控制调用频率,避免违规。通过 API 获取的电商数据可广泛应用于市场调研、竞品分析、价格监控等场景,为业务决策提供数据支撑。