在进行解析之前,可以使用过滤器对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.


擅长前端的Java程序员