首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程网络爬虫的最快架构

多线程网络爬虫的最快架构
EN

Stack Overflow用户
提问于 2011-12-18 02:35:28
回答 5查看 4K关注 0票数 3

应该有一个边界对象-持有一组访问和等待抓取网址的。应该有一些线程负责抓取网页。也会有某种类型的控制器对象来创建爬行线程。

我不知道哪种架构会更快,更容易扩展。如何划分职责,以使同步尽可能少,并最大限度地减少检查当前URL是否已被访问的次数。

如果控制器对象负责向工作线程提供新的URL-这意味着工作线程将需要爬行所有给定的URL,然后休眠未定义的时间。控制器将解释这个线程,因此爬行线程应该处理InterruptedException (在Java语言中它是多么昂贵-似乎异常处理不是很快)。或者也许控制器应该只启动线程,让爬行线程自己获取边界?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-18 03:11:38

使用要搜索的URL创建一个共享的、线程安全的列表。创建一个执行器,其线程数与您希望并发运行的crawlers数相对应。将爬虫作为引用共享列表的Runnables启动,并将每个爬虫提交给Executor。每个crawler从列表中删除下一个URL,并执行您需要它做的任何事情,循环直到列表为空。

票数 3
EN

Stack Overflow用户

发布于 2015-11-12 09:33:23

这个问题已经提出好几年了,但在2015年11月,我们现在使用的是fronterascrapyd

Scrapy使用twisted,这使它成为一个很好的多线程爬虫,在多核机器上,这意味着我们只受到入站带宽的限制。Frontera-distributed使用hbase和kafka对链接进行评分,并保持所有数据可供客户端访问。

票数 2
EN

Stack Overflow用户

发布于 2011-12-18 03:34:19

创建一个具有散列映射的中央资源,该映射可以将URL存储为上次扫描的关键字。确保此线程安全。然后,只需在队列中生成带有链接的线程,爬虫就可以将其作为起始点。然后,每个线程将继续爬行和更新资源。资源中的线程清除过期的爬网。内存中的资源可以在启动时序列化,也可以在数据库中,这取决于您的应用程序需求。

您可以通过远程服务访问此资源,以允许多台机器。您可以通过分离urls来使资源本身分散在多台机器上。等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8547003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档