Java 正在调用控制器。是否在Crawler4j的循环中启动?

Java 正在调用控制器。是否在Crawler4j的循环中启动?,java,web-crawler,crawler4j,Java,Web Crawler,Crawler4j,我问了一个问题。但这是另一个听起来类似的问题 使用crawler4j,我想抓取多个对域名有限制的种子URL(即域名签入shouldVisit)。这是一个如何做到这一点的例子。简而言之,您可以使用customData设置域名列表,然后将其传递给爬虫类(来自控制器),在shouldVisit函数中,我们循环遍历此数据(这是一个列表,请参阅链接的url),查看列表中是否有域名,如果是,则返回true 这里面有个小毛病。如果google.com和yahoo.com在种子url域名列表和www.yahoo

我问了一个问题。但这是另一个听起来类似的问题

使用crawler4j,我想抓取多个对域名有限制的种子URL(即域名签入shouldVisit)。这是一个如何做到这一点的例子。简而言之,您可以使用customData设置域名列表,然后将其传递给爬虫类(来自控制器),在shouldVisit函数中,我们循环遍历此数据(这是一个列表,请参阅链接的url),查看列表中是否有域名,如果是,则返回true

这里面有个小毛病。如果google.com和yahoo.com在种子url域名列表和www.yahoo.com/xyz到www.google.com/zyx的链接中,它将抓取页面,因为www.google.com在我们的域名访问列表中。此外,如果种子URL的数量很大(数千个),shouldVisit中的for循环可能会很重,并且会消耗一些内存

为了解决这个问题,我可以考虑通过种子URL进行循环。它可能是这样的:

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中实现。请访问以获取用法示例

基本上,您需要在非阻塞模式下启动控制器:

controller.startNonBlocking(MyCrawler.class,numberOfThreads)

然后可以在循环中添加种子。请注意,您不需要这样做 循环启动控制器数次。


希望有帮助

非常感谢。但不幸的是,这不允许我为每个seedurl添加不同的自定义数据。你能帮助解决这个问题吗?你解决了这个问题吗?如果解决了意味着我有一个错误,你可以解决我认为是这样的问题,url在这里