首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby中创建Web爬虫程序。如何解决性能问题?

在Ruby中创建Web爬虫程序。如何解决性能问题?
EN

Stack Overflow用户
提问于 2012-09-22 16:32:13
回答 2查看 2.2K关注 0票数 3

我正在用Ruby构建一个网络爬虫,Rails作为前端。我使用的是Mechanize,它是基于Nokogiri构建的。我已经实现了一个可以抓取网页的解决方案,但我希望能够在一次运行中抓取20万个网站,我知道有一种比等待几个小时才能完成的更好的方法。我希望能够通过激发并行请求来实现最佳性能,而不会让它变得太复杂。我不知道任何关于线程和它的限制是什么,所以不要在爬虫运行时将服务器扣为人质,如果有人愿意指出我可以在哪里学习如何做到这一点,或者至少告诉我我应该寻找什么。保持在我的,我将写入数据库和文件(可能我可以从数据库导出,一旦抓取完成,而不是直接写入文件)。谢谢。

注意:在SO中有一个类似的问题,但是几年前,也许人们正在用不同的方式来做这件事,而且看起来非常复杂。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-25 03:32:06

看看如何使用Typhoeus and Hydra。它们将使并行处理URL变得容易。

您不需要使用机械化,除非您必须从每个页面请求特殊数据。对于普通的爬虫,你可以抓取正文并使用Open::URI和Nokogiri解析它,而不需要机械化的开销或附加功能。出于您的目的,将Typhoeus替换为Open::URI,并让Hydra处理线程管理。

记住,如果你试图一次抓取200k个网站,你的带宽将会饱和。这将使您的Rails站点不可用,因此您需要限制您的请求。而且,这意味着你将不得不在几个(或许多)小时内完成它们。速度并不比让你的网站保持在线更重要。我可能会将爬虫放在与Rails服务器不同的机器上,并让数据库将它们捆绑在一起。

创建包含正在爬网的网站URL的表或文件。我推荐这个表,这样你就可以把一个表单放在一起来编辑/管理URL。你会想要跟踪像这样的东西:

  • 上次对网址进行爬网的时间。(DateTime)
  • Whether你应该抓取一个特定的URL (Boolean或者char1)
  • URL (String或者var char1024就可以了)。这应该是唯一的键。
  • 当前是否正在搜索该URL (Boolean或char1)。此字段在所有记录的运行开始时清除,然后在爬行器加载该页面时设置并保留。
  • 显示何时可以运行该网站的字段。
  • 显示可以运行该网站的时间的字段。

最后两点很重要。你不会想要抓取一个功能不足的小站点并切断它的连接。这是一个很好的被禁止的方式。

创建另一个表,该表是下一个URL,用于检查从爬网时遇到的链接收集的特定站点。您需要想出一个规范化例程,将包含会话数据和参数的URL简化为可以用来测试唯一性的东西。在这个新表中,您希望URL是唯一的,这样您就不会陷入循环或不断添加具有不同参数的相同页面。

您可能需要注意在任何重定向之后检索到的实际登录URL,而不是"get“URL,因为重定向和DNS名称在站点内可能会有所不同,并且生成内容的人员可能使用不同的主机名称。类似地,您可能希望在head块中查找元重定向并遵循它们。这些是做你想写的事情的一个特别令人恼火的方面。

当您遇到新的URL时,请检查它们是否正在退出URL,如果您遵循这些URL,将导致您离开该站点。如果是这样,不要将它们添加到您的URL表中。

将数据库信息写入文件可能无济于事,因为要找到正确的文件,可能无论如何都需要进行数据库搜索。只需将所需内容存储在字段中并直接请求即可。200K行在数据库中不算什么。

注意网站的“爬虫”规则,如果他们提供了获取数据的API,那么就使用它,而不是爬行。

票数 5
EN

Stack Overflow用户

发布于 2012-09-23 03:02:24

检查http://anemone.rubyforge.org/index.html

我认为它可能适合你的需要,如果不是,你应该能够从它的源代码中学到很多东西。

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

https://stackoverflow.com/questions/12542171

复制
相关文章

相似问题

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