你想要的是 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 次),避免接口调用失败影响业务。