×

1688 平台关键字搜索接口深度开发:从精准筛选到供应链数据分析

Ace Ace 发表于2025-08-11 16:43:47 浏览52 评论0

抢沙发发表评论

1688 作为国内最大的 B2B 电商平台,其关键字搜索接口不仅是商品检索的工具,更是供应链数据分析的重要入口。与 C 端电商搜索不同,1688 的搜索接口需要兼顾批发场景的特殊需求,如供应商资质筛选、起订量过滤、批发价格区间匹配等。本文将从接口参数体系、高级筛选功能、数据解析与供应链分析等维度,结合完整代码实现,帮助开发者构建符合 B2B 业务场景的高效搜索系统。

一、接口核心特性与参数体系

1688 关键字搜索接口(alibaba.product.search)基于 B2B 电商场景设计,具有以下核心特性:


  • 多维度筛选:支持按价格、起订量、供应商类型、交易方式等 20 + 维度筛选

  • 供应商信用体系:集成诚信通年限、交易等级、买家评价等信用数据

  • 批发属性突出:提供起订量、混批支持、阶梯价格等批发核心字段

  • 供应链标签:包含是否源头工厂、是否支持定制、产能信息等供应链特性

完整参数体系

1688 关键字搜索接口参数分为基础参数、搜索参数、筛选参数和扩展参数四大类,核心参数如下:


参数类别关键参数说明取值示例
基础参数app_key应用标识从开放平台获取

method接口方法名固定为alibaba.product.search

timestamp时间戳2024-08-10 15:30:22

sign请求签名基于参数生成的加密字符串
搜索参数keywords搜索关键字纯棉 T 恤 定制

page页码1(默认)、2...

page_size每页条数20(默认)、50(最大)
价格筛选start_price最低价格10.00

end_price最高价格50.00
供应商筛选supplier_type供应商类型0 - 全部、1 - 生产厂家、2 - 经销商

credit_level信用等级3-3A 及以上
批发特性min_order起订量100(件)

is_mix是否支持混批true/false
排序参数sort_type排序方式0 - 综合、1 - 价格升、2 - 价格降、3 - 销量降

响应数据结构

接口返回数据包含商品列表、分页信息和筛选条件统计,核心结构如下:


json
{
  "alibaba_product_search_response": {
    "result": {
      "total_results": 2860,  // 总商品数
      "page": 1,
      "page_size": 20,
      "products": [
        {
          "product_id": "628745190321",
          "title": "2024夏季纯棉短袖T恤 厂家直销 支持定制LOGO",
          "price": "22.50",  // 单价
          "price_unit": "件",
          "min_order": 5,  // 起订量
          "mix_enable": true,  // 是否支持混批
          "image_url": "https://cbu01.alicdn.com/img/ibank/2024/xxx.jpg",
          "supplier": {
            "user_id": "2209876543210",
            "company_name": "XX服装有限公司",
            "supplier_type": "生产厂家",
            "credit_level": "4A",
            "year": 8,  // 诚信通年限
            "is_verified": true  // 是否实名认证
          },
          "transaction": {
            "sales_count": 12560,  // 30天销量
            "satisfaction": 98  // 满意度(%)
          },
          "capability": {  // 供应链能力
            "production_capacity": "10000件/日",
            "customize_support": true
          }
        }
        // 更多商品...
      ]
    }
  }}

图片.png

点击获取key和secret

二、开发环境与前置准备

环境配置

  • 开发语言:Python 3.8+(推荐 3.10 版本)

  • 核心依赖:requests(HTTP 请求)、pandas(数据处理)、pycryptodome(签名计算)

  • 开发工具:PyCharm/VS Code(带 Python 插件)

  • 运行环境:Windows/macOS/Linux 均可,需联网访问 1688 开放平台

依赖安装

bash
pip install requests pandas pycryptodome python-dateutil

开放平台配置步骤

  1. 登录1688 开放平台完成开发者注册与认证

  2. 创建应用并获取app_keyapp_secret

  3. 在应用管理中申请 "商品搜索" 接口权限(接口名称:alibaba.product.search

  4. 配置服务器 IP 白名单(仅白名单内 IP 可调用接口)

  5. 确认接口调用限制:默认 100 次 / 分钟,单页最大 50 条数据


三、接口开发实战实现

步骤 1:签名生成工具实现

1688 采用 MD5 签名算法,实现代码如下:


python
运行
import timeimport hashlibimport urllib.parsedef generate_1688_sign(params: dict, app_secret: str) -> str:
    """
    生成1688接口签名
    :param params: 请求参数字典
    :param app_secret: 应用密钥
    :return: 签名字符串
    """
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    
    # 2. 拼接为key=value&key=value格式
    query_string = urllib.parse.urlencode(sorted_params)
    
    # 3. 拼接appsecret并计算MD5
    sign_str = f"{query_string}{app_secret}"
    sign = hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
    
    return sign

步骤 2:搜索接口客户端封装

python
运行
import requestsimport jsonfrom typing import Dict, Optional, Any, Listclass AlibabaProductSearchAPI:
    def __init__(self, app_key: str, app_secret: str):
        self.app_key = app_key
        self.app_secret = app_secret
        self.api_url = "https://gw.open.1688.com/openapi/param2/2.0/"
        
    def search_products(self, 
                       keywords: str,
                       page: int = 1,
                       page_size: int = 20,** kwargs) -> Optional[Dict[str, Any]]:
        """
        搜索1688商品
        :param keywords: 搜索关键字
        :param page: 页码
        :param page_size: 每页条数
        :param kwargs: 其他筛选参数
        :return: 搜索结果字典
        """
        # 1. 构建基础参数
        params = {
            "method": "alibaba.product.search",
            "app_key": self.app_key,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
            "format": "json",
            "v": "2.0",
            "keywords": keywords,
            "page": page,
            "page_size": page_size,
            **kwargs        }
        
        # 2. 生成签名
        params["sign"] = generate_1688_sign(params, self.app_secret)
        
        try:
            # 3. 发送GET请求
            response = requests.get(
                self.api_url,
                params=params,
                timeout=15
            )
            
            # 4. 处理响应
            response.raise_for_status()
            result = json.loads(response.text)
            
            # 5. 错误处理
            if "error_response" in result:
                error = result["error_response"]
                print(f"接口错误: {error.get('msg')} (错误码: {error.get('code')})")
                return None
                
            return result.get("alibaba_product_search_response", {}).get("result", {})
            
        except requests.exceptions.RequestException as e:
            print(f"HTTP请求异常: {str(e)}")
            return None
        except json.JSONDecodeError as e:
            print(f"JSON解析错误: {str(e)}")
            return None

步骤 3:B2B 搜索结果解析

针对 B2B 场景特性,实现专业化的数据解析:


python
运行
import pandas as pddef parse_search_results(raw_result: Dict) -> tuple[Optional[pd.DataFrame], Optional[Dict]]:
    """
    解析搜索结果为结构化数据
    :param raw_result: 接口返回的原始数据
    :return: 商品DataFrame和统计信息
    """
    if not raw_result or "products" not in raw_result:
        return None, None
        
    products = []
    for item in raw_result["products"]:
        supplier = item.get("supplier", {})
        transaction = item.get("transaction", {})
        capability = item.get("capability", {})
        
        product_info = {
            # 商品基础信息
            "product_id": item.get("product_id"),
            "title": item.get("title"),
            "price": item.get("price"),
            "price_unit": item.get("price_unit", "件"),
            "image_url": item.get("image_url"),
            
            # 批发特性
            "min_order": item.get("min_order", 1),
            "mix_enable": item.get("mix_enable", False),
            
            # 供应商信息
            "supplier_id": supplier.get("user_id"),
            "company_name": supplier.get("company_name"),
            "supplier_type": supplier.get("supplier_type"),
            "credit_level": supplier.get("credit_level"),
            "trust_year": supplier.get("year", 0),
            
            # 交易数据
            "sales_count": transaction.get("sales_count", 0),
            "satisfaction": transaction.get("satisfaction", 0),
            
            # 供应链能力
            "production_capacity": capability.get("production_capacity", ""),
            "customize_support": capability.get("customize_support", False)
        }
        products.append(product_info)
    
    # 转换为DataFrame
    df = pd.DataFrame(products)
    
    # 数据类型转换
    if not df.empty:
        df["price"] = pd.to_numeric(df["price"], errors="coerce")
        df["min_order"] = pd.to_numeric(df["min_order"], errors="coerce")
        df["sales_count"] = pd.to_numeric(df["sales_count"], errors="coerce")
        df["satisfaction"] = pd.to_numeric(df["satisfaction"], errors="coerce")
        df["trust_year"] = pd.to_numeric(df["trust_year"], errors="coerce")
    
    # 统计信息
    stats = {
        "total_results": raw_result.get("total_results", 0),
        "page": raw_result.get("page", 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)
    }
    
    return df, stats

步骤 4:高级筛选与供应链分析工具

python
运行
def filter_suppliers(df: pd.DataFrame, **filters) -> pd.DataFrame:
    """
    高级筛选供应商商品
    :param df: 商品DataFrame
    :param filters: 筛选条件,如min_trust_year=3, min_satisfaction=95等
    :return: 筛选后的DataFrame
    """
    if df.empty:
        return df
        
    filtered_df = df.copy()
    
    # 应用筛选条件
    if "min_trust_year" in filters:
        filtered_df = filtered_df[filtered_df["trust_year"] >= filters["min_trust_year"]]
        
    if "min_satisfaction" in filters:
        filtered_df = filtered_df[filtered_df["satisfaction"] >= filters["min_satisfaction"]]
        
    if "min_sales" in filters:
        filtered_df = filtered_df[filtered_df["sales_count"] >= filters["min_sales"]]
        
    if "supplier_types" in filters:
        filtered_df = filtered_df[filtered_df["supplier_type"].isin(filters["supplier_types"])]
        
    if "customize_required" in filters and filters["customize_required"]:
        filtered_df = filtered_df[filtered_df["customize_support"] == True]
        
    return filtered_df.reset_index(drop=True)def analyze_supply_chain(df: pd.DataFrame) -> Dict:
    """
    供应链数据分析
    :param df: 商品DataFrame
    :return: 供应链分析结果
    """
    if df.empty:
        return {}
        
    # 价格分布
    price_stats = {
        "avg_price": round(df["price"].mean(), 2),
        "min_price": df["price"].min(),
        "max_price": df["price"].max(),
        "price_range": f"{df['price'].min()}-{df['price'].max()}"
    }
    
    # 供应商类型分布
    supplier_type_dist = df["supplier_type"].value_counts().to_dict()
    
    # 起订量分析
    order_stats = {
        "avg_min_order": round(df["min_order"].mean(), 1),
        "min_order_pct": {
            "≤10": round(len(df[df["min_order"] <= 10])/len(df)*100, 1),
            "11-50": round(len(df[(df["min_order"] >10) & (df["min_order"] <=50)])/len(df)*100, 1),
            ">50": round(len(df[df["min_order"] >50])/len(df)*100, 1)
        }
    }
    
    return {
        "price_analysis": price_stats,
        "supplier_distribution": supplier_type_dist,
        "order_analysis": order_stats,
        "customize_support_rate": round(len(df[df["customize_support"] == True])/len(df)*100, 1)
    }

步骤 5:完整调用与分析示例

python
运行
if __name__ == "__main__":
    # 配置应用信息(替换为实际值)
    APP_KEY = "your_app_key_here"
    APP_SECRET = "your_app_secret_here"
    
    # 初始化API客户端
    search_api = AlibabaProductSearchAPI(APP_KEY, APP_SECRET)
    
    # 搜索参数配置
    KEYWORDS = "纯棉T恤 定制"
    SEARCH_PARAMS = {
        "start_price": 10,        # 最低价格
        "end_price": 50,          # 最高价格
        "sort_type": 3,           # 按销量降序
        "page_size": 50           # 每页50条
    }
    
    # 执行搜索
    print(f"搜索关键字: {KEYWORDS}")
    raw_result = search_api.search_products(
        keywords=KEYWORDS,
        page=1,
        **SEARCH_PARAMS    )
    
    # 解析结果
    if raw_result:
        products_df, stats = parse_search_results(raw_result)
        
        if products_df is not None and not products_df.empty:
            print(f"\n搜索完成: 共找到 {stats['total_results']} 件商品,当前为第 {stats['page']}/{stats['total_pages']} 页")
            
            # 高级筛选:找生产厂家、诚信通≥5年、满意度≥95%
            filtered_df = filter_suppliers(
                products_df,
                min_trust_year=5,
                min_satisfaction=95,
                supplier_types=["生产厂家"],
                customize_required=True  # 需要支持定制
            )
            
            print(f"筛选后剩余 {len(filtered_df)} 件符合条件的商品")
            
            # 显示前5条结果
            print("\nTop 5 商品信息:")
            print(filtered_df[["title", "price", "min_order", "company_name", 
                             "trust_year", "sales_count"]].head())
            
            # 供应链分析
            supply_chain_analysis = analyze_supply_chain(filtered_df)
            print("\n===== 供应链分析结果 =====")
            print(f"价格区间: {supply_chain_analysis['price_analysis']['price_range']}元")
            print(f"平均起订量: {supply_chain_analysis['order_analysis']['avg_min_order']}件")
            print(f"支持定制的比例: {supply_chain_analysis['customize_support_rate']}%")
            print("供应商类型分布:")
            for type_name, count in supply_chain_analysis['supplier_distribution'].items():
                print(f"- {type_name}: {count}家")
            
            # 保存结果
            filtered_df.to_csv("filtered_products.csv", index=False, encoding="utf-8-sig")
            print("\n筛选结果已保存至 filtered_products.csv")

四、接口优化与高可用设计

批量搜索与异步处理

python
运行
import asyncioimport aiohttpclass AsyncAlibabaSearchAPI(AlibabaProductSearchAPI):
    async def async_search(self, session: aiohttp.ClientSession, keywords: str, page: int,** kwargs) -> Optional[Dict]:
        """异步搜索实现"""
        params = {
            "method": "alibaba.product.search",
            "app_key": self.app_key,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
            "format": "json",
            "v": "2.0",
            "keywords": keywords,
            "page": page,
            **kwargs        }
        params["sign"] = generate_1688_sign(params, self.app_secret)
        
        try:
            async with session.get(self.api_url, params=params, timeout=15) as response:
                response.raise_for_status()
                result = await response.json()
                if "error_response" in result:
                    return None
                return result.get("alibaba_product_search_response", {}).get("result", {})
        except Exception as e:
            print(f"异步搜索错误: {str(e)}")
            return None
    
    async def batch_search(self, keywords: str, total_pages: int = 3,** kwargs) -> List[pd.DataFrame]:
        """批量异步搜索多页数据"""
        async with aiohttp.ClientSession() as session:
            tasks = [
                self.async_search(session, keywords, page, **kwargs)
                for page in range(1, total_pages + 1)
            ]
            results = await asyncio.gather(*tasks)
            
            # 解析所有结果
            dataframes = []
            for result in results:
                if result:
                    df, _ = parse_search_results(result)
                    if df is not None and not df.empty:
                        dataframes.append(df)
            
            return dataframes# 使用示例# loop = asyncio.get_event_loop()# async_api = AsyncAlibabaSearchAPI(APP_KEY, APP_SECRET)# dfs = loop.run_until_complete(async_api.batch_search("纯棉T恤", total_pages=3))# combined_df = pd.concat(dfs, ignore_index=True)

智能缓存策略

python
运行
import redisimport picklefrom datetime import timedeltaclass CachedSearchAPI(AlibabaProductSearchAPI):
    def __init__(self, app_key, app_secret, redis_host="localhost", redis_port=6379):
        super().__init__(app_key, app_secret)
        self.redis = redis.Redis(host=redis_host, port=redis_port, db=0)
        
    def generate_cache_key(self, keywords: str,** kwargs) -> str:
        """生成缓存键"""
        sorted_kwargs = sorted(kwargs.items())
        kwargs_str = "_".join([f"{k}_{v}" for k, v in sorted_kwargs])
        return f"1688_search:{keywords}:{kwargs_str}"
        
    def search_with_cache(self, keywords: str, expire=3600, **kwargs) -> Optional[Dict]:
        """带缓存的搜索"""
        cache_key = self.generate_cache_key(keywords,** kwargs)
        
        # 尝试从缓存获取
        cached_data = self.redis.get(cache_key)
        if cached_data:
            return pickle.loads(cached_data)
            
        # 调用接口
        result = self.search_products(keywords, **kwargs)
        
        # 存入缓存
        if result:
            self.redis.setex(cache_key, timedelta(seconds=expire), pickle.dumps(result))
            
        return result

限流与重试机制

python
运行
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_typeclass ReliableSearchAPI(AlibabaProductSearchAPI):
    @retry(
        stop=stop_after_attempt(3),  # 最多重试3次
        wait=wait_exponential(multiplier=1, min=2, max=10),  # 指数退避
        retry=retry_if_exception_type((requests.exceptions.RequestException, json.JSONDecodeError))
    )
    def search_with_retry(self,** kwargs) -> Optional[Dict]:
        """带重试机制的搜索"""
        return super().search_products(**kwargs)# 限流实现import timefrom collections import dequeclass RateLimitedSearchAPI(AlibabaProductSearchAPI):
    def __init__(self, app_key, app_secret, max_calls=100, period=60):
        super().__init__(app_key, app_secret)
        self.max_calls = max_calls  # 每分钟最大调用次数
        self.period = period
        self.calls = deque()
        
    def acquire(self):
        """获取调用许可"""
        now = time.time()
        # 移除过期的调用记录
        while self.calls and now - self.calls[0] > self.period:
            self.calls.popleft()
        # 如果达到最大调用次数,等待
        if len(self.calls) >= self.max_calls:
            sleep_time = self.period - (now - self.calls[0])
            time.sleep(sleep_time + 0.1)
            self.acquire()
        self.calls.append(now)
        
    def search_with_rate_limit(self, **kwargs) -> Optional[Dict]:
        """限流搜索"""
        self.acquire()
        return super().search_products(** kwargs)

五、常见问题与解决方案

接口调用错误处理

错误码错误信息解决方案
101签名错误检查签名生成逻辑,确保参数排序正确,app_secret 无误
110IP 不在白名单在 1688 开放平台添加服务器公网 IP 到白名单
200关键词为空确保 keywords 参数不为空且长度符合要求(1-60 字符)
400参数错误检查 page_size 是否在 1-50 范围内,价格参数是否为数字
429调用频率超限实现限流机制,优化缓存策略,减少重复请求
500服务器错误实现重试机制,记录错误日志,稍后再试

搜索效果优化建议

  1. 关键词优化
    • 使用行业术语而非口语化表达(如 "纯棉针织布" 而非 "纯棉布")

    • 增加产品属性词(如 "21 支纯棉 T 恤" 比 "纯棉 T 恤" 更精准)

    • 避免使用过多修饰词,保持关键词简洁

  2. 筛选参数组合策略
    python
运行
运行
  1. def filter_by_title(df: pd.DataFrame, keywords: list) -> pd.DataFrame:
        """根据标题关键词二次过滤"""
        if df.empty:
            return df        
        def match_keywords(title):
            title = str(title).lower()
            return all(kw.lower() in title for kw in keywords)
            
        df["match"] = df["title"].apply(match_keywords)
        return df[df["match"]].drop(columns=["match"])


六、合规使用与场景应用

合规使用规范

  1. 数据使用范围:获取的商品数据仅用于自身业务系统,不得转售或公开传播

  2. 调用频率控制:严格遵守 1688 开放平台的调用限制,默认不超过 100 次 / 分钟

  3. 标识要求:在使用搜索结果的页面中,需注明数据来源为 1688 平台

  4. 知识产权:尊重商品信息的知识产权,不盗用图片或文字描述

典型应用场景

  1. 智能采购系统
    结合关键词搜索和供应链分析,自动推荐高性价比供应商,计算最优采购量
  2. 竞品价格监控
    定期搜索同类商品,跟踪价格变化趋势,生成价格波动报告
  3. 供应商评估体系
    基于搜索结果中的供应商信用、交易数据和生产能力,建立量化评估模型
  4. 市场趋势分析
    通过关键词搜索结果的数量、价格、销量等数据,分析市场供需变化


1688 关键字搜索接口为 B2B 电商场景提供了强大的数据支持,通过本文介绍的技术方案,开发者可以构建高效、精准的商品搜索系统。在实际应用中,应充分利用其 B2B 特性,结合供应链分析,为采购决策、供应商管理等业务场景提供数据支撑,同时严格遵守平台规范,实现合规、可持续的接口调用。
  • def get_filter_strategy(scene: str) -> dict:
        """根据业务场景返回筛选策略"""
        strategies = {
            "small_business": {  # 小批量采购
                "min_order": 10,
                "is_mix": True,
                "supplier_type": 0
            },
            "large_wholesale": {  # 大批量批发
                "min_order": 500,
                "sort_type": 3,
                "supplier_type": 1  # 优先生产厂家
            },
            "custom_manufacturing": {  # 定制加工
                "customize_support": True,
                "supplier_type": 1,
                "min_trust_year": 5
            }
        }
        return strategies.get(scene, {})


  • 结果二次过滤
    python


群贤毕至

访客