1688
平台的图片搜索接口(以图搜货)是 B2B 电商领域的重要功能,通过图像识别技术实现 "以图找同款",极大提升了采购效率。与 C
端平台相比,1688 的图片搜索更侧重于供应商资质、批发价格等 B2B 特性数据的返回。本文将全面解析 1688
图片搜索接口的技术实现,从图像预处理、接口调用到结果解析,结合完整代码示例,帮助开发者构建高效的以图搜货系统。
一、接口技术原理与核心特性
1688 图片搜索接口基于深度学习图像识别技术,核心原理是通过提取商品图片的特征向量,与平台商品库中的图片特征进行比对,返回相似度最高的商品列表。其技术流程包括:
图像预处理(压缩、归一化、降噪)
特征提取(通过 CNN 模型提取图像特征向量)
向量比对(计算特征向量相似度)
结果排序(按相似度、销量、价格等维度排序)
核心参数解析
1688 图片搜索接口(
alibaba.image.search)的核心参数如下:| 参数类别 | 具体参数 | 作用说明 |
|---|---|---|
| 基础参数 | app_key | 应用标识,开放平台获取 |
method | 接口方法名,固定为alibaba.image.search | |
timestamp | 时间戳(yyyy-MM-dd HH:mm:ss) | |
format | 响应格式,默认 json | |
v | 版本号,固定为 2.0 | |
sign | 请求签名,用于身份验证 | |
| 业务参数 | image | 图片 Base64 编码字符串(必填) |
image_url | 图片 URL(与 image 二选一) | |
page | 页码,默认 1 | |
page_size | 每页条数,1-50 | |
| 筛选参数 | price_from/price_to | 价格区间筛选 |
is_wholesale | 是否支持批发(0 - 全部,1 - 仅批发) | |
sort | 排序方式(0 - 相似度,1 - 价格升序,2 - 价格降序) |
响应数据结构
接口返回的商品列表包含丰富的 B2B 属性,核心结构如下:
json
{
"alibaba_image_search_response": {
"result": {
"total": 128, // 匹配商品总数
"page": 1,
"page_size": 20,
"products": [
{
"product_id": "628745190321", // 商品ID
"title": "夏季纯棉短袖T恤 宽松百搭 厂家直销",
"main_image": "https://cbu01.alicdn.com/img/ibank/2024/123/456/789/012/abcdef.jpg",
"price": "23.50", // 单价
"min_buy": 5, // 起订量
"supplier": {
"user_id": "2209876543210",
"company_name": "XX服装有限公司",
"credit_level": 5 // 信用等级
},
"similarity": 0.96 // 相似度(0-1)
}
// 更多商品...
]
}
}}点击获取key和secret
二、开发环境准备与依赖配置
环境要求
编程语言:Python 3.8+
核心库:
requests(HTTP 请求)、Pillow(图像处理)、base64(图片编码)开发工具:PyCharm/VS Code
运行环境:支持 Windows/macOS/Linux,需联网访问 1688 开放平台
依赖安装命令
bash
pip install requests Pillow python-dateutil
开放平台配置
登录1688 开放平台完成开发者注册
创建应用并获取
app_key和app_secret申请 "图片搜索" 接口权限(接口名称:
alibaba.image.search)配置 IP 白名单,设置接口调用频率阈值(默认 100 次 / 分钟)
三、接口开发实战实现
步骤 1:图像预处理与编码工具
图片搜索接口对输入图片有特定要求(尺寸、格式、大小),需要进行预处理:
python
运行
import base64from PIL import Imageimport iodef process_image(image_path, max_size=(800, 800), quality=85):
"""
预处理图片并转换为Base64编码
:param image_path: 图片路径
:param max_size: 最大尺寸(宽, 高)
:param quality: 压缩质量(1-100)
:return: Base64编码字符串
"""
try:
# 打开图片
with Image.open(image_path) as img:
# 转换为RGB模式(处理透明背景)
if img.mode in ('RGBA', 'LA'):
background = Image.new(img.mode[:-1], img.size, (255, 255, 255))
background.paste(img, img.split()[-1])
img = background
# 按比例缩放
img.thumbnail(max_size)
# 保存到内存缓冲区
buffer = io.BytesIO()
img.save(buffer, format='JPEG', quality=quality)
# 转换为Base64编码
base64_str = base64.b64encode(buffer.getvalue()).decode('utf-8')
return base64_str
except Exception as e:
print(f"图片处理失败: {str(e)}")
return None步骤 2:签名生成与接口客户端封装
python
运行
import timeimport hashlibimport urllib.parseimport requestsimport jsonfrom typing import Dict, Optional, Anydef generate_1688_sign(params, app_secret):
"""生成1688接口签名"""
# 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 signclass AlibabaImageSearchAPI:
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_by_image(self,
image_base64: str = None,
image_url: str = None,
page: int = 1,
page_size: int = 20,** kwargs) -> Optional[Dict[str, Any]]:
"""
以图搜货接口调用
:param image_base64: 图片Base64编码
:param image_url: 图片URL(与image_base64二选一)
:param page: 页码
:param page_size: 每页条数
:param kwargs: 其他筛选参数
:return: 搜索结果字典
"""
# 校验图片参数
if not image_base64 and not image_url:
print("必须提供图片Base64编码或图片URL")
return None
# 1. 构建基础参数
params = {
"method": "alibaba.image.search",
"app_key": self.app_key,
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "2.0",
"page": page,
"page_size": page_size,
**kwargs }
# 2. 添加图片参数
if image_base64:
params["image"] = image_base64 else:
params["image_url"] = image_url
# 3. 生成签名
params["sign"] = generate_1688_sign(params, self.app_secret)
try:
# 4. 发送请求
response = requests.get(
self.api_url,
params=params,
timeout=30 # 图片搜索耗时较长,设置较长超时
)
# 5. 处理响应
response.raise_for_status()
result = json.loads(response.text)
# 6. 错误处理
if "error_response" in result:
error = result["error_response"]
print(f"接口错误: {error.get('msg')} (错误码: {error.get('code')})")
return None
return result.get("alibaba_image_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 特性提取
python
运行
import pandas as pddef parse_image_search_result(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", {})
product_info = {
"product_id": item.get("product_id"),
"title": item.get("title"),
"main_image": item.get("main_image"),
"price": item.get("price"),
"min_buy": item.get("min_buy", 1),
"similarity": item.get("similarity", 0),
"supplier_id": supplier.get("user_id"),
"company_name": supplier.get("company_name"),
"credit_level": supplier.get("credit_level", 0)
}
products.append(product_info)
# 转换为DataFrame
df = pd.DataFrame(products)
# 解析统计信息
stats = {
"total": raw_result.get("total", 0),
"page": raw_result.get("page", 1),
"page_size": raw_result.get("page_size", 20),
"total_page": (raw_result.get("total", 0) + raw_result.get("page_size", 20) - 1)
// raw_result.get("page_size", 20)
}
return df, statsdef filter_best_suppliers(df: pd.DataFrame, min_credit: int = 4, min_similarity: float = 0.8) -> pd.DataFrame:
"""
筛选优质供应商商品
:param df: 商品DataFrame
:param min_credit: 最低信用等级
:param min_similarity: 最低相似度
:return: 筛选后的DataFrame
"""
if df.empty:
return df
# 转换数据类型
df["similarity"] = df["similarity"].astype(float)
df["credit_level"] = df["credit_level"].astype(int)
df["price"] = df["price"].astype(float)
df["min_buy"] = df["min_buy"].astype(int)
# 筛选条件
filtered = df[
(df["credit_level"] >= min_credit) &
(df["similarity"] >= min_similarity)
]
# 按相似度和价格排序
return filtered.sort_values(
by=["similarity", "price"],
ascending=[False, True]
).reset_index(drop=True)步骤 4:完整调用示例
python
运行
if __name__ == "__main__":
# 配置应用信息(替换为实际值)
APP_KEY = "your_app_key_here"
APP_SECRET = "your_app_secret_here"
# 初始化API客户端
image_search_api = AlibabaImageSearchAPI(APP_KEY, APP_SECRET)
# 图片处理(可以是本地图片或网络图片URL)
image_path = "test_product.jpg" # 本地测试图片
image_base64 = process_image(image_path)
# 或者使用图片URL
# image_url = "https://example.com/product.jpg"
if image_base64:
# 调用图片搜索接口
print("正在进行以图搜货...")
search_result = image_search_api.search_by_image(
image_base64=image_base64,
page=1,
page_size=20,
price_from=10,
price_to=100,
is_wholesale=1, # 只看支持批发的商品
sort=0 # 按相似度排序
)
# 解析结果
if search_result:
products_df, stats = parse_image_search_result(search_result)
if products_df is not None and not products_df.empty:
print(f"\n搜索完成,共找到 {stats['total']} 件匹配商品")
# 筛选优质供应商商品
best_products = filter_best_suppliers(products_df)
print(f"筛选出 {len(best_products)} 件优质商品(信用等级≥4,相似度≥0.8)")
# 显示前5条结果
print("\n前5条匹配结果:")
print(best_products[["title", "price", "min_buy", "similarity", "company_name", "credit_level"]].head())
# 保存结果到CSV
products_df.to_csv("image_search_results.csv", index=False, encoding="utf-8-sig")
print("\n完整结果已保存至 image_search_results.csv")
else:
print("图片处理失败,无法进行搜索")四、接口优化与搜索效果提升
图像预处理优化
提升搜索准确率的关键在于图像质量,优化处理代码:
python
运行
def advanced_image_processing(image_path):
"""高级图像预处理,提升搜索准确率"""
try:
with Image.open(image_path) as img:
# 1. 裁剪:去除边缘无关区域(假设商品在中心)
width, height = img.size
crop_size = min(width, height)
left = (width - crop_size) // 2
top = (height - crop_size) // 2
img = img.crop((left, top, left + crop_size, top + crop_size))
# 2. 增强对比度
from PIL import ImageEnhance
enhancer = ImageEnhance.Contrast(img)
img = enhancer.enhance(1.2) # 增加20%对比度
# 3. 转为Base64
buffer = io.BytesIO()
img.save(buffer, format='JPEG', quality=90)
return base64.b64encode(buffer.getvalue()).decode('utf-8')
except Exception as e:
print(f"高级图像处理失败: {str(e)}")
return process_image(image_path) # 降级处理批量搜索与缓存策略
python
运行
import redisimport picklefrom datetime import timedeltaclass CachedImageSearchAPI(AlibabaImageSearchAPI):
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 get_image_hash(self, image_base64):
"""生成图片内容的哈希值作为缓存键"""
return hashlib.md5(image_base64.encode('utf-8')).hexdigest()
def search_with_cache(self, image_base64=None, image_url=None, expire=3600, **kwargs):
"""带缓存的图片搜索"""
# 生成缓存键
if image_base64:
cache_key = f"1688_image_search:{self.get_image_hash(image_base64)}"
elif image_url:
cache_key = f"1688_image_search_url:{hashlib.md5(image_url.encode()).hexdigest()}"
else:
return None
# 尝试从缓存获取
cached_data = self.redis.get(cache_key)
if cached_data:
return pickle.loads(cached_data)
# 调用接口
result = self.search_by_image(image_base64, image_url,** kwargs)
# 存入缓存(图片搜索结果相对稳定,可设置较长缓存时间)
if result:
self.redis.setex(cache_key, timedelta(seconds=expire), pickle.dumps(result))
return result多线程批量搜索实现
python
运行
from concurrent.futures import ThreadPoolExecutor, as_completeddef batch_image_search(api_client, image_paths, max_workers=3):
"""批量图片搜索"""
results = {}
with ThreadPoolExecutor(max_workers=max_workers) as executor:
# 提交所有搜索任务
futures = {}
for path in image_paths:
img_base64 = process_image(path)
if img_base64:
future = executor.submit(
api_client.search_with_cache,
image_base64=img_base64,
page=1,
page_size=10
)
futures[future] = path
# 处理结果
for future in as_completed(futures):
path = futures[future]
try:
result = future.result()
if result:
results[path] = result print(f"图片 {path} 搜索完成,找到 {result.get('total', 0)} 件商品")
except Exception as e:
print(f"图片 {path} 搜索失败: {str(e)}")
return results五、常见问题与解决方案
接口调用错误处理
| 错误代码 | 错误信息 | 解决方案 |
|---|---|---|
| 400 | 图片格式错误 | 确保图片为 JPG/PNG 格式,重新处理图片 |
| 413 | 图片过大 | 压缩图片至 5MB 以下,调整 quality 参数 |
| 502 | 图像识别服务异常 | 实现重试机制,稍后再试 |
| 110 | IP 不在白名单 | 在开放平台配置正确的服务器 IP |
| 429 | 调用频率超限 | 优化缓存策略,减少重复请求 |
搜索准确率优化建议
图片选择:使用商品主体清晰、背景简单的图片,避免模糊、光照过强或过暗的图片
多图搜索:对同一商品从不同角度拍摄,多次搜索取交集,提高结果准确性
参数调优:结合价格区间、供应商信用等筛选条件,缩小搜索范围
结果验证:通过标题关键词匹配度二次筛选结果,提升精准度
python
运行
def verify_search_results(df, keywords): """通过关键词验证搜索结果""" if df.empty: return df # 检查标题是否包含关键词 def match_keywords(title): title = str(title).lower() return any(keyword.lower() in title for keyword in keywords) df["keyword_match"] = df["title"].apply(match_keywords) return df[df["keyword_match"]].drop(columns=["keyword_match"])
六、合规使用与场景应用
接口合规使用规范
图片版权:仅使用拥有合法版权的图片进行搜索,避免侵权
调用频率:严格遵守 1688 开放平台的调用限制,默认不超过 100 次 / 分钟
数据用途:搜索结果仅用于自身业务,不得转售或用于非法用途
标识规范:在使用搜索结果的页面注明数据来源为 1688 平台
典型应用场景
采购助手:帮助采购商快速找到同款商品的供应商,对比批发价格和起订量
竞品分析:通过图片搜索监控竞争对手的商品定价和供应商信息
供应链管理:快速匹配自有产品与平台供应商,拓展采购渠道
电商代运营:为客户提供同款商品的市场分布和价格区间分析
1688
图片搜索接口通过图像识别技术打破了传统文本搜索的局限,为 B2B
电商场景提供了高效的商品匹配方案。开发者通过本文提供的技术方案,可以快速构建稳定、高效的以图搜货系统,结合 B2B
特性数据的深度挖掘,为采购决策提供有力支持。在实际应用中,应注重图片质量优化和搜索结果筛选,不断提升搜索准确性和用户体验。
