Ruby中的Web爬虫:如何实现最佳性能?

时间:2011-01-14 03:54:14

标签: ruby multithreading performance web-crawler multiprocessing

我正在编写一个能够同时解析多个页面的网络爬虫。我使用Nokogiri解析它是安静的好并解决我的所有任务,但我不知道如何实现更好的性能。

我使用线程同时发出许多open-uri请求,这使得进程更快,但似乎它仍然远远不能从单个服务器实现。我应该使用多个流程吗?可以为单个ruby应用程序启动的线程和进程的限制是什么?

换句话说:在这种情况下如何实现最佳性能。

5 个答案:

答案 0 :(得分:4)

我非常希望Typhoeus and Hydra能够同时处理多个请求。

Typhoeus是http客户端,Hydra是处理多个请求的部分。这些例子很好,所以请仔细阅读。

答案 1 :(得分:3)

虽然听起来你并不是在寻找一些非常复杂的东西,但我发现这篇论文不久前是一篇有趣的读物:Building blocks of a scalable webcrawler - Marc Seeger

就线程/进程限制而言,Ruby具有非常低的线程潜力。标准Ruby(MRI / YARV)和Rubinius不支持同时执行线程,除非使用专门为支持它而构建的扩展。取决于您在IO中的性能问题有多少以及我可以建议使用EventMachine进行处理的程度。

多进程然而Ruby工作得很好,只要你有一个好的管理器/数据库用于所有进程通信,然后运行多个进程应该扩展以及你的处理能力允许。

答案 2 :(得分:3)

另一种方法是使用Nokogiri和IronWorker(IronMQIronCache)的组合。

查看主题here

上的完整博客文章

答案 3 :(得分:1)

我们结合使用ActiveMQ / Active Messaging,Event Machine和多线程来解决此问题。我们从一个要获取的URL的大列表开始。然后我们将它们分解为每批100个URL。然后将每个批次推送到ActiveMQ。然后,我们有一个监听队列的轮询器/消费者进程数组。这些消费者都可以在一台计算机上,或者可以分布在多台计算机上。消费者群体可以随意增长,以支持我们想要的并行性。消费者使用Active Messaging,这是一个很好的Ruby与ActiveMQ的集成。

当消费者收到处理一批100个URL的消息时,它会启动Event Machine以创建一个可以处理多个线程中的多个消息的线程池。和你一样,我们使用Nokogiri来处理每个URL。

因此,有三个并行级别:

1)每个消费者进程有多个并发请求,由事件机器和线程支持。

2)每台计算机有多个消费者流程。

3)多台电脑。

答案 4 :(得分:1)

如果你想要轻松的事情请去http://anemone.rubyforge.org/
如果你想要快速的东西,用eventmachine / em-http-request

编写代码

我发现redis是一个很棒的多用途工具,用于队列管理,缓存等。你也可以使用像beanstalkd / active mq / ...这样的特殊东西,但至少在我的用例中,与redis相比,我并没有真正发现它们是一个很大的优势。 特别是后端系统的负载可能是瓶颈,所以请仔细选择您的数据库并注意保存的内容