当前位置: 首页 > news >正文

使用Jsoup爬取豆瓣电影Top250(附Java代码)

在日常开发中,我们经常需要从网页上获取数据,而手动复制粘贴显然太低效。今天我们就来学习如何使用Java的Jsoup库,快速爬取豆瓣电影Top250的片名和评分,只需几十行代码就能搞定。

一、Jsoup简介

Jsoup 是一个开源的Java HTML解析器,它提供了一套非常便利的API,用于从URL、文件或字符串中解析HTML,提取和操作数据。它的核心功能包括:

  • 从一个URL、文件或字符串中解析HTML

  • 使用DOM或CSS选择器来查找、提取数据

  • 操作HTML元素、属性和文本

Jsoup的语法类似于jQuery,对于熟悉前端选择器的开发者来说非常友好。

二、爬取豆瓣电影Top250的思路

豆瓣电影Top250的页面结构比较清晰,我们只需要分析HTML,找到包含电影信息的列表,然后提取每个条目的排名、电影名和评分即可。

目标URL:https://movie.douban.com/top250

经过查看网页源码(或使用浏览器开发者工具),我们发现每部电影信息都包裹在一个<li>标签中,其父级选择器为#content > div > div.article > ol。每个<li>内部:

  • 排名在div.pic > em

  • 电影名在div.info > div.hd > a > span:nth-child(1)(即第一个<span>

  • 评分在div.info > div.bd > div.star > span.rating_num

因此,我们可以通过CSS选择器精确定位这些元素。

三、代码实现

下面是完整的Java程序,使用Jsoup爬取豆瓣电影Top250的第一页(25条数据)。

import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; public class DouBanTop250 { public static void main(String[] args) { String url = "https://movie.douban.com/top250"; crawlMovies(url); } public static void crawlMovies(String url) { try { // 模拟浏览器发起GET请求,获取整个页面的HTML Document doc = Jsoup.connect(url) .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") .get(); // 使用CSS选择器选中所有电影条目所在的<li>标签 Elements elements = doc.select("#content > div > div.article > ol > li"); // 遍历每个<li>,提取排名、电影名、评分 for (Element element : elements) { String rank = element.select("div.pic > em").text(); String name = element.select("div.info > div.hd > a > span:nth-child(1)").text(); String score = element.select("div.info > div.bd > div.star > span.rating_num").text(); System.out.println(rank + " " + name + " " + score); } } catch (IOException e) { e.printStackTrace(); } } }

四、代码详解

1. 添加Jsoup依赖

如果你使用Maven,在pom.xml中添加:

<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.17.2</version> </dependency>

如果是Gradle:

gradle

implementation 'org.jsoup:jsoup:1.17.2'

2. 模拟浏览器请求

豆瓣对爬虫有一定防护,直接使用Jsoup.connect(url).get()可能会被拒绝,因此我们添加一个常见的User-Agent头,模拟真实浏览器:

java

.userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...")

这样能有效降低被拦截的概率。

3. 解析HTML

doc.select(String cssQuery)方法使用CSS选择器选取元素。这里的选择器#content > div > div.article > ol > li是直接从浏览器复制而来的,可以精确定位每个电影条目所在的<li>

4. 提取数据

在每个<li>元素内部,再次使用select()方法提取子元素,并通过.text()获取纯文本内容。

  • div.pic > em:排名

  • div.info > div.hd > a > span:nth-child(1):电影名(第一个<span>

  • div.info > div.bd > div.star > span.rating_num:评分

5. 输出结果

将排名、电影名、评分拼接后打印到控制台。

五、运行结果示例

执行上述代码,控制台将输出类似以下内容:

1 肖申克的救赎 9.7 2 霸王别姬 9.6 3 阿甘正传 9.5 4 泰坦尼克号 9.5 5 这个杀手不太冷 9.4 ...

如果你想要爬取全部250条,需要处理翻页,豆瓣Top250的翻页是通过URL参数?start=xx实现的,每页25条,start从0开始递增25。只需循环构造不同start的URL即可。

六、注意事项

  1. 尊重网站的robots.txt:在爬取前请检查豆瓣的robots.txt(https://movie.douban.com/robots.txt),确保你的爬虫行为合规。

  2. 控制爬取频率:不要过快发送请求,建议在两次请求之间添加延时(如Thread.sleep(1000)),避免对服务器造成压力。

  3. User-Agent伪装:很多网站会检查请求头,务必添加常见的User-Agent。

  4. 异常处理:网络请求可能失败,代码中已包含基本的try-catch,可根据需要完善重试机制。

  5. HTML结构变化:如果豆瓣改版,选择器可能需要相应调整。

七、扩展:使用代理和更多反爬策略

如果遇到IP被封,可以使用代理IP池,并在Jsoup中设置代理:

System.setProperty("http.proxyHost", "代理IP"); System.setProperty("http.proxyPort", "端口");

对于更复杂的网站,可能需要处理Cookie、Session、动态加载的数据(这时需要配合Selenium等工具),但豆瓣Top250静态页面足够Jsoup处理。

八、总结

通过这个简单的例子,我们学会了如何使用Jsoup解析HTML并提取所需数据。Jsoup的强大之处在于它简洁的API和类jQuery的选择器语法,非常适合快速开发爬虫程序。当然,爬虫只是获取数据的手段,合法合规使用数据才是关键。

http://www.cnnetsun.cn/news/1343738.html

相关文章:

  • 在WebFuture里如何自动处理二维码问题脚本
  • 11-AI基础概念入门
  • django flask+uniapp 酒店管理系统设计 小程序_54ybz
  • 如何解决嵌套在公众号里面的H5页面有缓存的问题。公众号菜单的H5的域名不希望加版本号去修改
  • DataTable学习路线
  • 芯片解密多少钱,单片机解密价格详细解析
  • 2026必备!全行业通用降AI率平台 千笔·降AIGC助手 VS 万方智搜AI
  • 【用 Java API Client 操作 Elasticsearch】
  • AI智能体中的Skills是什么?
  • 某厂Java面试实录:深度解析高并发秒杀系统、Redis原子扣减、分布式锁与消息可靠性
  • Pandas加载Avro文件
  • sdut-程序设计基础Ⅰ-23级转专业第一次机测题
  • python运算符
  • 深入理解 AI Agent 中的 Skills:让 AI 拥有专业能力的秘密武器
  • 深度解析 pprof 的采样机制:它是如何在不影响性能的前提下捕获堆栈快照的?
  • 密码学加解密实训(Base64转义)
  • python股票数据分析预测系统 大模型股票行情预测系统 量化交易分析预测系统
  • Linux系统
  • 腾讯版「龙虾」Workbuddy上线当天,我用它搭了一套行业情报日报系统
  • 图表替代文字降AI率不会?看完这篇5分钟学会
  • AI Image Background Remover Pro
  • Python绘制带自动缩放的线条、多边形和规则多边形集合图
  • java面试题总结2
  • 老周虾扯:解构 AI 记忆构建长效 Agent 的底层逻辑与认知体系
  • 大数据建模中的混沌工程:测试系统弹性的方法
  • 深入解析UniAD架构:面向决策规划的端到端自动驾驶Transformer模型全景报告
  • C/C++: 栈包含哪些数据信息
  • 加解密篇 - 非对称加密算法 (RSA、DSA、ECC、DH)
  • 如何使用SQuAD Explorer:探索自然语言理解的终极指南
  • 探索稳定扩散之卓越:Awesome Stable Diffusion