0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

邓林 来源:jf_63013664 作者:jf_63013664 2025-08-20 09:22 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

wKgZO2ilH1aAWZLbABIGD3I1Bf0989.png

三、完整代码实现

以下是 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 过滤重复项

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

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    2160

    浏览量

    66251
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    淘宝图片搜索商品API指南

    图像识别搜索:支持JPG、PNG格式图片上传。 相似商品推荐:基于图像特征匹配相似商品商品信息获取:返回商品标题、价格、销量等
    的头像 发表于 12-08 14:26 709次阅读

    拼多多商品列表API使用指南

    一、接口概述 拼多多商品列表API是拼多多开放平台提供的重要接口,主要用于获取平台上的商品列表信息。该接口支持按多种
    的头像 发表于 11-29 15:17 394次阅读

    Temu跨境电商按关键字搜索Temu商品API的应用及接口请求示例

    限于以下几个方面: 用户搜索商品:当用户在Temu平台上输入关键字搜索商品时,API会根据输入的
    的头像 发表于 11-29 15:08 112次阅读

    天眼查平台关键字搜索企业数据API接口技术指南

    ​ 一、接口概述 天眼查提供的企业搜索API接口,支持通过关键字查询企业工商信息、经营状态等核心数据。该接口采用RESTful架构,返回JSON格式数据。 二、接口认证 调用需使用API
    的头像 发表于 11-21 11:48 396次阅读
    天眼查平台<b class='flag-5'>关键字</b><b class='flag-5'>搜索</b>企业数据<b class='flag-5'>API</b>接口技术指南

    item_search-按关键字搜索商品列表API接口

    一、引言 淘宝是中国最大的电商平台之一,拥有数亿的商品和用户。为了方便开发者进行应用开发,淘宝提供了丰富的API接口,其中之一就是关键搜索接口。通过该接口,开发者可以轻松地获取淘宝上
    的头像 发表于 11-16 17:13 93次阅读

    海外电商平台阿里巴巴国际获取商品详情的API接口

    ​ 在跨境电商领域,阿里巴巴国际(Alibaba.com)是一个领先的平台,为企业提供全球贸易服务。其API接口允许开发者通过编程方式获取商品详情,便于构建自动化工具或集成
    的头像 发表于 11-14 15:36 211次阅读
    海外电商平台<b class='flag-5'>阿里巴巴国际</b><b class='flag-5'>站</b>获取<b class='flag-5'>商品</b>详情的<b class='flag-5'>API</b>接口

    1688平台关键字搜索商品API接口技术实践指南

    /com.alibaba.product/alibaba.product.search/ 必备参数: { "keyword": "手机", // 搜索关键字 "pageNo": 1, // 页码 "pageSize": 20, // 每页数量 "access_token"
    的头像 发表于 11-11 14:22 267次阅读
    1688平台<b class='flag-5'>关键字</b><b class='flag-5'>搜索</b><b class='flag-5'>商品</b><b class='flag-5'>API</b>接口技术实践指南

    1688平台获取店铺所有商品列表API接口技术详解

    ​ 在电商开发中,集成1688平台的API是获取店铺商品数据的关键。1688是阿里巴巴旗下的B2B批发平台,其API接口允许开发者通过编程方
    的头像 发表于 11-11 14:04 171次阅读
    1688平台获取店铺所有<b class='flag-5'>商品</b><b class='flag-5'>列表</b><b class='flag-5'>API</b>接口技术详解

    亚马逊平台根据关键字搜索商品API接口

    ​  在电商开发中,集成亚马逊平台的商品搜索功能是常见需求。通过亚马逊的Product Advertising API(PAAPI),开发者可以根据关键字
    的头像 发表于 11-05 15:00 124次阅读
    亚马逊平台根据<b class='flag-5'>关键字</b><b class='flag-5'>搜索</b><b class='flag-5'>商品</b><b class='flag-5'>API</b>接口

    按图搜索1688商品API接口

    ​  在电商场景中,按图搜索商品功能(即通过上传图片查找相似商品)极大提升了用户体验和效率。1688作为阿里巴巴旗下的批发平台,虽然没有直接公开的“按图
    的头像 发表于 10-22 15:05 241次阅读
    按图<b class='flag-5'>搜索</b>1688<b class='flag-5'>商品</b>的<b class='flag-5'>API</b>接口

    阿里巴巴国际关键字搜索 API 实战:3 步搞定多语言适配 + 限流破局,询盘量提升 40%

    跨境电商API开发常陷合规、多语言、限流等坑。本文详解国际合规(GDPR/CCPA)参数优化、数据结构化及区域化搜索的全链路方案,附Py
    的头像 发表于 10-20 14:44 920次阅读

    亚马逊 SP-API 深度开发:关键字搜索接口的购物意图挖掘与合规竞品分析

    本文深度解析亚马逊SP-API关键字搜索接口的合规调用与商业应用,涵盖意图识别、竞品分析、性能优化全链路。通过COSMO算法解析用户购物意图,结合合规技术方案提升关键词转化率,助力卖家
    的头像 发表于 10-17 14:59 350次阅读

    阿里巴巴开放平台关键字搜索商品接口实战详解:OAuth2.0 认证落地 + 检索效率优化(附避坑代码)

    在 B2B 电商数据对接中,阿里巴巴开放平台的关键字搜索商品接口(alibaba.aliindex.search)是获取批发商品、供应商数据
    的头像 发表于 09-16 16:26 657次阅读

    micro 关键字搜索全覆盖商品,并通过 API 接口提供实时数据

    micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据
    的头像 发表于 07-13 10:13 694次阅读

    谷景阿里巴巴国际正式上线

    在行业发展的关键节点,谷景电子取得了重大突破,谷景阿里巴巴国际正式上线!此次上线聚焦电感领域,旨在为全球客户提供更较大好的电感产品与服务,也标志着谷景电感业务在国际化道路上迈出了
    的头像 发表于 02-26 09:44 774次阅读