分步构建淘宝商品搜索API:关键词数据采集接入实战代码

45 阅读2分钟
import hashlib
import time
import requests
import json
import logging
from typing import Dict, Any, Optional, List, Tuple

class TaobaoAPIClient:
    """淘宝API客户端,用于访问淘宝开放平台的各种API服务"""
    
    def __init__(self, app_key: str, app_secret: str, 
                 endpoint: str = "https://gw.api.taobao.com/router/rest"):
        """
        初始化淘宝API客户端
        
        Args:
            app_key: 应用的AppKey
            app_secret: 应用的AppSecret
            endpoint: API请求的端点URL
        """
        self.app_key = app_key
        self.app_secret = app_secret
        self.endpoint = endpoint
        self.logger = logging.getLogger("TaobaoAPIClient")
        
    def generate_sign(self, params: Dict[str, Any]) -> str:
        """
        生成API请求签名
        
        根据淘宝开放平台的规定,将参数按照字典序排序后拼接,
        并使用MD5算法生成签名
        
        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
        
        # 计算MD5值
        return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
    
    def call(self, method: str, params: Dict[str, Any]) -> Optional[Dict[str, Any]]:
        """
        调用淘宝API
        
        Args:
            method: API方法名
            params: 请求参数
            
        Returns:
            API响应的字典形式,或None(如果发生错误)
        """
        try:
            # 构建公共参数
            common_params = {
                "app_key": self.app_key,
                "method": method,
                "format": "json",
                "v": "2.0",
                "sign_method": "md5",
                "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            }
            
            # 合并公共参数和业务参数
            all_params = {**common_params, **params}
            
            # 生成签名
            all_params["sign"] = self.generate_sign(all_params)
            
            # 发送请求
            response = requests.post(self.endpoint, data=all_params)
            response.raise_for_status()
            
            # 解析响应
            result = response.json()
            return result
            
        except Exception as e:
            self.logger.error(f"API调用失败: {str(e)}")
            return None

本文围绕淘宝商品搜索 API 的分步构建,详细介绍了从接入到数据采集的完整实现过程。主要内容包括:

  1. 淘宝 API 基础接入
  • 实现了基础的淘宝 API 客户端,处理认证和签名机制
  • 介绍了 API 请求的基本结构和必要参数
  • 提供了错误处理和日志记录功能

2.商品搜索功能实现

  • 实现了基于关键词的商品搜索接口
  • 支持分页、排序和筛选等功能
  • 详细解析了 API 响应结构,提取有效商品信息

3.数据处理与分析

  • 提供了数据清洗和转换功能,提取关键商品信息
  • 计算了优惠后价格和佣金等衍生指标
  • 使用 Pandas 进行数据处理,方便后续分析

4.完整使用示例

  • 展示了如何组合各个模块完成完整的搜索流程

  • 实现了多页数据采集,避免频繁请求

  • 将结果保存为 CSV 文件,便于进一步处理

代码部分提供了完整的实现方案,包括 API 客户端、商品搜索、数据处理和主程序示例。你可以根据实际需求进行调整和扩展,例如添加更多筛选条件、优化数据存储方式或增强错误处理能力。