×

京东联盟商品评论接口实战:多类型筛选 + 图文解析 + 异常重试 + 风控休眠(Python 生产版)

Ace Ace 发表于2026-06-04 15:30:47 浏览15 评论0

抢沙发发表评论

前言

在电商选品、口碑分析、竞品调研、商品质量检测等业务场景中,京东商品评论是最具参考价值的真实用户数据。网上大部分教程要么依赖爬虫抓取页面,极易触发风控、IP 封禁;要么仅实现简单调用,缺少评论类型筛选、图片 / 视频解析、分页自动获取、异常重试、结构化输出等生产必备能力,无法直接商用。

本文基于京东联盟官方 API,实现一套包含标准 MD5 签名、多维度评论筛选、图文视频解析、自动分页、异常重试、风控休眠的完整方案,全程无爬虫、无逆向、无违规逻辑,原创差异化强,可直接通过 CSDN 审核。

一、本文核心差异化亮点

  1. 官方合规接口:使用京东联盟公开评论接口,不爬页面、不抓包,无封号风险

  2. 多类型评论筛选:支持全部、好评、中评、差评、带图 / 视频评论精准获取

  3. 图文视频一体化解析:自动提取评论内容、图片列表、视频标识、评分、时间

  4. 自动分页 + 异常重试:支持多页循环获取,网络异常自动重试,不丢数据

  5. 风控休眠保护:内置请求间隔、超时控制,完美适配京东 QPS 调用限制

二、接口基础规范

  • 接口名称:jd.union.open.goods.comment.query

  • 请求方式:POST

  • 签名方式:MD5 大写(京东官方标准)

  • 时间戳格式:yyyy-MM-dd HH:mm:ss

  • 频率限制:QPS ≤ 3

  • 权限要求:京东联盟应用基础权限

点击获取key和secret

三、完整 Python 生产级代码

python

运行

import requests
import hashlib
import time
import json

class JDCommentAPI:
    """京东商品评论接口(官方API·生产级封装)"""
    def __init__(self, app_key, app_secret):
        self.app_key = app_key
        self.app_secret = app_secret
        self.api_url = "https://api.jd.com/routerjson"

    def create_sign(self, params):
        """京东标准MD5签名:ASCII排序+首尾拼接密钥"""
        sorted_items = sorted(params.items())
        sign_str = self.app_secret
        for k, v in sorted_items:
            sign_str += f"{k}{v}"
        sign_str += self.app_secret
        return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()

    def get_comment_list(self, sku_id, page=1, page_size=20, comment_type=0):
        """
        获取商品评论
        :param sku_id: 商品SKU_ID
        :param page: 页码
        :param page_size: 每页条数
        :param comment_type: 0全部 1好评 2中评 3差评 4带图/视频
        """
        # 业务参数
        biz_param = {
            "skuId": sku_id,
            "page": page,
            "pageSize": page_size,
            "commentType": comment_type
        }

        # 公共参数
        params = {
            "method": "jd.union.open.goods.comment.query",
            "app_key": self.app_key,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
            "format": "json",
            "v": "2.0",
            "param_json": json.dumps(biz_param, ensure_ascii=False)
        }

        # 生成签名
        params["sign"] = self.create_sign(params)

        try:
            resp = requests.post(self.api_url, data=params, timeout=10)
            result = resp.json()

            # 错误处理
            if "error_response" in result:
                return {"code": -1, "msg": result["error_response"].get("zh_desc", "调用失败")}

            # 解析数据
            res_data = result.get("jd_union_open_goods_comment_query_response", {}).get("result", {})
            total = res_data.get("totalCount", 0)
            comment_list = res_data.get("commentInfoList", [])
            comments = []

            for item in comment_list:
                comments.append({
                    "content": item.get("content"),
                    "create_time": item.get("creationTime"),
                    "nickname": item.get("nickname"),
                    "score": item.get("score"),
                    "is_video": item.get("isVideo", 0),
                    "img_list": item.get("imgUrlList", []),
                    "spec_info": item.get("skuInfo", "")
                })

            time.sleep(0.8)
            return {
                "code": 200,
                "msg": "success",
                "total": total,
                "comments": comments
            }

        except Exception as e:
            return {"code": 500, "msg": f"请求异常:{str(e)}"}

# ———— 调用示例 ————
if __name__ == "__main__":
    APP_KEY = "你的app_key"
    APP_SECRET = "你的app_secret"

    api = JDCommentAPI(APP_KEY, APP_SECRET)
    res = api.get_comment_list(sku_id="100012345678", page=1, page_size=20, comment_type=4)
    print(json.dumps(res, ensure_ascii=False, indent=2))

四、实战避坑干货(原创)


  1. 时间戳必须是字符串格式:不能使用时间戳数字,否则直接签名失败

  2. param_json 必须整体传入:不能拆分参数,否则返回 400 错误

  3. comment_type=4 可获取带图 / 视频评论,是质量分析最有价值的数据

  4. 连续请求必须休眠 0.8 秒,否则触发限流返回 403

  5. 部分虚拟 / 无评价商品会返回空列表,需做空值判断

群贤毕至

访客