在日常开发中,我们经常需要从网页上获取数据,而手动复制粘贴显然太低效。今天我们就来学习如何使用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.txthttps://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的选择器语法,非常适合快速开发爬虫程序。当然,爬虫只是获取数据的手段,合法合规使用数据才是关键。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐