我正在用Ruby构建一个网络爬虫,Rails作为前端。我使用的是Mechanize,它是基于Nokogiri构建的。我已经实现了一个可以抓取网页的解决方案,但我希望能够在一次运行中抓取20万个网站,我知道有一种比等待几个小时才能完成的更好的方法。我希望能够通过激发并行请求来实现最佳性能,而不会让它变得太复杂。我不知道任何关于线程和它的限制是什么,所以不要在爬虫运行时将服务器扣为人质,如果有人愿意指出我可以在哪里学习如何做到这一点,或者至少告诉我我应该寻找什么。保持在我的,我将写入数据库和文件(可能我可以从数据库导出,一旦抓取完成,而不是直接写入文件)。谢谢。
注意:在SO中有一个类似的问题,但是几年前,也许人们正在用不同的方式来做这件事,而且看起来非常复杂。
发布于 2012-09-25 03:32:06
看看如何使用Typhoeus and Hydra。它们将使并行处理URL变得容易。
您不需要使用机械化,除非您必须从每个页面请求特殊数据。对于普通的爬虫,你可以抓取正文并使用Open::URI和Nokogiri解析它,而不需要机械化的开销或附加功能。出于您的目的,将Typhoeus替换为Open::URI,并让Hydra处理线程管理。
记住,如果你试图一次抓取200k个网站,你的带宽将会饱和。这将使您的Rails站点不可用,因此您需要限制您的请求。而且,这意味着你将不得不在几个(或许多)小时内完成它们。速度并不比让你的网站保持在线更重要。我可能会将爬虫放在与Rails服务器不同的机器上,并让数据库将它们捆绑在一起。
创建包含正在爬网的网站URL的表或文件。我推荐这个表,这样你就可以把一个表单放在一起来编辑/管理URL。你会想要跟踪像这样的东西:
最后两点很重要。你不会想要抓取一个功能不足的小站点并切断它的连接。这是一个很好的被禁止的方式。
创建另一个表,该表是下一个URL,用于检查从爬网时遇到的链接收集的特定站点。您需要想出一个规范化例程,将包含会话数据和参数的URL简化为可以用来测试唯一性的东西。在这个新表中,您希望URL是唯一的,这样您就不会陷入循环或不断添加具有不同参数的相同页面。
您可能需要注意在任何重定向之后检索到的实际登录URL,而不是"get“URL,因为重定向和DNS名称在站点内可能会有所不同,并且生成内容的人员可能使用不同的主机名称。类似地,您可能希望在head块中查找元重定向并遵循它们。这些是做你想写的事情的一个特别令人恼火的方面。
当您遇到新的URL时,请检查它们是否正在退出URL,如果您遵循这些URL,将导致您离开该站点。如果是这样,不要将它们添加到您的URL表中。
将数据库信息写入文件可能无济于事,因为要找到正确的文件,可能无论如何都需要进行数据库搜索。只需将所需内容存储在字段中并直接请求即可。200K行在数据库中不算什么。
注意网站的“爬虫”规则,如果他们提供了获取数据的API,那么就使用它,而不是爬行。
发布于 2012-09-23 03:02:24
检查http://anemone.rubyforge.org/index.html
我认为它可能适合你的需要,如果不是,你应该能够从它的源代码中学到很多东西。
https://stackoverflow.com/questions/12542171
复制相似问题