一、接口对接前置须知 点击获取key和secret
天猫商品搜索需依托淘宝开放平台接口(taobao.tbk.item.get),核心区别于淘宝搜索的是,需通过`platform=2`固定参数限定仅返回天猫店铺商品,规避淘宝
C 店商品混杂。对接前需完成企业实名认证,获取 AppKey、AppSecret 及推广位
ID(adzone_id),确保应用已开通联盟基础权限,这是接口正常调用的前提,也是网上简易教程易遗漏的关键点。
二、核心实操步骤拆解
1. **参数配置核心要点**:除基础关键词、页码参数外,新增天猫专属筛选条件,包括包邮筛选(need_free_shipment)、消费者保障筛选(need_prepay)、价格区间筛选,适配电商选品、比价场景,解决网上代码仅支持基础搜索的问题。
2. **签名规范落地**:严格遵循淘宝 TOP 标准 MD5签名,按参数 ASCII 升序排序,拼接后加密,重点注意时间戳格式为`YYYY-MM-DD HH:MM:SS`,与服务器时差不超过5分钟,避免签名失效。
3. **数据去重与清洗**:接口返回数据可能存在重复商品,通过商品 ID(num_iid)去重,同时清洗标题冗余字符、格式化价格与销量数据,输出标准化结果,便于后续入库分析。
三、完整实操代码(带筛选+去重功能)import requests
import hashlib
import time
import json
from urllib.parse import quote
class TmallSearchClient:
def __init__(self, app_key, app_secret, adzone_id):
self.app_key = app_key
self.app_secret = app_secret
self.adzone_id = adzone_id
self.api_url = "https://gw.api.taobao.com/router/rest"
self.session = requests.Session()
def generate_sign(self, params):
"""天猫标准MD5签名生成"""
sorted_params = sorted(params.items(), key=lambda x: x[0])
sign_str = "".join([f"{k}{quote(str(v), safe='')}" for k, v in sorted_params])
sign_str = self.app_secret + sign_str + self.app_secret
return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
def search_tmall_items(self, keyword, page=1, page_size=20, min_price=0, max_price=0):
# 公共参数+天猫专属业务参数
params = {
"app_key": self.app_key,
"method": "taobao.tbk.item.get",
"format": "json",
"v": "2.0",
"sign_method": "md5",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"adzone_id": self.adzone_id,
"q": keyword,
"page_no": page,
"page_size": page_size,
"platform": 2, # 固定值,仅搜索天猫商品
"need_free_shipment": "true", # 筛选包邮商品
"need_prepay": "true" # 筛选消费者保障商品
}
# 价格区间筛选
if min_price > 0:
params["start_price"] = min_price
if max_price > 0:
params["end_price"] = max_price
# 生成签名
params["sign"] = self.generate_sign(params)
try:
resp = self.session.get(self.api_url, params=params, timeout=15)
res_data = resp.json()
# 异常处理
if "error_response" in res_data:
err_msg = res_data["error_response"].get("sub_msg", "接口调用失败")
return {"code": -1, "msg": err_msg, "data": []}
# 提取商品数据并去重
items_raw = res_data.get("tbk_item_get_response", {}).get("results", {}).get("n_tbk_item", [])
items_clean = []
item_ids = set() # 用于去重的商品ID集合
for item in items_raw:
item_id = item.get("num_iid")
if item_id in item_ids:
continue
item_ids.add(item_id)
items_clean.append({
"item_id": item_id,
"title": item.get("title").replace("<em>", "").replace("</em>", ""),
"price": float(item.get("price")),
"sales": int(item.get("sales", 0)),
"main_img": item.get("pict_url"),
"shop_name": item.get("shop_title"),
"is_free_shipment": item.get("free_shipment", "false") == "true"
})
time.sleep(1) # 控制请求频率,规避限流
return {"code": 200, "msg": "查询成功", "data": items_clean}
except Exception as e:
return {"code": -2, "msg": f"网络异常:{str(e)}", "data": []}
# 调用示例
if __name__ == "__main__":
client = TmallSearchClient(
app_key="你的AppKey",
app_secret="你的AppSecret",
adzone_id="你的推广位ID"
)
# 搜索天猫办公笔记本,筛选价格10-50元、包邮商品
result = client.search_tmall_items("办公笔记本", min_price=10, max_price=50)
print(json.dumps(result, ensure_ascii=False, indent=2))
四、实战避坑与合规提醒
1. `platform=2`是筛选天猫商品的核心参数,遗漏会返回淘宝全平台商品,达不到精准搜索目的。
2. 推广位 ID(adzone_id)为必填项,需在淘宝联盟后台创建,否则接口会返回权限异常。
3. 生产环境需将密钥、推广位 ID 存入配置文件,禁止硬编码在代码中,避免信息泄露。
4. 调用频率需控制在 QPS≤5,高频调用会触发限流,建议批量查询时增加休眠时间。