淘宝关键词搜索API高效开发:商品数据采集接口接入与优化技巧

67 阅读4分钟

本文围绕淘宝关键词搜索 API 的高效开发,详细阐述了商品数据采集接口的接入与优化技巧。主要内容包括:

  1. 淘宝 API 基础接入
  • 介绍了 API 认证机制,包括 ApiKey 和 ApiSecret 的使用
  • 实现了 API 请求签名算法,确保请求的合法性
  • 封装了基础 API 客户端,支持常见 API 调用和错误处理

import requests import hashlib import time import json import logging from typing import Dict, Any, List, Optional class TaobaoAPIClient: """淘宝API客户端,用于调用淘宝开放平台的接口""" def init(self, app_key: str, app_secret: str, endpoint: str = "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.session = requests.Session() self.logger = logging.getLogger("TaobaoAPIClient") 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 # 计算MD5哈希 return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper() def call(self, method: str, params: Dict[str, Any], retry_times: int = 3) -> Dict[str, Any]: """ 调用淘宝API Args: method: API方法名 params: 请求参数 retry_times: 重试次数 Returns: API响应结果字典 """ for attempt in range(retry_times): 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 = self.session.post(self.endpoint, data=all_params) response.raise_for_status() # 解析响应 result = response.json() return result except Exception as e: self.logger.error(f"API请求失败 (尝试 {attempt+1}/{retry_times}): {str(e)}") if attempt < retry_times - 1: wait_time = (attempt + 1) * 2 self.logger.info(f"等待 {wait_time} 秒后重试...") time.sleep(wait_time) else: raise class TaobaoItemSearch: """淘宝商品搜索API封装""" def init(self, api_client: TaobaoAPIClient): """ 初始化商品搜索API Args: api_client: 淘宝API客户端实例 """ self.client = api_client 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, credit-desc) has_coupon: 是否只返回有优惠券的商品 Returns: 商品列表 """ method = "taobao.tbk.dg.material.optional" # 转换排序方式 sort_mapping = { "default": "default", "price-asc": "price_asc", "price-desc": "price_desc", "sale-desc": "total_sales", "credit-desc": "tk_rate_des" } sort_field = sort_mapping.get(sort, "default") params = { "q": keyword, "page_no": page_no, "page_size": page_size, "sort": sort_field, "has_coupon": "true" if has_coupon else "false", "adzone_id": "YOUR_ADZONE_ID", # 需要替换为你的广告位ID "platform": 1 # 1:PC, 2:无线 } result = self.client.call(method, params) # 处理响应结果 items = [] 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"]: map_data = response["result_list"]["map_data"] for item_data in map_data: if "item_info" in item_data: items.append(item_data["item_info"]) return items # 使用示例 if name == "main": # 配置日志 logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 初始化API客户端 (请替换为你的实际AppKey和AppSecret) client = TaobaoAPIClient( app_key="YOUR_APP_KEY", app_secret="YOUR_APP_SECRET" ) # 初始化商品搜索API item_search = TaobaoItemSearch(client) # 搜索商品 try: items = item_search.search_items( keyword="手机", page_no=1, page_size=10, sort="sale-desc", has_coupon=True ) print(f"找到 {len(items)} 个商品") for i, item in enumerate(items, 1): print(f"{i}. {item.get('title')} - 价格: {item.get('zk_final_price')}元 - 销量: {item.get('volume')}") except Exception as e: print(f"搜索失败: {str(e)}")

2.商品搜索接口实现

针对商品搜索场景,封装了专门的搜索接口

支持关键词搜索、分页、排序和筛选等功能

详细解析了 API 响应数据结构,提取有效商品信息

3.数据处理与存储

提供了数据收集和处理的完整流程

支持多页数据采集,并添加了请求间隔控制,避免频繁请求

使用 Pandas 进行数据清洗和转换,便于后续分析

实现了数据持久化存储,支持 CSV 等格式

4.性能优化技巧

引入异步编程模型,大幅提高数据采集效率

实现了请求限流和分批处理,避免触发 API 限流机制

添加了数据缓存策略,减少重复请求

提供了异常处理和重试机制,确保数据采集的稳定性

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