拍立淘本质是 以图搜图:上传商品图片 → CNN(ResNet/MobileNet)提取特征向量 → 在淘宝数十亿商品库中做近似最近邻搜索(ANN)→ 返回相似商品列表。
技术链路:
图片上传 → 预处理(去噪/归一化) → 深度学习特征提取 → 余弦相似度/欧氏距离匹配 → 排序返回
| 步骤 | 操作 | 说明 |
|---|---|---|
| ① 注册 | 访问淘宝开放平台 | 个人需身份证认证,企业需营业执照 |
| ② 创建应用 | 控制台 → 应用管理 → 创建应用 | 选择「自用型」或「第三方应用」 |
| ③ 获取密钥 | 创建成功后获得 |
App Key(公钥)+
App Secret(私钥) |
| ④ 申请权限 | 搜索
taobao.item.search.img → 申请 |
填写场景如"电商比价工具",审核1-3天 |
| ⑤ 开发者等级 | 需达 L1 级(通过基础考试) | 才能调用高频率接口 |
⚠️
App Secret绝不能写前端、不能打日志、必须加密存储。
| 要求 | 标准 |
|---|---|
| 格式 | JPG / PNG |
| 大小 | ≤ 2MB |
| 分辨率 | 建议 ≥ 800×800 |
| 主体占比 | ≥ 60% |
| 避免 | 水印、遮挡、复杂背景、多商品 |
图片传入两种方式:
| 方式 | 适用场景 | 示例 |
|---|---|---|
| 图片URL | 淘宝/天猫商品图 |
https://img.alicdn.com/xxx.jpg |
| Base64编码 | 本地图片 | 需去除
data:image/jpeg;base64, 前缀 |
| upload_img接口 | 外部图片 | 先上传到淘宝图片空间,获取 imgid |
💡 优先用图片URL,Base64字符串过长会影响请求效率。
https://eco.taobao.com/router/rest (推荐)https://api.taobao.com/imgsearch/item_search_img.do
| 参数 | 类型 | 说明 |
|---|---|---|
app_key |
String | 应用标识 |
method |
String | 固定为
taobao.item.search.img |
timestamp |
String |
YYYY-MM-DD HH:MM:SS,与服务器误差≤10分钟 |
format |
String | 固定为
json |
v |
String | 固定为
2.0 |
sign_method |
String | 固定为
md5 |
image |
String | 图片URL 或 Base64编码 |
sign |
String | 签名值(见下文) |
| 参数 | 说明 | 可选值 |
|---|---|---|
cat |
商品类目ID(缩小范围) | 如女装
50010788 |
sort |
排序规则 |
price_asc /
price_desc /
sales |
page |
页码 | 默认1,最大100 |
page_size |
每页条数 | 默认20,最大100 |
shop_type |
店铺筛选 |
tmall /
taobao |
签名规则:
1. 收集所有参数(排除 sign 本身)2. 按参数名 ASCII 码升序排序3. 拼接为:参数名=参数值,用 & 连接4. 前后加上 App Secret5. MD5 加密 → 转大写
Python 实现:
pythonimport hashlibdef generate_sign(params, app_secret): sorted_params = sorted(params.items(), key=lambda x: x[0]) param_str = ''.join([f'{k}{v}' for k, v in sorted_params]) sign_str = f'{app_secret}{param_str}{app_secret}' return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
pythonimport requestsimport base64import hashlibimport time# ========== 配置区 ==========APP_KEY = "your_app_key"APP_SECRET = "your_app_secret"API_URL = "https://eco.taobao.com/router/rest"# ========== 工具函数 ==========def image_to_base64(image_path): with open(image_path, 'rb') as f: return base64.b64encode(f.read()).decode('utf-8')def generate_sign(params, app_secret): sorted_params = sorted(params.items(), key=lambda x: x[0]) param_str = ''.join([f'{k}{v}' for k, v in sorted_params]) sign_str = f'{app_secret}{param_str}{app_secret}' return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()# ========== 核心调用 ==========def taobao_pailitao_search(image_path=None, image_url=None, cat="", sort="price_asc"): timestamp = time.strftime("%Y-%m-%d %H:%M:%S") params = { "method": "taobao.item.search.img", "app_key": APP_KEY, "timestamp": timestamp, "format": "json", "v": "2.0", "sign_method": "md5", "cat": cat, "sort": sort, "page": "1", "page_size": "20", } # 传图:二选一 if image_path: params["image"] = image_to_base64(image_path) elif image_url: params["image"] = image_url else: raise ValueError("必须传入 image_path 或 image_url") # 生成签名 params["sign"] = generate_sign(params, APP_SECRET) # 发送请求 response = requests.post( API_URL, data=params, headers={'Content-Type': 'application/x-www-form-urlencoded'} ) if response.status_code == 200: return response.json() else: print(f"请求失败: {response.status_code}, {response.text}") return None# ========== 结果解析 ==========def parse_result(data): if not data or "item_search_img_response" not in data: print("无返回数据或接口异常") return items = data["item_search_img_response"].get("items", {}).get("item", []) if not items: print("未找到匹配商品") return for i, item in enumerate(items[:5], 1): print(f"""━━ 商品 #{i} ━━ 标题: {item['title']} 价格: ¥{item.get('price', 'N/A')} 促销价: ¥{item.get('promotion_price', 'N/A')} 销量: {item.get('sales', 0)} 相似度: {item.get('match_rate', 0):.1%} 链接: {item.get('detail_url', 'N/A')} 是否天猫: {'是' if item.get('is_tmall') else '否'}""")# ========== 执行 ==========if __name__ == "__main__": result = taobao_pailitao_search(image_path="test.jpg") if result: parse_result(result)
json{ "item_search_img_response": { "items": { "item": [ { "num_iid": "575727312808", "title": "亲子装短袖T恤", "price": "39.50", "promotion_price": "29.90", "pic_url": "https://g-search3.alicdn.com/.../item.jpg", "detail_url": "https://item.taobao.com/item.htm?id=575727312808", "sales": 7, "match_rate": 0.95, "is_tmall": false, "nick": "某某旗舰店" } ] }, "total_results": "100" }}
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 签名错误 | 参数未按ASCII排序 / 时间戳偏差 | 检查排序逻辑,确保时间误差≤5分钟 |
isp.no-permission |
未申请或未通过接口权限 | 回开放平台确认权限状态 |
isp.limit-exceeded |
调用超频(免费版QPS≤5) | 加指数退避重试,或购买API套餐 |
| 识别率低 | 图片模糊/主体占比低/有水印 | 重新拍清晰图,主体≥60% |
| 返回为空 | 图片与商品库无匹配 | 换图或指定
cat 类目缩小范围 |
| 403/500 | 网络或服务端异常 | 添加重试机制(最多3次,间隔递增) |
| 场景 | 玩法 |
|---|---|
| 电商比价 | 拍照搜同款 → 跨店比价 → 引导下单 |
| 竞品监控 | 定期搜索竞品图 → 追踪价格/销量变化 |
| 智能推荐 | 用户上传穿搭图 → 推荐搭配款 |
| UGC变现 | 识别用户分享图中的商品 → 挂淘宝客链接 |
| 假货识别 | 品牌方上传正.品图 → 检测平台假货 |
| 1688找货源 | 样品图搜1688工厂 → 一键铺货 |
接入前务必以淘宝开放API文档为准,接口参数可能随版本更新调整。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050022/viewspace-3173068/ ,如需转载,请注明出处,否则将追究法律责任。