应该有一个边界对象-持有一组访问和等待抓取网址的。应该有一些线程负责抓取网页。也会有某种类型的控制器对象来创建爬行线程。
我不知道哪种架构会更快,更容易扩展。如何划分职责,以使同步尽可能少,并最大限度地减少检查当前URL是否已被访问的次数。
如果控制器对象负责向工作线程提供新的URL-这意味着工作线程将需要爬行所有给定的URL,然后休眠未定义的时间。控制器将解释这个线程,因此爬行线程应该处理InterruptedException (在Java语言中它是多么昂贵-似乎异常处理不是很快)。或者也许控制器应该只启动线程,让爬行线程自己获取边界?
发布于 2011-12-18 03:11:38
使用要搜索的URL创建一个共享的、线程安全的列表。创建一个执行器,其线程数与您希望并发运行的crawlers数相对应。将爬虫作为引用共享列表的Runnables启动,并将每个爬虫提交给Executor。每个crawler从列表中删除下一个URL,并执行您需要它做的任何事情,循环直到列表为空。
发布于 2015-11-12 09:33:23
发布于 2011-12-18 03:34:19
创建一个具有散列映射的中央资源,该映射可以将URL存储为上次扫描的关键字。确保此线程安全。然后,只需在队列中生成带有链接的线程,爬虫就可以将其作为起始点。然后,每个线程将继续爬行和更新资源。资源中的线程清除过期的爬网。内存中的资源可以在启动时序列化,也可以在数据库中,这取决于您的应用程序需求。
您可以通过远程服务访问此资源,以允许多台机器。您可以通过分离urls来使资源本身分散在多台机器上。等等。
https://stackoverflow.com/questions/8547003
复制相似问题