×

阿里巴巴国际站关键字搜索 API 实战:从多条件筛选到商品列表高效获取

Ace Ace 发表于2025-08-19 17:32:17 浏览60 评论0

抢沙发发表评论

在跨境电商数据采集场景中,通过关键字精准搜索商品列表是基础且核心的需求。本文将聚焦阿里巴巴国际站的关键字搜索接口,详细介绍如何构建多条件搜索请求、处理分页数据、解析商品列表信息,并提供可直接复用的  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:可用筛选条件(用于前端筛选项展示)

点击获取key和secret

三、完整代码实现

以下是 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 池分散请求来源

六、功能扩展方向

  1. 实现搜索建议功能,集成阿里巴巴的关键词推荐 API

  2. 开发可视化搜索工具,支持条件组合与结果导出

  3. 添加搜索结果去重功能,基于商品 ID 过滤重复项

  4. 集成商品详情接口,实现 "搜索 - 查看详情" 完整流程


通过本文提供的方案,开发者可以快速构建功能完善的阿里巴巴国际站商品搜索模块,为跨境电商应用提供精准的商品数据支持。实际开发中,建议根据业务需求合理配置筛选条件,平衡数据准确性和接口性能。

群贤毕至

访客