java 爬取 豆瓣_谁说Java不能搞爬虫,哥带你一起爬取豆瓣电影Top250

本文介绍了如何使用Java和Jsoup库来爬取豆瓣电影Top250的数据,包括电影排名、名称、演员、年份、国家、类型、评分和简评。通过分析网页结构,提取所需数据,最终实现完整爬虫程序,同时处理了可能出现的异常情况。
摘要由CSDN通过智能技术生成

b9ea662ae6fd623ea81288a4f9f54a0d.png

我命由我不由天,我今天就自己来试试看,看看Java写个爬虫是有多费劲?看懂的朋友别忘记给我个哈,毕竟我是堵上了咱们Java程序员的在奋战!奥利给!我们先来分析一下这个网页,看看哪些数据比较有价值。我们一起来分析一下数据,讲一讲怎么抓取。

闲扯几句

大家好,本期我准备了一篇爬虫的教程,也是从最基础的网页爬虫开始,给大家讲讲网页爬虫的小技巧。

看到网上很多的爬虫代码都是基于的,那作为一名的我就有点不服气了,Java难道不能做爬虫吗?我想写个爬虫是不是还得先学会?程序员的头发不知道多宝贵吗?花那么多时间学习语言,是想造孽啊?救救孩子吧,救救我我本来就日渐稀疏的头发吧。

bd3218288d06f196ae46dbeddd690b0d.png

网页分析

话不多说,开整!

先打开我要爬取数据的网页:豆瓣电影Top250

844a3884d481df65df7f24697d559184.png

以「No.1」的经典越狱电影《肖申克的救赎》举例子,我们可以看到的数据有:

1. 排名

2. 电影名称

3. 导演和演员信息

4. 电影上映年份

5. 电影所属的国家

6. 电影类型

7. 电影评分

8. 电影评价数

9. 电影简评

55bf61f13b6ef2c791f1a69e071082a3.png

OK,分析完一个网页结构,确定好了我们需要的数据,那么我们准备开始写程序批量抓取了。

4d94d113a138fa0e41161dae04c5c8b0.png

思路讲解

写代码之前,我们先不要着急,先理一理思路。你知道,写代码最重要的就是思路,思路理顺了,可以说你的代码已经完成了一半。那剩下的一半干嘛?写bug,调bug呗

打开网页豆瓣电影Top250按下「f12」,看到下面这个界面

11fc3008cbe6747c3c76dcabed8c9094.png

点击左上角这个箭头,然后选中网页对应的位置,在下面就会出现这个位置对应的html代码。

先整体看一下,可以看到每个电影都是一个

标签,在这个li标签里面存放着这个电影相关的全部html代码:再打开li标签,可以看到,每个li标签里面都是一个 的,这个div就是我们需要获取数据的最外层div了。然后我们从这个div往下看,找到对应数据存放的标签即可。我们可以从下面的 标签里面找到,那我们只需要一层层往下解析这个html代码,找到这个 标签,获取出里面的文本就行了。其他的数据也是异曲同工,我们可以按照这个套路都找一下对应的标签的位置,然后抓取。怎么样,很简单是吧?那么下面就开始写bug吧第一页的url是这样的:所以我们通过方法批量从网页中获取的元素:果然,出问题了,哈哈哈,很快哈,啪的一下就出来了。第200个电影是好的,那就是说它的下一个 出问题了。我们翻到这一页看下网页是啥样的:果然,这个名叫 的电影没有简介,那就是说没这个标签啊,怪不得获取失败了。

0c8326237fae504558aefc6f59520ef3.png

class='item'

div

比如这个电影排名:

24a21c900d010d4f7711829205a12523.png

em

em

c9168ed8aad61d6a48c03d3d78aea57e.png

撸代码

写代码之前先喝杯咖啡,润润肺,找找灵感,你知道5k程序员和50k程序员的差别在哪里吗?

仪式感!我跟你说,仪式感非常重要,包括生活中也是,你不能把自己过成穷屌丝的样子,要不然这辈子抬不起头来,你要假装自己是亿万富翁,然后花钱去享受,再然后回到一穷二白。如果你非要问我为什么要有这段经历,那不就是死要面子活受罪么...

咳咳,扯远了,继续回到正题哈。

我这次使用的插件是 ,相信很多小伙伴都听说过它的大名啊,没错,它是一个非常适合做网页html解析的第三方类库,而且它可以直接连接目标网址,获取数据,无需使用其他的http请求工具,非常的方便,适合小白。

Jsoup

第一步:创建maven工程

为什么使用maven工程?

那还用问啊,当然是方便啊,我总不能去网上下载jar包导进idea吧,那太low了,不符合我的气质啊,所以你自己拿捏了哈,同学。

创建maven工程具体的步骤我就不在这里赘述了,网上教程一搜一大堆。我们创建好工程后直接在pom里导入依赖:

org.jsoupgroupId>

jsoupartifactId>

1.13.1version>

dependency>

对,是她了,我们的主角。

jsoup

接下来就开始撸了呗。因为我们请求的所有数据分为10页,所以我们写个循环,从0开始:

9296b05eda7666aac973e5f0b7e9da7b.png

https://movie.douban.com/top250?start=0&filter=

第二页的url是这样的:

https://movie.douban.com/top250?start=25&filter=

可以看出来,通过 这个参数可以控制切换分页,那么我们就在循环里制造这样的参数:

start

for (int i = 0; i < 10; i++) {

int page = i * 25; // 制造分页参数

}

下面就开始通过发送http请求获取网页html代码,这里的document就是整个文档对象,我们可以从中获取各种标签的数据。

Jsoup

Document document = Jsoup.connect("https://movie.douban.com/top250?start="+ page).get();

拿到文档对象后,我们就获取每个电影的div,分析网页可以看到,它的class是

item

95d02ed3f68de23f34b52a58878e0c78.png

getElementsByClass

class=item

Elements items = document.getElementsByClass("item"); // 批量获取当前页中class=item的元素

然后开始遍历所有的,依次获取他们的电影相关的数据:

item

for (Element item : items) {

// 每个item中都包含当前电影的所有数据

}

再来分析网页,依次拿到我们需要的数据

1.「电影排名」很简单啊,直接获取中第一个标签的文本就可以了:

d001baa7cf9df6cba575531e43a92f74.png

1. item

2. em

String num = item.getElementsByTag("em").get(0).text();

1.「电影名称」获取 下的第一个 div的第一个span的文本

eb26dd808ae15d387836b011347a0844.png

1. item

2.

String title = item.getElementsByClass("hd").get(0).getElementsByTag("span").get(0).text();

1.「演员信息、电影年份、国家、电影类型」注意这里,演员信息在一个标签里,但是标签的文本分成了两部分,用 隔开,所以我们先要获取到 标签的html文本,然后根据 多html文本进行分割,分别获取和、、等数据:

b53857f5791fe24d34686c5f27c71712.png

1. p

2. p

4. p

6. 演员信息

7. 电影年份

8. 国家

9. 电影类型

String bd = item.getElementsByClass("bd").get(0).getElementsByTag("p").get(0).html();

String actor = bd.split("

")[0].replaceAll(" ", " "); // 演员信息,注意替换空格符号

String info = bd.split("

")[1].replaceAll(" ", " ");

String[] infos = info.split("/"); // 下面的三个数据通过 '/' 来分割

String year = infos[0].trim(); // 电影年份

String country = infos[1].trim(); // 国家

String type = infos[2].trim(); // 电影类型

1.「电影评分」

e5b2fea1a280541c7673037601437933.png

1. 这个就比较简单了,直接获取第一个 标签的文本就可以了:

2.

String ratingNum = item.getElementsByClass("rating_num").get(0).text(); // 获取评分

1.「电影简评」这个跟评分类似,获取第一个 标签的文本就可以了:

4c29745d02bdabfa352b388ce43f9e0b.png

1. calss=quote

String quote = item.getElementsByClass("quote").get(0).text();

Ok,到这里所有的代码就写完了,怎么样,是不是跟着思路走分析起来很容易呢?你自己可以试试哦,这里是完整的代码:

for (int i = 0; i < 10; i++) {

int page = i * 25;

Document document = Jsoup.connect("https://movie.douban.com/top250?start="+ page).get();

Elements items = document.getElementsByClass("item");

for (Element item : items) {

String num = item.getElementsByTag("em").get(0).text();

String title = item.getElementsByClass("hd").get(0).getElementsByTag("span").get(0).text();

String bd = item.getElementsByClass("bd").get(0).getElementsByTag("p").get(0).html();

String actor = bd.split("

")[0].replaceAll(" ", " ");

String info = bd.split("

")[1].replaceAll(" ", " ");

String[] infos = info.split("/");

String year = infos[0].trim();

String country = infos[1].trim();

String type = infos[2].trim();

String ratingNum = item.getElementsByClass("rating_num").get(0).text();

String quote = item.getElementsByClass("quote").get(0).text();

System.out.println("电影名次: " + num);

System.out.println("电影标题: " + title);

System.out.println("电影演员: " + actor);

System.out.println("电影年份: " + year);

System.out.println("国家: " + country);

System.out.println("电影类型: " + type);

System.out.println("电影评分: " + ratingNum);

System.out.println("电影简评: " + quote);

System.out.println("============================================");

}

}

写完之后,我们运行一下代码,看看代码有没有问题。

e8c08cb6168a2b738db11e5aeed7869d.png

这是个啥错误?

一看,数组越界了,我心中已经猜想到答案了,肯定是获取的数据缺少了点什么导致的。我们定位到问题行:,也就是这段代码:

25

String quote = item.getElementsByClass("quote").get(0).text();

获取简评失败了。

再看是第几个电影的数据出问题:

dfa0d2da0bb67844305c4662070f89fd.png

201哈利·波特与火焰杯

那咋办呢?我们这里就需要对异常信息进行一个处理,不能让程序中断。

String quote = "";

if (item.getElementsByClass("quote").size() > 0) {

quote = item.getElementsByClass("quote").get(0).text();

}

再跑一次:

ebf9c1c94b5c864cccd622ab9a9456da.png

程序完整运行下来了,而且电影信息全部拿到了,也就是说我们这次关于豆瓣电影 top250的数据爬取成功了。

结尾

好了,以上就是我这期给您带来的一个Java爬虫入门小案例。从到再到、,整个过程都非常详细充实,并且代码执行的每一步都配置了图片说明,就是为了能让你真正搞懂。你说,我是不是个贴心的大暖男

需求分析

思路整理

代码细节

错误处理

希望通过我分享的案例能带你一起学习、提升,发现更多有趣好玩儿的东东。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值