我在这里问了一个问题。但这是另一个听起来相似的问题。
使用crawler4j,我想抓取多个种子网址,但对域名有限制(即域名签入应该访问)。下面是如何执行此操作的示例。简而言之,您使用customData设置域名列表,然后将其传递给爬虫类(从控制器),在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);
}
我不确定这是否是一个糟糕的主意,但是在性能方面这样做有什么优点/缺点吗? 其他问题 ?
编辑:
我测试了它,似乎这种方法消耗了太多时间(可能是在每个循环中打开和关闭控制器的实例。希望有其他解决方案。
尝试我在相关主题中找到的解决方案:
从版本 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);
然后,您可以循环添加种子。请注意,您不需要 在循环中多次启动控制器。
希望对您有所帮助!