在跨境电商数据采集场景中,通过关键字精准搜索商品列表是基础且核心的需求。本文将聚焦阿里巴巴国际站的关键字搜索接口,详细介绍如何构建多条件搜索请求、处理分页数据、解析商品列表信息,并提供可直接复用的 Python 实现方案,帮助开发者快速搭建稳定高效的商品搜索功能。
一、阿里巴巴搜索 API 基础信息
阿里巴巴国际站提供的alibaba.product.search接口是实现关键字搜索商品列表的核心接口,支持多维度筛选条件组合,满足不同场景的搜索需求。
接口特点:
- 基于 TOP 开放平台架构,采用统一的签名认证机制
- 支持复杂条件组合搜索(关键字、价格、销量、评分等)
- 分页加载数据,最大页容量为 50 条
- 响应包含商品基本信息、价格、卖家、销量等核心数据
接口端点:https://gw.api.alibaba.com/openapi/param2/2.0/aliexpress.open/api.searchproduct
二、核心搜索参数详解
1. 公共参数
- app_key:应用唯一标识
- method:接口名称,固定为alibaba.product.search
- timestamp:请求时间戳(yyyy-MM-dd HH:mm:ss)
- format:响应格式,默认 JSON
- v:API 版本,固定为 2.0
- sign:请求签名
- partner_id:合作伙伴 ID(可选)
2. 核心搜索参数
- keywords:搜索关键字(必填)
- page_no:页码,默认 1
- page_size:每页条数(1-50)
- min_price/max_price:价格区间筛选
- sort_type:排序方式(price_asc/price_desc/sales_desc/rating_desc)
- category_id:分类 ID 筛选
- trade_assurance:是否仅保价商品(true/false)
- shipping_country:目标配送国家
3. 响应数据结构
- total_results:总搜索结果数
- page_no/page_size:分页信息
- products:商品列表数组
- filters:可用筛选条件(用于前端筛选项展示)
三、完整代码实现
以下是 Python 实现的阿里巴巴国际站关键字搜索功能,支持多条件筛选、分页控制和结果结构化处理:
阿里巴巴国际站关键字搜索接口实现 import requests import time import hashlib import hmac import urllib.parse from typing import Dict, List, Optional, Any from datetime import datetime class AlibabaSearchAPI: def __init__(self, app_key: str, app_secret: str): """ 初始化阿里巴巴商品搜索API客户端 :param app_key: 应用的App Key :param app_secret: 应用的App Secret """ self.app_key = app_key self.app_secret = app_secret self.api_url = "https://gw.api.alibaba.com/openapi/param2/2.0/aliexpress.open/api.searchproduct" self.max_page_size = 50 # 最大每页条数 def _generate_sign(self, params: Dict[str, str]) -> str: """ 生成API请求签名 :param params: 请求参数字典 :return: 签名字符串 """ # 按参数名ASCII升序排序 sorted_params = sorted(params.items(), key=lambda x: x[0]) # 拼接参数并URL编码 query_string = "&".join([ f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params ]) # 计算HMAC-SHA1签名 sign_str = self.app_secret + query_string + self.app_secret signature = hmac.new( self.app_secret.encode('utf-8'), sign_str.encode('utf-8'), hashlib.sha1 ).hexdigest().upper() return signature def search_products(self, keywords: str, page_no: int = 1, page_size: int = 20, min_price: Optional[float] = None, max_price: Optional[float] = None, sort_type: Optional[str] = None, category_id: Optional[str] = None, trade_assurance: Optional[bool] = None, shipping_country: Optional[str] = None) -> Dict[str, Any]: """ 搜索阿里巴巴国际站商品 :param keywords: 搜索关键字 :param page_no: 页码 :param page_size: 每页条数(1-50) :param min_price: 最低价格 :param max_price: 最高价格 :param sort_type: 排序方式 :param category_id: 分类ID :param trade_assurance: 是否仅保价商品 :param shipping_country: 配送国家 :return: 搜索结果 """ # 限制最大页容量 page_size = min(page_size, self.max_page_size) # 公共参数 params: Dict[str, str] = { "app_key": self.app_key, "method": "alibaba.product.search", "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), "format": "json", "v": "2.0", "keywords": keywords, "page_no": str(page_no), "page_size": str(page_size) } # 添加可选参数 if min_price is not None: params["min_price"] = str(min_price) if max_price is not None: params["max_price"] = str(max_price) if sort_type: params["sort_type"] = sort_type if category_id: params["category_id"] = category_id if trade_assurance is not None: params["trade_assurance"] = "true" if trade_assurance else "false" if shipping_country: params["shipping_country"] = shipping_country # 生成签名 params["sign"] = self._generate_sign(params) try: # 发送请求 response = requests.get( self.api_url, params=params, timeout=15 ) response.raise_for_status() # 解析响应 result = response.json() # 处理API错误 if "error_response" in result: error = result["error_response"] return { "success": False, "error_code": error.get("code"), "error_msg": error.get("msg") } # 处理正常响应 search_result = result.get("aliexpress_open_api_searchproduct_response", {}).get("result", {}) return self._parse_search_result(search_result) except requests.exceptions.RequestException as e: return { "success": False, "error_msg": f"请求异常: {str(e)}" } except Exception as e: return { "success": False, "error_msg": f"处理响应失败: {str(e)}" } def _parse_search_result(self, raw_result: Dict[str, Any]) -> Dict[str, Any]: """ 解析原始搜索结果为结构化数据 :param raw_result: 原始API响应数据 :return: 结构化的搜索结果 """ # 提取分页信息 pagination = { "total_results": raw_result.get("total_results", 0), "page_no": raw_result.get("page_no", 1), "page_size": raw_result.get("page_size", 20), "total_pages": (raw_result.get("total_results", 0) + raw_result.get("page_size", 20) - 1) // raw_result.get("page_size", 20) } # 解析商品列表 products = [] for item in raw_result.get("products", []): # 提取价格信息 price_ranges = [] if "price_ranges" in item: for pr in item["price_ranges"]: price_ranges.append({ "min_qty": pr.get("min_qty"), "max_qty": pr.get("max_qty"), "price": pr.get("price") }) products.append({ "product_id": item.get("product_id"), "title": item.get("title"), "main_image": item.get("main_image_url"), "price": { "min_price": item.get("min_price"), "max_price": item.get("max_price"), "currency": item.get("currency_code"), "ranges": price_ranges }, "seller": { "user_id": item.get("user_id"), "company_name": item.get("company_name"), "country": item.get("country"), "response_rate": item.get("response_rate"), "transaction_level": item.get("transaction_level") }, "sales": { "monthly_sales": item.get("monthly_sales"), "feedback_count": item.get("feedback_count"), "rating": item.get("rating") }, "trade_assurance": item.get("trade_assurance") == "true", "category_id": item.get("category_id"), "category_name": item.get("category_name"), "url": item.get("product_detail_url") }) return { "success": True, "pagination": pagination, "products": products, "available_filters": self._parse_filters(raw_result.get("filters", [])) } def _parse_filters(self, raw_filters: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """解析可用筛选条件""" filters = [] for flt in raw_filters: options = [] for opt in flt.get("options", []): options.append({ "value": opt.get("value"), "label": opt.get("label"), "count": opt.get("count") }) filters.append({ "name": flt.get("name"), "label": flt.get("label"), "options": options }) return filters def search_all_pages(self, keywords: str, max_pages: int = 5, **kwargs) -> Dict[str, Any]: """ 批量获取多页搜索结果 :param keywords: 搜索关键字 :param max_pages: 最大获取页数 :param**kwargs: 其他搜索参数 :return: 合并的搜索结果 """ all_products = [] current_page = 1 total_pages = 1 while current_page <= max_pages and current_page <= total_pages: # 搜索当前页 result = self.search_products( keywords=keywords, page_no=current_page, **kwargs ) if not result.get("success"): return result # 收集商品 all_products.extend(result.get("products", [])) # 更新分页信息 pagination = result.get("pagination", {}) total_pages = pagination.get("total_pages", 1) # 准备下一页 current_page += 1 # 添加请求间隔,避免触发频率限制 time.sleep(1) return { "success": True, "total_products": len(all_products), "products": all_products, "original_pagination": pagination } # 使用示例 if __name__ == "__main__": # 替换为你的应用凭证 APP_KEY = "your_app_key" APP_SECRET = "your_app_secret" # 初始化API客户端 search_api = AlibabaSearchAPI(APP_KEY, APP_SECRET) # 示例1:基础搜索 basic_result = search_api.search_products( keywords="smart watch", page_no=1, page_size=20, sort_type="sales_desc", min_price=10, max_price=100, trade_assurance=True ) if basic_result["success"]: print(f"基础搜索: 找到 {basic_result['pagination']['total_results']} 个商品") print(f"第一页商品数量: {len(basic_result['products'])}") if basic_result["products"]: print(f"第一个商品: {basic_result['products'][0]['title']}") # 示例2:批量获取多页结果 multi_page_result = search_api.search_all_pages( keywords="bluetooth earbuds", max_pages=3, page_size=50, shipping_country="US" ) if multi_page_result["success"]: print(f"\n多页搜索: 共获取 {multi_page_result['total_products']} 个商品")
四、代码核心功能解析
1.** 多条件搜索实现 **:
- 支持关键字、价格区间、排序方式等 10 + 筛选条件
- 自动处理参数边界(如页容量限制在 1-50 之间)
- 提供清晰的参数类型定义,便于开发使用
2.** 分页策略优化 **:
- 基础方法search_products处理单页搜索
- 高级方法search_all_pages自动批量获取多页数据
- 内置请求间隔控制,避免触发频率限制
3.** 数据解析增强 **:
- 结构化处理原始响应,提取核心业务字段
- 分类组织商品信息(基础信息、价格、卖家、销量等)
- 解析可用筛选条件,便于前端实现筛选功能
4.** 错误处理机制 **:
- 捕获 HTTP 请求异常,提供详细错误信息
- 解析 API 返回的错误码和描述
- 统一返回格式,包含成功标识和业务数据
五、实战注意事项
1.** 接口权限与限制 **:
- alibaba.product.search接口需要在开放平台申请使用权限
- 免费开发者账号有调用频率限制(通常 QPS=10)
- 部分筛选条件(如品牌筛选)需要额外权限
2.** 搜索策略优化 **:
- 合理设置page_size,减少请求次数(最大 50 条 / 页)
- 优先使用筛选条件缩小范围,再分页获取
- 热门关键词搜索建议添加缓存,缓存时间 15-30 分钟
3.** 数据处理建议 **:
- 商品标题可能包含 HTML 实体,需进行转义处理
- 价格数据需结合货币代码进行转换和展示
- 批量获取时实现断点续传,应对网络中断
4.** 反爬与合规 **:
- 严格遵守 API 调用频率限制,避免 IP 被临时封禁
- 数据使用需符合阿里巴巴国际站的开发者协议
- 生产环境建议使用代理 IP 池分散请求来源
六、功能扩展方向
- 实现搜索建议功能,集成阿里巴巴的关键词推荐 API
- 开发可视化搜索工具,支持条件组合与结果导出
- 添加搜索结果去重功能,基于商品 ID 过滤重复项
- 集成商品详情接口,实现 "搜索 - 查看详情" 完整流程
通过本文提供的方案,开发者可以快速构建功能完善的阿里巴巴国际站商品搜索模块,为跨境电商应用提供精准的商品数据支持。实际开发中,建议根据业务需求合理配置筛选条件,平衡数据准确性和接口性能。