在电商数据分析、竞品监控、供应链管理等场景中,获取 1688 平台的商品详情数据具有重要价值。1688 作为国内知名的 B2B 电商平台,提供了 API 接口供开发者合法获取商品信息。本文将详细解析如何调用 1688 API 接口抓取商品详情数据,并提供完整的代码示例。
一、前期准备
1. 注册 1688 开发账号
首先需要访问注册开发者账号,获取Api Key和Api Secret,这是调用 API 的身份凭证。
2. 了解 API 接口文档
1688 提供了丰富的商品相关 API,其中获取商品详情的核心接口为:
- 商品详情接口:
alibaba.item.get(需申请权限) - 接口功能:获取商品标题、价格、规格、图片、详情描述等信息
- 请求方式:HTTP GET/POST
- 认证方式:OAuth2.0
3. 环境配置
开发环境需具备:
- Python 3.6+(本文示例语言)
- 安装
requests库(处理 HTTP 请求) - 安装
pycryptodome库(处理签名加密)
二、API 调用核心原理
1688 API 调用需遵循以下流程:
- 参数拼接:按规则组装请求参数(包括 Api Key、时间戳、商品 ID 等)
- 签名生成:使用 Api Secret 对参数进行加密生成签名(防止请求被篡改)
- 发送请求:向 API 网关发送 HTTP 请求
- 处理响应:解析返回的 JSON 数据,提取所需商品信息
三、代码实现
以下是调用 1688 商品详情 API 的完整 Python 代码示例:
import requests
import time
import hashlib
import json
from urllib.parse import urlencode
class AlibabaAPI:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.api_url = "https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/alibaba.item.get/"
def generate_sign(self, params):
"""生成签名"""
# 按参数名ASCII排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接参数字符串
sign_str = self.app_secret + ''.join([f"{k}{v}" for k, v in sorted_params]) + self.app_secret
# SHA1加密并转为大写
sign = hashlib.sha1(sign_str.encode('utf-8')).hexdigest().upper()
return sign
def get_item_details(self, item_id):
"""获取商品详情"""
# 基础参数
params = {
"app_key": self.app_key,
"method": "alibaba.item.get",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"format": "json",
"v": "1.0",
"sign_method": "sha1",
"item_id": item_id, # 商品ID
"fields": "item_id,title,price,detail_url,pic_url,sku_info,description" # 需要返回的字段
}
# 生成签名
params["sign"] = self.generate_sign(params)
try:
# 发送请求
response = requests.get(self.api_url + self.app_key, params=params, timeout=10)
response.raise_for_status() # 抛出HTTP错误
result = response.json()
if "error_response" in result:
print(f"API错误:{result['error_response']['msg']}")
return None
return result["item_get_response"]["item"]
except Exception as e:
print(f"请求失败:{str(e)}")
return None
if __name__ == "__main__":
# 替换为你的App Key和App Secret
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
ITEM_ID = "610455555555" # 示例商品ID
# 初始化API客户端
alibaba_api = AlibabaAPI(APP_KEY, APP_SECRET)
# 获取商品详情
item_details = alibaba_api.get_item_details(ITEM_ID)
if item_details:
print("商品详情:")
print(f"商品ID:{item_details.get('item_id')}")
print(f"标题:{item_details.get('title')}")
print(f"价格:{item_details.get('price')}")
print(f"详情页URL:{item_details.get('detail_url')}")
# 可根据需要提取更多字段(如SKU、图片等)
with open("item_details.json", "w", encoding="utf-8") as f:
json.dump(item_details, f, ensure_ascii=False, indent=2)
print("数据已保存到item_details.json")
四、关键注意事项
- 权限申请:
alibaba.item.get接口需要单独申请权限,未授权调用会返回权限错误 - 调用频率限制:1688 API 有严格的频率限制(通常为每秒 1-5 次),需控制请求速度
- 签名规则:签名生成是关键步骤,参数排序和加密方式必须严格遵循官方规范
- 字段筛选:通过
fields参数指定所需字段,减少不必要的数据传输 - 错误处理:API 可能返回各种错误(如商品不存在、权限不足),需做好异常捕获
- 合规性:获取的数据需遵守 1688 平台规则,不得用于非法用途
五、扩展功能建议
- 批量获取:通过循环调用接口实现多商品 ID 的批量查询(注意频率控制)
- 数据存储:将获取的商品数据存入 MySQL、MongoDB 等数据库,方便后续分析
- 定时任务:使用
APScheduler等工具实现定时抓取,监控商品价格、库存变化 - 代理池:若需大量请求,可配置代理池避免 IP 被限制
通过以上步骤,即可合法、高效地调用 1688 API 接口获取商品详情数据。实际开发中,需根据具体业务需求调整字段配置和错误处理逻辑,确保系统稳定运行。