即刻开发:接入淘宝关键词搜索 API 采集海量商品数据

36 阅读5分钟

 在电商数据分析、价格监控和市场调研等场景中,获取淘宝平台的商品数据至关重要。本文将带领你从零开始,接入淘宝关键词搜索 API,实现海量商品数据的采集,并提供完整的代码实现和实践指南。

淘宝 API 接入准备

在接入淘宝 API 之前,需要完成以下准备工作:

  1. 注册账号:访问注册账号并完成实名认证。
  2. 创建应用:获取 ApiKey 和 ApiSecret。
  3. 申请 API 权限:在应用管理中申请taobao.tbk.dg.material.optional接口的访问权限。
  4. 安装必要的 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 的完整开发流程:

  1. 安装依赖
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 时,需要注意以下几点:

  1. API 权限问题

    • 需要申请taobao.tbk.dg.material.optional接口的访问权限
    • 部分高级功能需要成为会员并绑定推广位
  2. 签名生成规则

    • 参数必须按字典序排序
    • 签名过程中不要对参数名和参数值进行 URL 编码
    • 签名结果需要转换为大写
  3. 频率限制

    • 免费应用有 QPS 限制,建议每次请求间隔 1 秒以上
    • 超出频率限制会返回错误码isv.access-control-exceed-limit
  4. 数据解析注意事项

    • 检查返回结果中是否包含预期的字段
    • 处理可能的空值或异常数据格式
    • 商品图片 URL 可能需要添加协议前缀
  5. 合规使用

    • 采集的数据仅用于个人学习或合法商业用途
    • 避免过度频繁请求,以免影响 API 服务稳定性
    • 遵守淘宝开放平台的开发者协议

扩展功能建议

  1. 数据可视化:使用 Matplotlib 或 Plotly 库将价格分布等数据可视化
  2. 定时任务:使用 APScheduler 等库实现定时采集数据
  3. 数据库存储:将数据存入 MySQL 或 MongoDB 等数据库进行长期分析
  4. 异常处理增强:添加重试机制和更完善的错误处理

通过以上步骤,你可以快速接入淘宝关键词搜索 API,实现海量商品数据的采集和分析。根据实际需求,你还可以进一步扩展功能,构建更强大的电商数据分析系统。