1688 商品详情 API 调用与数据解析 Python 实战

电子说

1.4w人已加入

描述

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

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分