Python爬虫获取1688商品(按图搜索)接口的返回数据说明
一、引言
在电商领域,按图搜索功能(类似于淘宝的拍立淘)已经成为一种重要的商品检索方式。通过上传图片,用户可以快速找到与图片相似的商品,极大地提升了购物体验。1688作为国内领先的B2B电商平台,也提供了类似的按图搜索接口,供开发者使用。本文将详细介绍如何使用Python爬虫调用1688的按图搜索接口,并重点分析接口返回数据的结构和含义。
二、接口调用
(一)准备工作
-
注册账号与获取API密钥 在使用1688的API接口之前,需要在1688开放平台注册账号,并创建应用以获取
app_key
和app_secret
。这两个密钥是调用API接口的必要凭证,用于身份验证。 -
安装必要的Python库 调用API接口需要使用到以下Python库:
-
requests
:用于发送HTTP请求。 -
hashlib
:用于生成签名。 -
time
:用于处理时间戳。 -
json
:用于处理JSON数据。
-
(二)调用按图搜索接口
-
接口URL 1688的按图搜索接口URL为:
https://api.1688.com/router/rest
。 -
请求参数 调用按图搜索接口时,需要提供以下参数:
-
app_key
:你的应用app_key
。 -
method
:接口方法名称,固定为1688.item_search_img
。 -
format
:返回数据格式,固定为json
。 -
v
:API版本号,固定为2.0
。 -
timestamp
:时间戳,单位为秒。 -
sign_method
:签名方法,固定为md5
。 -
sign
:签名,用于验证请求的合法性。 -
imgid
:图片的URL或ID,指向你要搜索的商品图片。 -
cat
(可选):商品类目ID,用于限定搜索范围。 -
page
(可选):分页参数,指定返回结果的页码。
-
以下是调用按图搜索接口的Python代码示例:
Python
import requests
import hashlib
import time
import json
def generate_sign(params, app_secret):
"""生成签名"""
sorted_params = sorted(params.items())
sign_content = ''.join(['%s%s' % (k, v) for k, v in sorted_params]) + app_secret
sign = hashlib.md5(sign_content.encode('utf-8')).hexdigest().upper()
return sign
def search_items_by_img(app_key, app_secret, img_url, cat=None, page=1):
url = "https://api.1688.com/router/rest"
params = {
'app_key': app_key,
'method': '1688.item_search_img',
'format': 'json',
'v': '2.0',
'timestamp': int(time.time()),
'sign_method': 'md5',
'imgid': img_url,
'cat': cat if cat else '',
'page': page
}
params['sign'] = generate_sign(params, app_secret)
response = requests.get(url, params=params)
if response.status_code == 200:
return response.json()
else:
print("请求失败, 状态码:", response.status_code)
return None
app_key = "your_app_key"
app_secret = "your_app_secret"
img_url = "http://g-search3.alicdn.com/img/bao/uploaded/i4/O1CN01IDpcD81zHbpHs1YgT_!!2200811456689.jpg"
response_data = search_items_by_img(app_key, app_secret, img_url, cat=None, page=1)
三、返回数据说明
调用按图搜索接口后,1688会返回一个JSON格式的响应数据。以下是对返回数据结构和字段含义的详细说明。
(一)返回数据结构
返回数据是一个JSON对象,其结构如下:
JSON
{
"code": "200",
"message": "success",
"items": {
"item": [
{
"title": "商品标题",
"pic_url": "商品图片URL",
"price": "商品价格",
"sales": "商品销量",
"detail_url": "商品详情页URL",
"shop_name": "店铺名称",
"shop_url": "店铺首页URL",
"distance": "与搜索图片的相似度"
},
...
]
}
}
(二)字段含义
-
code
-
类型:字符串
-
含义:返回状态码,表示请求是否成功。常见的状态码有:
-
200
:请求成功。 -
400
:请求参数错误。 -
401
:身份验证失败。 -
500
:服务器内部错误。
-
-
-
message
-
类型:字符串
-
含义:返回状态信息,用于描述请求的结果。例如:
-
success
:请求成功。 -
invalid parameters
:请求参数无效。 -
authentication failed
:身份验证失败。 -
internal server error
:服务器内部错误。
-
-
-
items
-
类型:JSON对象
-
含义:搜索结果的商品列表。如果搜索结果为空,则
items
字段不存在。
-
-
item
-
类型:JSON数组
-
含义:包含多个商品信息的数组,每个元素是一个JSON对象,表示一个商品。
-
-
title
-
类型:字符串
-
含义:商品的标题,用于描述商品的基本信息。
-
-
pic_url
-
类型:字符串
-
含义:商品的图片URL,指向商品的主图。
-
-
price
-
类型:字符串
-
含义:商品的价格,表示商品的售价。
-
-
sales
-
类型:整数
-
含义:商品的销量,表示商品的销售数量。
-
-
detail_url
-
类型:字符串
-
含义:商品详情页的URL,点击后可以查看商品的详细信息。
-
-
shop_name
-
类型:字符串
-
含义:店铺的名称,表示商品所属的店铺。
-
-
shop_url
-
类型:字符串
-
含义:店铺首页的URL,点击后可以进入店铺的首页。
-
-
distance
-
类型:浮点数
-
含义:与搜索图片的相似度,值越小表示相似度越高。
-
(三)示例返回数据
以下是一个完整的示例返回数据:
JSON
{
"code": "200",
"message": "success",
"items": {
"item": [
{
"title": "新款时尚连衣裙",
"pic_url": "https://img.alicdn.com/img/bao/uploaded/i4/TB29baudgxlpuFjy0FoXXa.lXXa_!!3003995184.jpg",
"price": "22.00",
"sales": 700,
"detail_url": "//item.1688.com/item.htm?id=544603032967",
"shop_name": "时尚女装店",
"shop_url": "//shop.1688.com/?shop_id=123456",
"distance": 0.12
},
{
"title": "复古连衣裙",
"pic_url": "https://img.alicdn.com/img/bao/uploaded/i4/TB21baudgxlpuFjy0FoXXa.lXXa_!!3003995184.jpg",
"price": "30.00",
"sales": 500,
"detail_url": "//item.1688.com/item.htm?id=544603032968",
"shop_name": "复古女装店",
"shop_url": "//shop.1688.com/?shop_id=654321",
"distance": 0.15
}
]
}
}
四、数据解析与处理
(一)解析返回数据
在获取到返回数据后,需要对其进行解析,以便提取有用的信息。以下是一个解析返回数据的Python代码示例:
Python
def parse_response_data(response_data):
if response_data and response_data.get('code') == '200':
items = response_data.get('items', {}).get('item', [])
for item in items:
print("商品标题:", item.get('title'))
print("商品图片URL:", item.get('pic_url'))
print("商品价格:", item.get('price'))
print("商品销量:", item.get('sales'))
print("商品详情页URL:", item.get('detail_url'))
print("店铺名称:", item.get('shop_name'))
print("店铺首页URL:", item.get('shop_url'))
print("与搜索图片的相似度:", item.get('distance'))
print("-" * 40)
else:
print("请求失败, 错误信息:", response_data.get('message'))
parse_response_data(response_data)
(二)数据处理
解析返回数据后,可以根据实际需求对数据进行进一步处理。例如:
-
将数据存储到本地文件(如CSV、JSON)或数据库中,方便后续分析。
-
对数据进行筛选、排序或统计分析,提取有价值的信息。
-
将数据用于机器学习模型的训练,以实现商品推荐等功能。
五、注意事项
(一)反爬虫机制
1688有复杂的反爬虫机制,建议在调用接口时注意以下几点:
-
设置合理的请求间隔,避免被封禁。
-
使用代理IP,模拟真实用户行为。
-
随机生成
User-Agent
,避免被识别为爬虫。
(二)数据合法性
在使用爬虫获取数据时,务必遵守相关法律法规,尊重数据所有者的权益。未经授权,不得将获取的数据用于商业用途。
(三)接口限制
1688的API接口通常有调用频率限制,建议在调用接口时注意以下几点:
-
遵守接口的调用频率限制,避免因频繁调用而导致接口被禁用。
-
合理规划调用策略,避免在短时间内集中调用接口。
六、总结
本文详细介绍了如何使用Python爬虫调用1688的按图搜索接口,并对返回数据的结构和字段含义进行了详细说明。通过解析返回数据,可以提取商品的标题、图片URL、价格、销量、详情页URL、店铺名称、店铺首页URL以及与搜索图片的相似度等信息。在实际应用中,可以根据需求对数据进行进一步处理和分析。希望本文对你有所帮助。
如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。