java爬虫抓取网页数据(开发者供不应求,传统企业如何拥抱DevOps?(图))

优采云 发布时间: 2022-01-02 09:03

  java爬虫抓取网页数据(开发者供不应求,传统企业如何拥抱DevOps?(图))

  开发者供不应求,传统企业如何拥抱DevOps? >>>

  

  最近在看国产剧《我不是药神》。为了分析观众对这部电影的真实感受,我爬取了豆瓣影评的数据。当然,本文只讲爬虫部分(不涉及分析部分),这是一个比较基础的爬虫实现,分为Java版和Python版,代码结构相同,只是实现语言不同.

  网页结构分析

  打开影评网页,试着翻几页,可以看到每一页的网页结构都是一样的。分为中间的数据列表和底部的页面导航。页面导航链接用于水平抓取所有影评网页。说到中间数据部分,每个页面都是一个列表,每个列表项收录:用户头像、用户名、用户链接、评分(5星)、评论日期、点赞数(有用)和评论内容。本文记录了用户名、评分、日期、点赞数和内容五个字段。

  爬虫的基本结构

  爬虫实现为标准的单线程(进程)爬虫结构,由爬虫主程序、URL管理器、网页下载器、网页解析器和内容处理器组成

  队列管理

  通过观察多个页面的url,发现url本身没有变化,只是参数发生了变化。另外,有些页面URL会携带参数&status=P,有些则不会。影响网页访问),避免同一个URL因为这个参数被当作两个URL(这里是一个简化的处理方法,请自行考虑更健壮的实现)

  package com.zlikun.learning.douban.movie;

import java.util.*;

import java.util.stream.Collectors;

/**

* URL管理器,本工程中使用单线程,所以直接使用集合实现

*

* @author zlikun

* @date 2018/7/12 17:58

*/

public class UrlManager {

private String baseUrl;

private Queue newUrls = new LinkedList();

private Set oldUrls = new HashSet();

public UrlManager(String baseUrl, String rootUrl) {

this(baseUrl, Arrays.asList(rootUrl));

}

public UrlManager(String baseUrl, List rootUrls) {

if (baseUrl == null || rootUrls == null || rootUrls.isEmpty()) {

return;

}

this.baseUrl = baseUrl;

// 添加待抓取URL列表

this.appendNewUrls(rootUrls);

}

/**

* 追加待抓取URLs

*

* @param urls

*/

public void appendNewUrls(List urls) {

// 添加待抓取URL列表

newUrls.addAll(urls.stream()

// 过滤指定URL

.filter(url -> url.startsWith(baseUrl))

// 处理URL中的多余参数(&status=P,有的链接有,有的没有,为避免重复,统一去除,去除后并不影响)

.map(url -> url.replace("&status=P", ""))

// 过滤重复的URL

.filter(url -> !newUrls.contains(url) && !oldUrls.contains(url))

// 返回处理过后的URL列表

.collect(Collectors.toList()));

}

public boolean hasNewUrl() {

return !this.newUrls.isEmpty();

}

/**

* 取出一个新URL,这里简化处理了新旧URL状态迁移过程,取出后即认为成功处理了(实际情况下需要考虑各种失败情况和边界条件)

*

* @return

*/

public String getNewUrl() {

String url = this.newUrls.poll();

this.oldUrls.add(url);

return url;

}

}

  下载器

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线