电子说
你想要的是 1688 商品详情 API 的 Python 调用与数据解析实战方案,核心是完成API 凭证配置、接口请求(含签名)、响应数据解析、异常处理的全流程落地,我会提供可直接运行的代码,并详解关键步骤和数据解析技巧,适配新手快速上手。
一、前置准备
1. 必备条件
已完成 1688 开放平台开发者认证(个人 / 企业),创建自研应用,获取AppKey和AppSecret(参考之前的 1688 API 接入流程);
安装 Python 依赖:
bash
运行
pip install requests # 发送HTTP请求 pip install dicttoxml # 可选,处理XML格式响应(1688部分接口返回XML) pip install python-dotenv # 管理环境变量,避免硬编码凭证
2. 核心接口选型
1688 商品详情的核心接口为:alibaba.item.get(获取商品基础信息)和alibaba.item.sku.get(获取 SKU / 价格 / 库存信息),本次实战以alibaba.item.get为例,接口参数说明:
表格
| 参数名 | 必传 | 说明 |
|---|---|---|
| app_key | 是 | 你的 AppKey |
| method | 是 | 接口名称,固定为alibaba.item.get |
| format | 否 | 响应格式,可选json/xml,推荐json |
| timestamp | 是 | 时间戳(格式:yyyy-MM-dd HH:mm:ss,如 2026-02-10 15:30:00) |
| v | 是 | 接口版本,固定为2.0 |
| sign | 是 | 签名(MD5 加密,1688 签名规则) |
| offer_id | 是 | 商品 ID(1688 商品链接中offerId=后的数字,如699988776655) |
| fields | 否 | 指定返回字段,如title,price,sku,description,不传返回全部字段 |
二、完整 Python 实战代码
1. 代码实现(含签名、请求、解析)
python
运行
import requests
import time
import hashlib
import json
from dotenv import load_dotenv
import os
# 加载环境变量(建议将AppKey/Secret存放在.env文件,避免硬编码)
load_dotenv()
APP_KEY = os.getenv("1688_APP_KEY")
APP_SECRET = os.getenv("1688_APP_SECRET")
def generate_1688_sign(params, app_secret):
"""
生成1688 API签名(核心:ASCII升序排序+MD5加密)
:param params: 接口请求参数(dict)
:param app_secret: 1688应用的AppSecret
:return: 签名字符串
"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接为key=value格式
sign_str = ""
for k, v in sorted_params:
if v is not None and v != "":
sign_str += f"{k}{v}"
# 3. 首尾拼接AppSecret,MD5加密后转大写
sign_str = app_secret + sign_str + app_secret
sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
return sign
def get_1688_item_detail(offer_id):
"""
调用1688商品详情API,解析核心数据
:param offer_id: 1688商品ID
:return: 解析后的商品详情字典
"""
# 1. 构造公共参数
params = {
"app_key": APP_KEY,
"method": "alibaba.item.get",
"format": "json",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"v": "2.0",
"offer_id": offer_id,
"fields": "title,price,sku_info,description,spec_info,image_urls,seller_info" # 指定返回字段
}
# 2. 生成签名并添加到参数
params["sign"] = generate_1688_sign(params, APP_SECRET)
# 3. 发送请求(1688 API网关地址)
url = "https://gw.open.1688.com/openapi/param2/2/alibaba.item.get/2.0"
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status() # 抛出HTTP错误(如403/500)
result = response.json()
except requests.exceptions.RequestException as e:
print(f"API请求失败:{e}")
return None
except json.JSONDecodeError:
print("响应数据不是JSON格式,可能是XML")
return None
# 4. 解析核心数据(过滤冗余字段,提取业务所需)
if "error_response" in result:
print(f"API调用错误:{result['error_response']['msg']}(错误码:{result['error_response']['code']})")
return None
item_data = result.get("alibaba_item_get_response", {}).get("item", {})
parsed_data = {
"商品ID": item_data.get("offer_id"),
"商品标题": item_data.get("title"),
"价格(元)": item_data.get("price"),
"商品主图": item_data.get("image_urls", {}).get("image_url", []),
"卖家信息": {
"卖家ID": item_data.get("seller_info", {}).get("user_id"),
"店铺名称": item_data.get("seller_info", {}).get("shop_name")
},
"SKU信息": item_data.get("sku_info", {}).get("sku", []), # 多SKU规格
"商品规格": item_data.get("spec_info", {}).get("spec", []),
"商品描述": item_data.get("description") # 商品详情页富文本
}
return parsed_data
# 测试调用
if __name__ == "__main__":
# 替换为你要查询的1688商品ID(从商品链接中提取)
test_offer_id = "699988776655"
item_detail = get_1688_item_detail(test_offer_id)
if item_detail:
print("=== 1688商品详情解析结果 ===")
print(json.dumps(item_detail, ensure_ascii=False, indent=2))
else:
print("商品详情获取失败")
2. 环境配置(.env 文件)
在代码同级目录创建.env文件,写入你的凭证:
env
1688_APP_KEY=你的AppKey 1688_APP_SECRET=你的AppSecret
三、关键步骤详解
1. 签名生成(核心防错点)
1688 API 的签名是调用成功的关键,错误会直接返回invalid signature:
排序规则:严格按参数名 ASCII 码升序(如app_key在method前,timestamp在v前);
加密规则:拼接后字符串需UTF-8编码,MD5 加密后转大写;
注意:空值参数不参与签名(如fields不传则不加入)。
2. 数据解析技巧
1688 返回的商品数据字段多且嵌套深,重点关注:
价格 / 库存:SKU 级的价格和库存需从sku_info.sku中解析(每个 SKU 对应不同规格和价格);
图片链接:image_urls.image_url是列表,包含主图和详情图;
富文本描述:description是 HTML 格式,如需提取纯文本,可使用BeautifulSoup清理:
python
运行
from bs4 import BeautifulSoup
# 清理商品描述中的HTML标签
if parsed_data["商品描述"]:
soup = BeautifulSoup(parsed_data["商品描述"], "html.parser")
parsed_data["商品描述_纯文本"] = soup.get_text(strip=True)
3. 常见错误与解决
表格
| 错误码 / 提示 | 原因 | 解决方法 |
|---|---|---|
| invalid signature | 签名错误 | 检查参数排序、AppSecret 是否正确、时间戳格式 |
| insufficient permissions | 权限不足 | 确认应用已申请alibaba.item.get接口权限 |
| offer_id invalid | 商品 ID 错误 | 检查商品 ID 是否为数字,或商品是否存在 |
| request frequency limit | 调用频率超限 | 添加延时(如time.sleep(1)),控制调用频率 |
四、进阶优化
1. 批量调用(多商品 ID)
python
运行
def batch_get_item_detail(offer_id_list):
"""批量获取商品详情,避免频率超限"""
result_list = []
for offer_id in offer_id_list:
detail = get_1688_item_detail(offer_id)
if detail:
result_list.append(detail)
time.sleep(1) # 每次调用间隔1秒,避免限流
return result_list
# 测试批量调用
offer_ids = ["699988776655", "700011223344"]
batch_result = batch_get_item_detail(offer_ids)
print(f"批量获取{len(batch_result)}个商品详情")
2. 数据持久化(保存到 JSON/Excel)
python
运行
import pandas as pd
# 保存到JSON文件
with open("1688_item_detail.json", "w", encoding="utf-8") as f:
json.dump(item_detail, f, ensure_ascii=False, indent=2)
# 保存到Excel(批量数据更适用)
df = pd.DataFrame(batch_result)
df.to_excel("1688_item_batch.xlsx", index=False, encoding="utf-8")
总结
1688 商品详情 API 调用的核心是正确生成签名,需严格遵循 ASCII 升序 + MD5 加密规则;
数据解析需聚焦业务字段(标题、价格、SKU、卖家信息),过滤冗余嵌套数据;
生产环境需添加频率控制和异常重试(如失败后重试 2 次),避免接口调用失败影响业务。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !