0

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

使用 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);    


}

我不确定这是否是一个糟糕的主意,但在性能方面这样做有什么好处/坏处吗?其他顾虑?

编辑 :

我对其进行了测试,似乎这种方法消耗了太多时间(可能是在每个循环中打开和关闭控制器的实例。)希望有其他解决方案。

4

1 回答 1

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);

然后你可以循环添加你的种子。请注意,您不需要在一个循环中多次启动控制器。

希望能帮助到你!

于 2014-04-14T15:35:15.917 回答