在电商数据驱动的时代,商品详情数据成为市场分析、价格监控、竞品调研的核心燃料。京东作为国内头部电商平台,其商品信息丰富、更新频繁,是数据开发者眼中的“香饽饽”。
本文将带你从0到1,用Java语言实现一个可运行的京东商品爬虫,不仅能抓取商品标题、价格、图片、评价数,还能应对常见的反爬策略。全文附完整代码,复制粘贴即可运行。
一、为什么选择Java做爬虫?
虽然Python是爬虫界的“老大哥”,但Java在企业级开发中依旧占据主流,具备以下优势:
- 并发处理强:利用多线程、线程池、异步IO,可轻松实现高并发抓取;
- 生态成熟:Jsoup、HttpClient、Jackson等库功能强大;
- 部署方便:可直接打包为JAR,运行在服务器或容器中;
- 与业务系统无缝集成:采集后可直接入库、入ES、入Kafka,打通数据闭环。
二、目标明确:我们要抓什么?
以京东商品详情页为例,我们要抓取以下字段:
字段名 | 示例值 |
---|---|
商品标题 | Apple iPhone 15 128G 蓝色 |
商品价格 | 5999.00 |
商品图片 | https://img10.360buyimg.com/... |
店铺名称 | 京东自营旗舰店 |
评价数量 | 50000+ |
三、技术选型
模块 | 技术方案 |
---|---|
页面下载 | Jsoup / HttpClient |
HTML解析 | Jsoup CSS选择器 |
JSON解析 | Jackson / Fastjson |
代理与限速 | 动态代理池 + 随机延时 |
反爬策略 | 随机UA、Referer、IP切换 |
四、环境准备
1. 创建Maven项目
bash
mvn archetype:generate -DgroupId=com.jd.crawler -DartifactId=jd-crawler
2. 引入依赖(pom.xml
)
xml
<dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.42</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.14</version>
</dependency>
</dependencies>
五、核心代码实现
1. 下载商品详情页
java
public class HttpUtils {
public static String getHtml(String url) throws IOException {
CloseableHttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet(url);
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");
request.setHeader("Referer", "https://search.jd.com/");
CloseableHttpResponse response = client.execute(request);
return EntityUtils.toString(response.getEntity());
}
}
2. 解析商品详情页
java
public class JDProductParser {
public static Product parse(String skuId) throws IOException {
String url = "https://item.jd.com/" + skuId + ".html";
Document doc = Jsoup.connect(url)
.userAgent("Mozilla/5.0")
.header("Referer", "https://search.jd.com/")
.get();
String title = doc.select("div.sku-name").text().trim();
String shop = doc.select("div.J-hove-wrap .name").text();
String img = doc.select("img#spec-img").attr("src");
if (!img.startsWith("http")) img = "https:" + img;
// 获取价格(异步接口)
String priceUrl = "https://p.3.cn/prices/mgets?skuIds=J_" + skuId;
String priceJson = HttpUtils.getHtml(priceUrl);
String price = JSON.parseArray(priceJson).getJSONObject(0).getString("p");
// 获取评价数
String commentUrl = "https://club.jd.com/comment/productCommentSummaries.action?referenceIds=" + skuId;
String commentJson = HttpUtils.getHtml(commentUrl);
int commentCount = JSON.parseObject(commentJson)
.getJSONArray("CommentsCount")
.getJSONObject(0)
.getIntValue("CommentCount");
return new Product(skuId, title, price, img, shop, commentCount);
}
}
3. 商品实体类
java
@Data
@AllArgsConstructor
public class Product {
private String skuId;
private String title;
private String price;
private String image;
private String shop;
private int commentCount;
}
4. 启动类
java
public class CrawlerApp {
public static void main(String[] args) throws IOException {
String skuId = "100035288046"; // iPhone 15
Product product = JDProductParser.parse(skuId);
System.out.println(JSON.toJSONString(product, true));
}
}
六、运行效果(控制台输出)
JSON
{
"skuId": "100035288046",
"title": "Apple iPhone 15 128G 蓝色",
"price": "5999.00",
"image": "https://img10.360buyimg.com/n1/s450x450_jfs/t1/123456.jpg",
"shop": "京东自营旗舰店",
"commentCount": 50000
}
七、反爬策略与优化建议
问题 | 解决方案 |
---|---|
IP被封 | 使用代理池(如阿布云、站大爷) |
UA被识别 | 随机User-Agent池 |
滑块验证码 | 使用打码平台或人工介入 |
接口限流 | 控制频率,随机延时(1~3秒) |
签名接口 | 分析JS加密逻辑,或调用官方API |
八、进阶玩法(等你来挑战)
- ✅ 多线程抓取 + 队列调度(支持百万SKU)
- ✅ 接入Spring Boot + MyBatis,实时入库
- ✅ 接入Elasticsearch,实现商品搜索
- ✅ 接入Kafka,实时流式处理
- ✅ 可视化展示:Spring Boot + ECharts
九、合法合规提醒
- ✅ 禁止抓取用户隐私信息(如收货地址、手机号)
- ✅ 禁止高并发攻击京东服务器
- ✅ 对外商用需获得京东授权
- ✅ 建议优先使用官方API(open.jd.com)
十、结语
本文从环境搭建、代码实现、反爬策略到进阶方向,系统讲解了如何用Java爬虫获取京东商品详情。希望你不仅能跑通代码,更能在此基础上构建自己的数据采集系统。
如果你还想看:
- “如何用Java爬取京东评论并做情感分析”
- “如何用Java爬取京东秒杀库存”
- “如何用Spring Boot构建爬虫调度平台”
- 欢迎留言告诉我,我们下期继续!
点赞 + 收藏 + 转发,你的支持是我持续输出的最大动力!