在跨境电商领域,自动化获取商品详情数据是数据分析、价格监控和竞品研究的核心能力。本文将深入实战,详解如何通过速卖通开放平台API接口aliexpress.item.get获取商品详情,并提供可直接运行的Python代码示例。
一、接口概述
速卖通提供了官方商品详情API接口aliexpress.item.get,允许开发者通过编程方式获取商品的完整信息,包括:
基础信息:商品标题、价格、库存、主图URL
SKU属性:规格参数、属性图、价格阶梯
物流模板:运费、配送时效、海外仓信息
营销数据:促销标签、历史价格、评价统计
原始数据:带HTML标签的商品描述、隐藏关键词等
二、准备工作
- 注册开发者账号
访问速卖通开放平台,注册企业开发者账号(需提供营业执照、法人身份证)。个人账号权限受限,无法访问完整商品数据。 - 创建应用并获取密钥
在开放平台创建"跨境数据应用"类型应用,审核通过后获取:
App Key:应用唯一标识(如12345678)
App Secret:签名加密密钥(如a1b2c3d4e5f6)
Access Token:通过OAuth 2.0授权获取,有效期通常为1年 - 申请特殊权限
如需获取原始HTML描述、价格波动记录等敏感数据,需额外申请:
raw_data_access:获取未清洗的原始数据
price_history:访问价格历史记录 - 安装Python依赖
bash
复制
pip install requests
三、核心调用流程 - 签名生成(关键步骤)
速卖通API采用HMAC-SHA256签名验证机制,以下是官方推荐的签名生成算法:
Python
复制
import hmac
import hashlib
import urllib.parse
from collections import OrderedDict
def generate_sign(params: dict, app_secret: str) -> str:
"""
生成速卖通API签名
:param params: 请求参数(不包含sign)
:param app_secret: 应用密钥
:return: 大写签名字符串
"""
# 按键名排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接字符串:secret + key1value1 + key2value2...
sign_content = app_secret + ''.join([f"{k}{v}" for k, v in sorted_params])
# HMAC-SHA256加密并转大写
sign = hmac.new(
app_secret.encode('utf-8'),
sign_content.encode('utf-8'),
hashlib.sha256
).hexdigest().upper()
return sign
- 封装商品详情获取函数
Python
复制
import requests
import time
from datetime import datetime
def get_item_detail(item_id: str, app_key: str, app_secret: str,
fields: str = "title,price,image_url,sku_property_list") -> dict:
"""
获取速卖通商品详情
:param item_id: 商品ID(如:1005005586923234)
:param app_key: 应用Key
:param app_secret: 应用密钥
:param fields: 需要返回的字段列表
:return: 商品详情字典
"""
# API网关地址(根据区域选择)
url = "https://api-sg.aliexpress.com/sync" # 新加坡节点
# url = "https://gw-api.aliexpress.com/router/rest" # 国内节点
# 构建公共参数
params = {
"method": "aliexpress.item.get",
"app_key": app_key,
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"format": "json",
"v": "2.0",
"sign_method": "hmac-sha256",
"item_id": item_id,
"fields": fields,
"language": "zh_CN"
}
# 生成签名并添加到参数
params["sign"] = generate_sign(params, app_secret)
try:
# 发送GET请求
response = requests.get(url, params=params, timeout=30)
response.raise_for_status()
# 解析响应
result = response.json()
# 检查业务错误码
if "error_response" in result:
print(f"API调用失败: {result['error_response']['msg']}")
return None
return result.get("aliexpress_item_get_response", {}).get("item", {})
except requests.exceptions.RequestException as e:
print(f"网络请求异常: {e}")
return None
except json.JSONDecodeError as e:
print(f"JSON解析失败: {e}")
return None
- 典型响应数据解析
接口返回的JSON数据结构如下:
Python
复制
{
"aliexpress_item_get_response": {
"item": {
"title": "Wireless Bluetooth Headphones",
"price": "19.99",
"original_price": "29.99",
"discount_rate": "33",
"currency_code": "USD",
"image_url": [
],"https://ae01.alicdn.com/kf/HTB1...jpg", "https://ae01.alicdn.com/kf/HTB2...jpg"
"sku_property_list": {
},"sku": [ { "sku_id": "14:29#Red", "price": "19.99", "stock": 1500, "property": [ {"name": "Color", "value": "Red"}, {"name": "Size", "value": "Standard"} ] } ]
"desc_html": "...",
"search_keywords": ["bluetooth headphones", "wireless earphones"],
"shipping_info": {
}"free_shipping": true, "delivery_time": "15-30 days"
}
}
}
四、完整实战示例
Python
复制配置参数
APP_KEY = "your_actual_app_key"
APP_SECRET = "your_actual_app_secret"
ITEM_ID = "1005005586923234" # 需替换为真实商品ID
def main():
print("=" 60)
print("速卖通商品详情API实战演示")
print("=" 60)
# 获取商品详情
product = get_item_detail(
item_id=ITEM_ID,
app_key=APP_KEY,
app_secret=APP_SECRET,
fields="title,price,image_url,sku_property_list,desc_html,search_keywords,shipping_info"
)
if not product:
print("获取商品信息失败!")
return
# 数据解析与展示
print(f"\n【商品标题】 {product.get('title', 'N/A')}")
print(f"【当前价格】 {product.get('price', 'N/A')} {product.get('currency_code', 'USD')}")
print(f"【原价】 {product.get('original_price', 'N/A')}")
print(f"【折扣】 {product.get('discount_rate', '0')}%")
# 解析SKU信息
sku_list = product.get("sku_property_list", {}).get("sku", [])
print(f"\n【SKU数量】 {len(sku_list)}")
for sku in sku_list[:3]: # 显示前3个SKU
print(f" - SKU ID: {sku.get('sku_id')}")
print(f" 价格: {sku.get('price')}, 库存: {sku.get('stock')}")
# 提取隐藏关键词(SEO优化)
keywords = product.get("search_keywords", [])
print(f"\n【隐藏关键词】 {', '.join(keywords)}")
# 解析HTML描述(需BeautifulSoup)
desc_html = product.get("desc_html", "")
if desc_html:
try:
from bs4 import BeautifulSoup
soup = BeautifulSoup(desc_html, 'html.parser')
# 提取参数表
param_table = soup.find('table', {'class': 'product-parameters'})
if param_table:
print("\n【商品参数】")
print(param_table.text.strip())
except ImportError:
print("\n【商品描述】 安装bs4后可解析HTML内容")
print("\n" + "=" * 60)
if name == "main":
main()
五、高级实战技巧
原始数据模式(深度分析)
如需获取未清洗的原始数据(含特殊符号、HTML标签),需开启原始模式:
Python
复制
def get_raw_item_detail(item_id: str, app_key: str, app_secret: str):
"""获取原始数据模式商品信息"""
params = {"method": "aliexpress.item.get", "app_key": app_key, "timestamp": int(time.time()), "num_iid": item_id, "raw_data": 1, # 关键参数:返回原始数据 "lang": "en", # 保留原始语种 "cross_border": 1, # 过滤禁运品 "sign_method": "hmac-sha256"}
params["sign"] = generate_sign(params, app_secret)response = requests.get("https://gw-api.aliexpress.com/router/rest", params=params)
return response.json()
原始数据包含高价值字段:
raw_title: 含表情符号的原始标题(如「【New】2025爆款🔥」)
desc_html: 完整HTML描述(可提取参数表格)
sku_raw: 未翻译的SKU属性(如俄语「цвет:красный」)
customs_info: 海关申报信息
price_history: 价格波动记录(需特殊权限)- 智能缓存策略
避免重复请求,降低API调用成本:
Python
复制
import hashlib
import redis # 需安装redis库
def get_cache_key(item_id: str) -> str:
"""生成缓存键"""
today = datetime.now().strftime("%Y%m%d")
return f"aliexpress:item:{hashlib.md5(f'{item_id}{today}'.encode()).hexdigest()}"
def get_item_with_cache(item_id: str, app_key: str, app_secret: str):
"""带缓存的商品获取"""
cache_key = get_cache_key(item_id)
# 尝试从Redis获取缓存
try:
r = redis.Redis(host='localhost', port=6379)
cached_data = r.get(cache_key)
if cached_data:
return json.loads(cached_data)
except:
pass
# 缓存未命中,调用API
data = get_item_detail(item_id, app_key, app_secret)
# 存入缓存(有效期24小时)
if data:
try:
r.setex(cache_key, 86400, json.dumps(data))
except:
pass
return data
- 异常监控与IP池切换
应对频率限制和IP封禁:
Python
复制
import random
def get_item_with_fallback(item_id: str, app_key: str, app_secret: str):
"""支持多IP轮询的请求"""
# 配置多个API节点
endpoints = [
"https://api-sg.aliexpress.com/sync",
"https://api-us.aliexpress.com/sync",
"https://gw-api.aliexpress.com/router/rest"
]
for endpoint in random.sample(endpoints, len(endpoints)):
try:
url = endpoint
# ... 构建参数和签名
response = requests.get(url, params=params, timeout=15)
result = response.json()
# 检查错误码
if "error_response" in result:
error_code = result["error_response"].get("code")
if error_code == "1002": # 频率超限
print("触发频率限制,切换节点...")
continue
return result
except Exception as e:
print(f"节点 {endpoint} 请求失败: {e}")
continue
return None
六、关键注意事项
- API调用限制
频率限制:默认QPS为10次/秒,日均调用不超过10万次
流量包管理:超出限制将返回错误码1002,需实现指数退避重试
最佳实践:对商品ID+日期做哈希缓存,重复请求可降低80%调用量 - 合法合规使用
数据存储:敏感字段(如customs_code、warehouse_address)需加密存储,符合GDPR要求
使用条款:严格遵守速卖通开放平台服务协议,不得用于价格爬虫等违规场景
版权说明:商品描述、图片等数据受版权保护,二次使用需获授权 - 签名验证常见错误
参数排序:必须按键名ASCII码升序排列
编码问题:URL参数需进行UTF-8编码,特殊字符使用urllib.parse.quote处理
时间戳格式:部分接口要求"%Y-%m-%d %H:%M:%S"格式,部分要求毫秒级时间戳
七、典型应用场景
竞品监控: 定时抓取竞品价格、库存变化,自动触发调价策略
选品分析: 通过search_keywords和price_history分析热销品特征
供应链溯源: 利用manufacturer_address字段定位供应商集群(如江西新余锂电产业带)
合规预警: 检测sku_properties中的认证信息(如CE、FCC),避免侵权风险
SEO优化: 提取desc_html中的参数表格,生成结构化产品页
八、总结
通过速卖通item_get接口,开发者可构建强大的商品数据采集系统。本文提供的签名算法、异常处理、缓存策略等实战代码可直接应用于生产环境。建议优先使用官方新加坡节点(api-sg.aliexpress.com),延迟更低且稳定性更高。
重要提醒:截止2024年底,速卖通已强化API权限审核,建议申请"跨境数据应用"类目以获取raw_data等高级权限。完整实现需结合业务场景持续优化请求策略和数据清洗流程。
如遇接口调用问题,可通过速卖通开放平台工单系统联系技术支持,或参考官方API文档(需登录后访问)。
引用
写一篇实战获取item_search_img-获得aliexpress图片搜索商品api接口的文章
编辑
复制
分享
搜索
aliexpress item search img api 实战
57 个结果
实战获取Aliexpress图片搜索接口
实战:速卖通AliExpress图片搜索商品API接口(item_search_img)完全指南
在跨境电商竞争日益激烈的今天,通过图片快速找到同款或相似商品已成为选品、比价和供应链追踪的核心能力。本文将深度解析速卖通图片搜索API接口aliexpress.item_search_img的实战应用,提供从认证到代码实现的完整解决方案。
一、接口概述
速卖通图片搜索API支持通过图片URL或图片哈希值检索同款商品,2025年新版API新增多图混合搜索和版权过滤参数,响应延迟优化至300ms以内。核心功能包括:
视觉相似度匹配:基于深度学习算法计算图片相似度得分(simi_score)
多维度筛选:支持价格区间、目标国家、销量排序等过滤条件
供应链溯源:通过商品主图快速定位上游供应商
竞品监控:批量比对竞品图片,自动发现同款商品
二、准备工作
- 注册企业开发者账号
个人开发者账号已无法申请图片搜索权限,需完成企业认证并创建"跨境数据应用"。 - 获取API凭证
创建应用后获取关键参数:
ini
复制
App Key = ALI_2025_XXXXXX
App Secret = ** - 申请图片搜索权限
在开放平台后台申请「图片搜索」API权限,审核周期通常为3-5个工作日。 - 安装Python依赖
bash
复制
pip install requests pillow hashlib
三、核心调用流程(新版OAuth2.0认证)
2025年API已废弃传统的HMAC-SHA256签名,改为OAuth2.0客户端凭证模式。 - 获取Access Token
Python
复制
import requests
def get_access_token(app_key: str, app_secret: str) -> str:
"""
获取OAuth2.0访问令牌
:param app_key: App Key
:param app_secret: App Secret
:return: access_token
"""
auth_url = "https://auth.aliexpress.com/oauth2/token"
auth_data = {
"grant_type": "client_credentials",
"client_id": app_key,
"client_secret": app_secret
}
response = requests.post(auth_url, data=auth_data, timeout=10)
if response.status_code == 200:
return response.json().get("access_token")
else:
raise Exception(f"获取Token失败: {response.text}")
- 生成图片哈希值(2025新版要求)
Python
复制
import hashlib
from PIL import Image
import io
def generate_image_hash(image_path: str) -> str:
"""
生成图片SHA-3哈希指纹(2025新增算法)
:param image_path: 本地图片路径
:return: 哈希字符串
"""
with open(image_path, "rb") as f:
image_data = f.read()
# 如果图片大于5MB,先压缩
if len(image_data) > 5 * 1024 * 1024:
img = Image.open(io.BytesIO(image_data))
img.thumbnail((1024, 1024), Image.Resampling.LANCZOS)
buffer = io.BytesIO()
img.save(buffer, format='JPEG', quality=85, optimize=True)
image_data = buffer.getvalue()
return hashlib.sha3_256(image_data).hexdigest()
封装图片搜索函数
Python
复制
def search_by_image(
image_path: str,
app_key: str,
app_secret: str,
max_results: int = 50,
price_range: str = None,
ship_to: str = "US"
) -> dict:
"""
图片搜索商品主函数
:param image_path: 本地图片路径
:param app_key: App Key
:param app_secret: App Secret
:param max_results: 返回最大商品数
:param price_range: 价格区间如"10-100"
:param ship_to: 目标国家代码
:return: 搜索结果字典
"""步骤1:获取Token
token = get_access_token(app_key, app_secret)
步骤2:生成图片哈希
image_hash = generate_image_hash(image_path)
步骤3:构造请求头
headers = {
"Authorization": f"Bearer {token}", "X-Copyright-Check": "strict", # 版权过滤:strict|loose|none "Content-Type": "application/json"}
步骤4:构造请求参数
api_url = "https://api.aliexpress.com/image-search/v3.1/items"
params = {"image_hash": image_hash, "max_results": max_results, "ship_to": ship_to, "sort": "similarity", # 按相似度排序 "language": "zh_CN"}
if price_range:
params["price_range"] = price_rangetry:
response = requests.get(api_url, headers=headers, params=params, timeout=30) response.raise_for_status() result = response.json() # 检查业务状态码 if result.get("code") != 0: print(f"API调用失败: {result.get('msg')} (request_id: {result.get('request_id')})") return None return result.get("result", {})except requests.exceptions.RequestException as e:
print(f"网络请求异常: {e}") return None四、完整实战示例
Python
复制
import json
from datetime import datetime
def main():
# ========== 配置区 ==========
APP_KEY = "your_actual_app_key"
APP_SECRET = "your_actual_app_secret"
IMAGE_PATH = "sample_product.jpg" # 测试图片路径
# ============================
print("=" * 70)
print("速卖通图片搜索API实战演示")
print("=" * 70)
# 执行搜索
result = search_by_image(
image_path=IMAGE_PATH,
app_key=APP_KEY,
app_secret=APP_SECRET,
max_results=20,
price_range="5-50",
ship_to="US"
)
if not result:
print("搜索失败!")
return
# ========== 结果解析 ==========
items = result.get("items", [])
total_count = result.get("total_count", 0)
print(f"\n【搜索统计】")
print(f" 找到相似商品: {len(items)} 个")
print(f" 预估总数: {total_count} 个")
print(f" 当前页: {result.get('current_page_no', 1)}")
print(f"\n【商品详情】")
for idx, item in enumerate(items[:5], 1): # 展示前5个
print(f"\n [{idx}] {item.get('title', 'N/A')}")
print(f" 商品ID: {item.get('product_id')}")
print(f" 相似度: {item.get('simi_score', 0) * 100:.2f}%") # 核心指标
print(f" 价格: ${item.get('target_sale_price', 'N/A')}")
print(f" 原价: ${item.get('target_original_price', 'N/A')}")
print(f" 销量: {item.get('orders', 0)} 单")
print(f" 评分: {item.get('evaluate_rate', 'N/A')}")
print(f" 店铺: {item.get('store_name', 'N/A')}")
print(f" 详情页: {item.get('product_detail_url', 'N/A')}")
# 图片搜索特有字段
if item.get('search_image'):
print(f" 匹配图片: {item.get('search_image')}")
# ========== 数据导出 ==========
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = f"search_result_{timestamp}.json"
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=2)
print(f"\n【数据导出】结果已保存至 {output_file}")
print("=" * 70)
if name == "main":
main()
五、响应数据结构详解
根据搜索结果,典型响应结构如下:
JSON
复制
{
"aliexpress_solution_image_search_response": {
"code": 0,
"msg": "success",
"request_id": "your_request_id_here",
"total_count": 100,
"result": {
"items": [
{
"product_id": "1000000000000",
"title": "New Fashion Women Dress...",
"image_url": "https://...",
"target_sale_price": "12.99",
"target_original_price": "19.99",
"target_discount": "35",
"simi_score": 0.85, // 图片相似度得分(0-1)
"search_image": "https://...", // 匹配的图片URL
"store_name": "Fashion Store",
"product_detail_url": "https://aliexpress.com/item/1000000000000.html",
"orders": 999,
"evaluate_rate": "96.3%",
"feedbacks": 5000,
"freight_info": {
"freight": {
"freight_amount": "2.99",
"display_name": "Standard Shipping"
},
"freight_to": "US"
}
}
],
"current_page_no": 1,
"page_size": 20,
"total_page_count": 5
}
}
}
关键字段说明:
simi_score :图片相似度得分(0-1),值越高表示越相似,是图片搜索的核心指标
search_image :在商品中搜索到的、与你上传图片最匹配的那张图片的URL
target_sale_price :目标销售价格(到手价),单位为美元
request_id :请求唯一标识,排查问题时必须提供
六、高级实战技巧
- 多图混合搜索(2025新增功能)
支持上传多张图片提升搜索精准度:
Python
复制
def multi_image_search(image_paths: list, **kwargs):
"""
多图混合搜索
"""
hashes = [generate_image_hash(path) for path in image_paths]
params = {
}"image_hash": "|".join(hashes), # 竖线分隔 "max_results": 50, "fusion_weight": "0.6,0.4", # 各图片权重 **kwargs... 后续逻辑同上
- 相似度阈值过滤
只返回高相似度商品:
Python
复制
def filter_by_similarity(result: dict, min_score: float = 0.8):
"""过滤相似度低于阈值的商品"""
items = result.get("items", [])
filtered = [item for item in items if item.get("simi_score", 0) >= min_score]
result["items"] = filtered
result["total_count"] = len(filtered)
return result - 版权风险处理
返回403错误时的降级方案:
Python
复制
def search_with_fallback(image_path: str, **kwargs):
"""
带降级策略的图片搜索
"""首次尝试:strict模式
try:
except Exception as e:result = search_by_image(image_path, X_Copyright_Check="strict", **kwargs) if result: return result
七、关键注意事项if "403" in str(e): print("触发版权限制,切换至loose模式...") # 降级到loose模式 return search_by_image(image_path, X_Copyright_Check="loose", **kwargs) - 调用限制
QPS限制:免费版2次/秒,付费套餐可达50次/秒
日调用量:企业账号默认10万次/天,可申请扩容
图片规格:单张图片不超过5MB,建议压缩至1024x1024以内 - 成功率优化
图片质量:使用白底、无水印、高清商品图,成功率提升40%
特征明显:避免使用模特图或场景图,纯商品图识别率更高
去重处理:相同商品ID结果会聚合,可通过product_id去重 - 错误码处理
表格
复制
错误码 说明 解决方案
1001 图片识别失败 更换图片或压缩后重试
1002 频率超限 实现指数退避重试
2001 版权违规 启用loose模式或换图
4001 Token无效 重新获取Access Token - 成本优化
缓存策略:对图片哈希+搜索条件做MD5缓存,有效期7天
批量处理:一次请求返回50个结果,比多次请求节省80%成本
相似度预过滤:在服务端设置min_simi_score=0.7减少无效返回
八、典型应用场景
找同款比价:上传采购商品图,自动发现速卖通同款及价格分布
供应链溯源:通过产品图片反向追踪原始供应商(1688→速卖通)
侵权监测:监控竞品是否盗用己方产品图,simi_score>0.95即触发告警
选品挖掘:分析热搜商品图的搜索结果,发现潜力新品
自动化铺货:ERP系统集成,实现"图片→商品信息→店铺上架"自动化
九、总结
速卖通图片搜索API为跨境电商提供了强大的视觉搜索能力。2025版通过OAuth2.0认证和SHA-3哈希算法,在安全性与性能上均有显著提升。实战中需重点关注simi_score相似度指标、版权过滤策略以及调用频率控制。
重要提醒:截至2024年底,个人开发者账号已无法申请此接口,必须使用企业账号。建议申请"跨境数据应用"类目以获取完整权限,并在生产环境实现Token自动刷新和请求重试机制。
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。