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
