java爬虫抓取网页数据(开发者供不应求,传统企业如何拥抱DevOps?(图))
优采云 发布时间: 2022-01-02 09:03java爬虫抓取网页数据(开发者供不应求,传统企业如何拥抱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;
}
}
下载器