万网皆可爬-爬虫实战系列之-爬取高分电影拯救无聊的你

363 阅读3分钟

缘起

疫情期间大家在家都无聊透顶,公司同事吧有人发起了推荐电影的帖子,贴主收集了所有人的回复整理成了豆瓣豆列。刚好最近在写爬虫系列文章,就用这个作为具体案例来介绍下另一个神器jsoup的使用吧。

Jsoup是什么

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

Jsoup使用跟JQuery一样的语法进行节点操作,具体JQuery选择器语法可以参考 https://www.cnblogs.com/zhangziqiu/archive/2009/05/03/jQuery-Learn-2.html 进行学习,这里不在赘述。

页面结构分析

分页数据分析

老规矩F12打开chrome开发者工具,页面滑动到最底部,选中分页节点;会发现分页样式单独使用了paginatorcss样式进行修饰,点击事件为div下的a节点,可以直接使用css选择器选中对应的Dom节点然后获取对应的链接地址;

page

示例代码,因为分页信息包含前页、后页信息,这个不是我们需要的,只选取Number类型的即可,使用正则进行过滤。

Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
Elements page = document.select(".paginator a");
for (Element p : page) {
	String href = p.attr("href");
	String text = p.text();
	if (pattern.matcher(text).matches()) {
		System.out.println(href + " " + text);

	}
}

这样就可以获取所有的页面链接了,可以存起来备用。

单个电影详情分析

播放全片

详细观察每个电影上面的信息会发现播放全片功能有三种类型

  • 无播放列表
  • 3个以内的播放列表
  • 超过三个显示更多链接

playlist

这里同样适用CSS选择器进行节点选中,然后获取对应的文本内容。

Element videoItem = item.select(".doulist-video-items").first();
if (videoItem != null) {
	Elements videoAtags = videoItem.getElementsByTag("a");
	for (Element e : videoAtags) {
		String href = e.attr("href");
		String text = e.text();
		if (Objects.equals("更多", text)) {
			continue;
		}
		if (href.contains("www.douban.com/link2")) {
			String urlDecode = URLDecoder.decode(href);

			href = urlDecode.split("=")[1];
		}
		System.out.println(text + "  " + href);
	}

}

获取详情

我们需要的数据包含电影名称,评分,评价人数关键信息如图

detail

同样适用css选择器进行操作。

Elements itemElements = document.select(".article .doulist-item");
int size = itemElements.size();
for (int i = 0; i < size; i++) {
	Element item = itemElements.get(i);
	Element title = item.selectFirst("div.title");
	Element ratingNums = item.selectFirst(".rating_nums");
	Element rating = item.select(".rating").get(0).getElementsByTag("span").last();

	String titleText = title.text();
	String ratingNumsText = ratingNums.text();
	String ratingText = rating.text().replaceAll("\\(", "").replaceAll("人评价\\)", "");
	System.out.println(titleText);
	System.out.println(ratingNumsText);
	System.out.println(ratingText);
}

TOP10电影推荐

电影名称 评分 评价人数
蓝色星球2 Blue Planet II 9.8 31789
肖申克的救赎 The Shawshank Redemption 9.7 1902833
霸王别姬 9.6 1398550
阿甘正传 Forrest Gump 9.5 1447658
美丽人生 La vita è bella 9.5 919234
海贼王 ワンピース 9.5 111412
非自然死亡 アンナチュラル 9.4 361096
胜者即是正义 リーガル・ハイ 9.4 224077
盗梦空间 Inception 9.3 1396540
海上钢琴师 La leggenda del pianista sull'oceano 9.3 1159683

关注公众号回复电影1024获取源代码和所有电影

一个程序猿的异常
关注公众号回复电影1024获取源代码和所有电影