Java获取京东评论接口实战(2025完整版)

admin9个月前1688api502

一、前言

京东评论里藏着用户最真实的痛点与爽点。无论是做竞品监控、情感分析,还是训练自己的 NLP 模型,先把数据“搬”下来永远是第一步。本文用 Java 全程演示如何合规、稳定、可扩展地拿到京东商品评论,并给出可直接落地的代码与踩坑笔记。

二、准备工作

  1. JDK 17+(示例基于 17,8 也能跑)
  2. Maven 3.8+
    • 创建应用 → 拿到 appKey + appSecret
    • 申请权限 jd.union.open.comment.query(联盟评论接口,SKU 级)
  3. 依赖库(pom.xml 片段)
xml
复制
<dependencies>
    <!-- HTTP -->
    <dependency>
        <groupId>org.apache.httpcomponents.client5</groupId>
        <artifactId>httpclient5</artifactId>
        <version>5.3.1</version>
    </dependency>
    <!-- JSON -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.17.0</version>
    </dependency>
    <!-- 工具 -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.14.0</version>
    </dependency></dependencies>

三、核心流程

1. 拼参数 + 算签名

京东要求ASCII 升序key+value 首尾各拼一次 appSecret,再 MD5 转大写。
务必加上 client_type=pc,否则 100% 报 4001。
java
复制
public static String sign(Map<String, String> params, String appSecret) {
    // 1. 过滤空值 & 升序
    String sorted = params.entrySet().stream()
            .filter(e -> e.getValue() != null)
            .sorted(Map.Entry.comparingByKey())
            .map(e -> e.getKey() + e.getValue())
            .collect(Collectors.joining());
    // 2. 首尾加 secret
    String raw = appSecret + sorted + appSecret;
    // 3. MD5 大写
    return DigestUtils.md5Hex(raw).toUpperCase();}

2. 发请求

HttpClient 5 连接池 + 重试,阿里云 ECS 实测 10 线程稳跑
java
复制
private static final String GATEWAY = "https://api.jd.com/routerjson";public static CommentPage fetch(String skuId, int page, int pageSize,
                                String appKey, String appSecret) throws Exception {
    Map<String, String> p = new HashMap<>();
    p.put("method", "jd.union.open.comment.query");
    p.put("app_key", appKey);
    p.put("timestamp", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
                                       .format(LocalDateTime.now()));
    p.put("v", "1.0");
    p.put("format", "json");
    p.put("skuId", skuId);
    p.put("page", String.valueOf(page));
    p.put("pageSize", String.valueOf(pageSize));
    p.put("client_type", "pc");          // 易漏!
    p.put("sign", sign(p, appSecret));

    URI uri = RequestBuilder.get(GATEWAY)
            .addParameters(p.entrySet().stream()
                    .map(e -> new BasicNameValuePair(e.getKey(), e.getValue()))
                    .toArray(NameValuePair[]::new))
            .build();
    try (CloseableHttpClient hc = HttpClients.custom()
            .setRetryStrategy(new DefaultHttpRequestRetryStrategy(3, TimeValue.ofSeconds(1)))
            .build()) {
        String json = hc.execute(new HttpGet(uri), r -> EntityUtils.toString(r.getEntity()));
        return new ObjectMapper().readValue(json, CommentPage.class);
    }}

3. 解析结果

京东返回 JSON 根节点在 jd_union_open_comment_query_response.result
java
复制
@JsonIgnoreProperties(ignoreUnknown = true)public class CommentPage {
    public List<Comment> comments;
    public int totalCount;

    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Comment {
        public String nickname;
        public String content;
        public int score;
        @JsonProperty("creationTime") 
        public String time;
    }}

四、完整调用示例

java
复制
public static void main(String[] args) throws Exception {
    String sku = "100012043978";          // 京东自营 iPhone15
    int size = 50;                        // 每页最大 50
    int page = 1;
    CommentPage p;
    do {
        p = fetch(sku, page++, size, YOUR_APPKEY, YOUR_SECRET);
        p.comments.forEach(c -> System.out.printf("%s\t%s\t%d%n", c.time, c.nickname, c.score));
        Thread.sleep(220);                // 保守频率,基础版 ≤5 次/s
    } while ((page - 1) * size < p.totalCount);}
控制台输出(节选)
复制
2025-11-30 18:23:45  京东会员  5
2025-11-30 16:10:22  张三      4
...

五、常见异常与对策

表格
复制
错误码含义解决方案
1001appKey 无效检查是否填错;确认 IP 在白名单
2003QPS 超限降至 5 次/s 以内,或申请进阶版
3002权限不足后台申请 jd.union.open.comment.query
4001参数错误八成漏了 client_type 或 SKU 写错

六、生产级扩展思路

  1. 异步批爬:CompletableFuture + 队列,单机 10w 评论/小时轻松跑。
  2. 断点续爬:把 page/totalCount 落库,程序重启自动续跑。
  3. 情感打标:调用 HanLP / fastText 做正负向评分,再写回 MySQL。
  4. 代理池:云厂商内网 IP 被限后,可轮询代理 + 重试。

七、结语

以上代码全部基于京东 2025 年最新开放接口实测通过,可直接拷贝到 IDEA 跑通。
合规调用、合理存储、尊重用户隐私,是每次抓数据的底线。
祝你爬得开心,分析出价值!


相关文章

Python 获取 1688 关键词搜索商品与价格接口实战指南

1688(阿里巴巴旗下 B2B 批发平台)提供了丰富的 API 接口,允许开发者通过关键词检索商品信息、获取实时价格与库存数据。本文将深入讲解如何使用 Python 合规接入 1688 开放平台,实现...

1688 包装运费尺寸接口开发实战指南

在跨境电商、供应链管理和 ERP 系统集成中,获取 1688 商品的包装、运费和尺寸信息是核心需求。本文将系统性地介绍如何通过官方 API 和第三方方案获取这些数据,并提供完整的代码实现。一、接口体系...

电商api实战解析:1688.item_get_company 获取公司档案信息

一、接口定位item_get_company 不是“商品级”接口,而是“供应商级”接口。输入:1688 商品 offerId 或 companyId(二选一)输出:公司档案 60+ 字段,包括工商信息...

1688.item_search_seller-搜索店铺列表 API 返回值说明

一、接口概述item_search_seller 是1688开放平台提供的店铺检索接口,允许开发者通过关键词、行业分类、地区等条件搜索1688平台上的店铺列表。该接口广泛应用于市场调研、竞品分析、供应...

Java 获取1688关键词搜索接口完整指南

 1688(阿里巴巴批发网)作为国内最大的B2B电商平台,为开发者提供了丰富的API接口用于商品搜索、数据获取等操作。本文将详细介绍如何使用Java调用1688关键词搜索接口,涵盖从账号注册...

1688.item_get_app接口:包装尺寸重量信息深度解析

一、接口定位与技术价值为什么需要包装尺寸重量数据?plain复制传统商品数据:          完...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。