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 } } // 更多商品... ] } }}
点击获取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
开放平台配置步骤
登录1688 开放平台完成开发者注册与认证
创建应用并获取
app_key
和app_secret
在应用管理中申请 "商品搜索" 接口权限(接口名称:
alibaba.product.search
)配置服务器 IP 白名单(仅白名单内 IP 可调用接口)
确认接口调用限制:默认 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 无误 |
110 | IP 不在白名单 | 在 1688 开放平台添加服务器公网 IP 到白名单 |
200 | 关键词为空 | 确保 keywords 参数不为空且长度符合要求(1-60 字符) |
400 | 参数错误 | 检查 page_size 是否在 1-50 范围内,价格参数是否为数字 |
429 | 调用频率超限 | 实现限流机制,优化缓存策略,减少重复请求 |
500 | 服务器错误 | 实现重试机制,记录错误日志,稍后再试 |
搜索效果优化建议
- 关键词优化:
使用行业术语而非口语化表达(如 "纯棉针织布" 而非 "纯棉布")
增加产品属性词(如 "21 支纯棉 T 恤" 比 "纯棉 T 恤" 更精准)
避免使用过多修饰词,保持关键词简洁
- 筛选参数组合策略:python
运行
运行
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"])
六、合规使用与场景应用
合规使用规范
数据使用范围:获取的商品数据仅用于自身业务系统,不得转售或公开传播
调用频率控制:严格遵守 1688 开放平台的调用限制,默认不超过 100 次 / 分钟
标识要求:在使用搜索结果的页面中,需注明数据来源为 1688 平台
知识产权:尊重商品信息的知识产权,不盗用图片或文字描述
典型应用场景
- 智能采购系统:
结合关键词搜索和供应链分析,自动推荐高性价比供应商,计算最优采购量 - 竞品价格监控:
定期搜索同类商品,跟踪价格变化趋势,生成价格波动报告 - 供应商评估体系:
基于搜索结果中的供应商信用、交易数据和生产能力,建立量化评估模型 - 市场趋势分析:
通过关键词搜索结果的数量、价格、销量等数据,分析市场供需变化
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