看看使用Typhoeus 和 Hydra。它们将使并行处理 URL 变得容易。
您不需要使用 Mechanize,除非您必须从每个页面请求特殊数据。对于普通的爬虫,您可以使用 Open::URI 和 Nokogiri 抓取主体并解析它,而无需 Mechanize 的开销或附加功能。出于您的目的,将 Typhoeus 替换为 Open::URI 并让 Hydra 处理线程管理。
请记住,如果您尝试一次全部完成,爬取 200k 个网站将会使您的带宽饱和。这将使您的 Rails 站点不可用,因此您需要限制您的请求。而且,这意味着您将不得不在几个(或多个)小时内完成它们。速度并不像在此处保持您的网站在线那么重要。我可能会将爬虫放在与 Rails 服务器不同的机器上,并让数据库将所有东西联系在一起。
创建一个表或文件,其中包含您要抓取的网站 URL。我推荐这个表格,这样您就可以整理一个表格来编辑/管理 URL。您需要跟踪以下内容:
- 上次抓取 URL 的时间。(约会时间)
- 是否应抓取特定 URL(布尔值或字符1)
- URL(字符串或 var char[1024] 应该没问题)。这应该是唯一的键。
- 当前是否正在抓取该 URL(布尔值或字符1)。这在所有记录的运行开始时被清除,然后在蜘蛛加载该页面时设置并离开。
- 显示什么时候可以运行该站点的字段。
- 显示可以运行该站点的时间的字段。
最后两个很重要。您不想抓取一个功率不足的小站点并终止其连接。这是被禁止的好方法。
创建另一个表作为下一个 URL,以检查从您在爬网时遇到的链接收集的特定站点。您需要提出一个规范化例程,以将带有会话数据和参数的 URL 简化为可用于测试唯一性的东西。在这个新表中,您希望 URL 是唯一的,这样您就不会陷入循环或不断添加具有不同参数的同一页面。
您可能需要注意在任何重定向之后检索到的实际登录 URL,而不是“获取”URL,因为重定向和 DNS 名称在站点内可能会有所不同,并且生成内容的人可能使用不同的主机名。同样,您可能希望在 head 块中查找元重定向并遵循它们。这些是做你想做的事情的一个特别令人讨厌的方面。
当您遇到新的 URL 时,请检查它们是否正在退出 URL,如果您关注它们,这将导致您离开该站点。如果是这样,请不要将它们添加到您的 URL 表中。
将数据库信息写入文件可能无济于事,因为要找到正确的文件,您可能无论如何都需要进行数据库搜索。只需将您需要的内容存储在字段中并直接请求即可。200K 行在数据库中算不了什么。
注意网站的“蜘蛛”规则,如果他们提供 API 来获取数据,请使用它,而不是爬行。