×

天猫商品关键词搜索实战:精准筛选+数据去重+合规调用(Python 实操版)

Ace Ace 发表于2026-07-21 17:23:07 浏览14 评论0

抢沙发发表评论

一、接口对接前置须知
天猫商品搜索需依托淘宝开放平台接口(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)去重,同时清洗标题冗余字符、格式化价格与销量数据,输出标准化结果,便于后续入库分析。

点击获取key和secret
三、完整实操代码(带筛选+去重功能)

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,高频调用会触发限流,建议批量查询时增加休眠时间。

群贤毕至

访客