前言
如果还没有阅读前序文章,可以移步到前面两篇:
基本概念
需要处理的网页范围,简称处理范围,确定了爬虫遍历的过程中,哪些网页需要保存并处理。
处理范围是爬虫的输入,是爬取任务的组成部分。
定义处理范围的数据项主要是网址特征和网页内部特征,具体如下。
- 网址特征。
- 网页的内部特征。
- 最多要处理多少网页。
网址特征还是支持普通字符串特征和正则表达式。
网页内部特征仅包含简单的字符串特征,如果有其他需求,可以自行扩展。
举例说明
继续使用CoolShell网站举例。
- 要保存并处理的文章链接类似下面这个网址,https://coolshell.cn/articles/21649.html。从字符串角度,可以认为包含articles字符串的URL都是需要采集并处理的,也可以用正则表达式,形式可以是这样https://coolshell\.cn/articles/\d+\.html。
- 保存的网页最大数量,可以设置为100,也可以不设置。
- 网页内部特征可以不设置,意味着只要满足链接特征的文章都保存下来。
代码示例
interface ProcessingScope { //处理范围接口
//是否包含某个网页
boolean contains(Webpage webpage);
//处理网页的数量最大值
long maxToProcess();
}
public class ProcessingScopeImpl implements ProcessingScope {
//包含特定字符串特征的URL才被解析
private String urlPattern;
//正则特征
private String urlRegEx;
//包含特定特征的页面才被解析,应该是数组
private String pagePattern;
//处理的网页数量最大值
private long maxToProcess = -1;
@Override
public boolean contains(Webpage webpage) {
try {
URL url = new URL(webpage.getUrl());
return contains(url) && containsPage(webpage.getHtml());
} catch (MalformedURLException e) {
e.printStackTrace();
return false;
}
}
//处理范围是否包含某个网址
boolean contains(URL url) {
UrlFilter urlFilter = new UrlFilter(urlPattern, urlRegEx);
return urlFilter.isMatch(url);
}
//处理范围是否包含某个网页
boolean containsPage(String html) {
if (StringUtils.isEmpty(this.pagePattern)) {
return true;
}
if (StringUtils.isEmpty(html)) {
return false;
}
return html.contains(this.pagePattern);
}
有了处理范围这个元素,就可以很容易判断一个网页是否需要保存并处理。
if (processingScope.contains(webpage)) {
webpageRepository.add(webpage);
//或者执行其他处理逻辑
logger.info("Saved html {}", webpage.getUrl());
}
处理范围的建模就要结束了,这里只演示了比较基本的规则,根据实际需求,需要增加更多的限制条件,比如过滤掉一些不含图片的页面,或者过滤掉特定语种的页面。
无论是什么规则,都只是一些静态规则,这是普通爬虫的能力局限。随着深度学习技术的飞速发展,爬虫可以更加智能,不断从爬取数据的过程中学习,更加出色地完成任务。