在进行解析之前,可以使用过滤器对CrawlDatum设置元数据,或者URL去重。
代码如下:(仅仅包含main方法中的代码)
DemoNextFilter crawler = new DemoNextFilter("crawl", true);
crawler.setNextFilter(new NextFilter() {
@Override
public CrawlDatum filter(CrawlDatum nextItem, CrawlDatum referer) {
//除了种子URL外的所有链接都会先经过filter,再经过visit方法
if (nextItem.matchUrl("https://blog.csdn.net/.*/article/details/.*")) {
nextItem.type("content");
return nextItem;
} else {
// 如果想过滤掉该URL,可以返回null
return null;
}
}
});
crawler.start(2);
上面使用了自定义的过滤器,框架中也提供了一个去重复的过滤器。
代码如下:
DemoHashSetNextFilter crawler = new DemoHashSetNextFilter("crawl");
HashSetNextFilter nextFilter = new HashSetNextFilter();
//提前放进去的URL会被过滤
nextFilter.add("https://blog.csdn.net/");
crawler.setNextFilter(nextFilter);
crawler.start(2);
上述过滤器的源码如下:
@Override
public CrawlDatum filter(CrawlDatum nextItem, CrawlDatum referer) {
String key = nextItem.key();
if (this.contains(key)) {
return null;
} else {
return nextItem;
}
}
Q.E.D.