FrontierScheduler是一个PostProcessor,它的作用是将在Extractor中所分析得出的链接加入到Frontier中,以待继续处理。先来看一下FrontierScheduler的innerProcess()方法,代码如下。
package org.archive.crawler.postprocessor;import org.archive.crawler.datamodel.CandidateURI;
/**
*
* @ClassName: NewsFrontierScheduler
* @Description: TODO(用一句话描述这个类的作用)
* 将Extractor中分析的链接加入到Frontier中
* @author rj 597306518@qq.com
* @data 2017年6月18日 下午8:59:14
*
*/
public class NewsFrontierScheduler extends FrontierScheduler {
private static final long serialVersionUID = -6481877812157244713L;
public NewsFrontierScheduler(String name) {
super(name);
}
/**
* 定制自己的抓取逻辑
* 将包含关键字的uri加入到链接中去
*/
protected void schedule(CandidateURI caUri) {
if (caUri.toString().contains("news")) {
getController().getFrontier().schedule(caUri);
}
}
}
上面的代码中,首先检查当前链接处理后的结果集中是否有一些属于高优先级的链接,如果是,则立刻转走进行处理。如果没有,则对所有的结果集进行遍历,然后调用Frontier中的schedule方法加入队列进行处理。 在这里,innerProcess()中并未立刻使用Frontier中的schedule()方法,而是增加了一层封装,先调用了一个类内部的protected类型的schedule()方法,进而在这个方法中再调用Frontier的schedule方法。这种方式对FrontierScheduler进行扩展留出了很好的接口。
例如,当有某个任务在抓取时,可能希望人为的去除符合某种条件的URL链接,使得其内容不会保存到本地。比如,要去除所有的扩展名为.zip、.exe、.rar、.pdf和.doc的链接(其实也就是不想下载这类文件)。可以通过继承FrontierScheduler,并重写内部的schedule方法来达到我们的需要。以下是一个示例。
String url = caUri.toString();
if (url.endsWith(".zip")
|| url.endsWith(".rar")
|| url.endsWith(".exe")
|| url.endsWith(".pdf")
|| url.endsWith(".doc")
|| url.endsWith(".xls")) {
return;
}
getController().getFrontier().schedule(caUri);
}
这样,每当Heritrix在执行任务时,遇到这样的文件,就会跳过抓取,从而达到了对URL链接进行筛选的目的。
这个到后面真正抓取的时候也是很有用的
下一步:将重写的NewsFrontierScheduler 加入到 Processor.options 中
在Processor.options中找到 下面的配置行
org.archive.crawler.postprocessor.FrontierScheduler|FrontierScheduler
在它的上面添加如下代码:
org.archive.crawler.postprocessor.NewsFrontierScheduler|NewsFrontierScheduler
最后配置信息为:
org.archive.crawler.postprocessor.NewsFrontierScheduler|NewsFrontierScheduler
org.archive.crawler.postprocessor.FrontierScheduler|FrontierScheduler
参考资料:
http://www.xuebuyuan.com/1339469.html