Lui*_*aca 3 multithreading mechanize web-crawler nokogiri
我正在使用Ruby构建一个Web爬虫,Rails作为前端.我正在使用建立在Nokogiri之上的Mechanize.我已经实现了一个可以抓取网页的解决方案,但我希望能够在一次运行中抓取200k个网站,而且我知道有一种比等待数小时完成的更好的方法.我希望能够通过启动并行请求来实现最佳性能,而不会使其过于复杂.我对线程没有任何了解,对它的限制是什么,所以如果有人想指出我可以学习如何做到这一点或者至少告诉我应该做什么,不要在爬虫运行时保持服务器人质寻找.保持我的意思,我将写入数据库和文件(可能我可以在爬网完成后从数据库导出,而不是直接写入文件).谢谢.
注意:这里有一个类似的问题,但是几年之后,人们现在可能会采用不同的方式,现在看来非常复杂.
看看使用Typhoeus和Hydra.它们可以轻松地并行处理URL.
您不需要使用Mechanize,除非您必须从每个页面请求特殊数据.对于普通的爬虫,您可以使用Open :: URI和Nokogiri获取正文并使用Openize来解析它,而无需使用Mechanize的开销或添加功能.为了您的目的,用Typhoeus替换Open :: URI并让Hydra处理线程管理.
请记住,如果您尝试一次性完成所有操作,那么抓取200k网站会使您的带宽饱和.这将使您的Rails站点不可用,因此您需要限制您的请求.而且,这意味着你必须在几个(或许多)小时内完成它们.速度并不像在这里保持您的网站在线那么重要.我可能会将爬虫放在与Rails服务器不同的机器上,让数据库将各种东西联系在一起.
创建包含要爬网的站点URL的表或文件.我建议使用该表,以便您可以整理一个表单来编辑/管理URL.您需要跟踪以下内容:
最后两个很重要.您不希望抓取功能不足的小站点并终止其连接.这是被禁止的好方法.
创建另一个表,该表是下一个URL,用于检查从爬网时遇到的链接收集的特定站点.您需要提出一个规范化例程,将会话数据和参数的URL减少为可用于测试唯一性的内容.在这个新表中,您将希望URL是唯一的,这样您就不会进入循环或继续使用不同的参数添加相同的页面.
您可能需要注意在重定向后检索的实际登陆URL而不是"获取"URL,因为重定向和DNS名称可能在站点内有所不同,生成内容的人可能使用不同的主机名.同样,您可能希望在头部块中查找元重定向并遵循它们.做你想写的东西是一个特别恼人的方面.
当您遇到新的URL时,请检查它们是否正在退出URL,如果您遵循这些URL,将导致您离开该站点.如果是这样,请不要将它们添加到您的URL表中.
将数据库信息写入文件可能无济于事,因为要找到正确的文件,您可能还需要进行数据库搜索.只需在字段中存储您需要的内容并直接请求它.数据库中没有200K行.
注意网站的"蜘蛛"规则,如果他们提供API来获取数据,那么使用它,而不是抓取.