我问了一个问题here。但这是另一个听起来相似的问题。
使用crawler4j,我想抓取多个种子网址,限制域名(即域名检查shouldVisit)。 Here是如何做到这一点的一个例子。简而言之,您使用customData设置域名列表,然后将其传递给crawler类(来自控制器),并在shouldVisit函数中,我们遍历此数据(这是一个列表,请参阅链接的url)以查看是否存在域名列表,如果是,则返回true。
这有一个小故障。如果google.com和yahoo.com在种子网址列表的名称和www.yahoo.com/xyz链接到www.google.com/zyx,它将抓取该页面,因为www.google.com在那里在我们的域名访问列表中。此外,如果种子URL的数量很大(数千)并且它也将消耗一些内存,那么shouldVisit中的for循环可能很重。
为了解决这个问题,我可以想到通过种子网址循环。这就是它的样子:
while(s.next()){
CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
controller.addSeed(some-seed-url);
controller.setCustomData(domain-name-of-seed-url-to-be-checked-in-shouldVisit);
controller.start(MyCrawler.class, numberOfCrawlers);
}
我不确定这是否是一个糟糕的主意,但在性能方面有没有优势/劣势?其他问题?
编辑:
我对它进行了测试,看起来这种方法耗费了太多时间(可能是在每个循环中打开和关闭控制器的实例。)希望还有其他一些解决方案。
答案 0 :(得分:1)
尝试我在相关主题中找到的解决方案:
从3.0版开始,此功能在crawler4j中实现。有关示例用法,请访问http://code.google.com/p/crawler4j/source/browse/src/test/java/edu/uci/ics/crawler4j/examples/multiple/。
基本上,您需要以非阻塞模式启动控制器:
controller.startNonBlocking(MyCrawler.class,numberOfThreads);
然后您可以循环添加种子。请注意,您不需要 在循环中多次启动控制器。
希望它有所帮助!