什么是一些优秀的基于Ruby的Web爬虫?

我正在寻找自己的写作,但我想知道是否有任何用Ruby编写的好的网络爬虫。

如果没有一个完整的网络爬虫,任何可能有助于构建网络爬虫的gem都会很有用。 我知道这个问题的一部分在几个地方都有提及,但适用于构建网络爬虫的gem列表也是一个很好的资源。

我正在构建wombat,一个Ruby DSL来抓取网页并提取内容。 在github上查看它https://github.com/felipecsl/wombat

它仍处于早期阶段,但已经具备基本function。 很快就会添加更多东西。

我曾经为我的工作编写蜘蛛,页面刮刀和网站分析器,并且还会定期编写它们来解决我得到的一些问题。

Ruby有一些优秀的gem可以让它变得简单:

  • Nokogiri是HTML解析器的第一选择。 我曾经使用Hpricot,但发现一些网站让它在火焰中爆炸。 之后我转向Nokogiri,并对此非常满意。 我经常用它来解析HTML,RDF / RSS / Atom和XML。 Ox看起来也很有趣,所以这可能是另一个候选者,尽管我发现搜索DOM比尝试遍历大哈希要容易得多,例如Ox返回的内容。
  • OpenURI作为一个简单的HTTP客户端很好,但是当你想要做更复杂的事情或需要同时触发多个请求时,它可能会受到阻碍。 我建议使用Hydra来查看HTTPClient或Typhoeus,以获得适度到重量级的工作。 Curb也很好,因为它使用了cURL库,但界面对我来说不那么直观。 值得关注一下。 HTTPclient也值得一看,但我倾向于前面提到的那些。

    注意:OpenURI有一些缺陷和漏洞可能会影响毫无戒心的程序员,所以它有点不受欢迎。 RestClient是一个非常有价值的继任者。

  • 您需要一个支持数据库,以及与之交谈的某种方式。 这不是Rails本身的任务,但您可以使用与Rails分离的ActiveRecord与数据库通信。 我已经做了几次,它可以正常工作。 相反,我真的很喜欢Sequel的ORM。 它非常灵活,可以让您与数据库进行通信,从使用直接SQL到使用Sequel以编程方式构建查询,建模数据库和使用迁移的能力。 一旦构建了数据库,就可以使用Rails充当数据的前端。
  • 如果您要以任何方式浏览网站,而不仅仅是抓取页面和关注链接,那么您将需要查看Mechanize 。 它可以轻松填写​​表单和提交页面。 作为额外的奖励,您可以将页面内容作为Nokogiri HTML文档获取,并使用Nokogiri的众多技巧进行解析。
  • 对于按摩/修改URL我真的很喜欢Addressable :: URI 。 它比内置的URI模块function更全面。 URI做得很好的一件事就是它有URI#extract方法来扫描字符串中的URL。 如果该字符串恰好是网页的主体,那么它将是查找链接的另一种方式,但它的缺点是你还会获得图像,video,广告等的链接,你必须过滤那些out,可能导致比使用解析器并专门查找标签更多的工作。 就此而言,Mechanize还具有返回页面中所有链接的links方法,但您仍需要对其进行过滤以确定是要跟踪还是忽略它们。
  • 如果您认为您需要处理Javascript操作页面或从AJAX动态获取其内容的页面,您应该考虑使用其中一个WATIR变体。 不同操作系统上的不同浏览器有各种风格,例如Firewatir,Safariwatir和Operawatir,所以你必须弄清楚什么对你有用。
  • 希望依赖于在内存中保留要访问的URL列表或访问过的URL。 设计数据库模式并在那里存储该信息。 花一些时间预先设计模式,考虑在网站上收集链接时您想要了解的内容。 SQLite3,MySQL和Postgres都是很好的选择,取决于您认为数据库需求有多大。 我的一个网站分析器是专门为帮助我们推荐财富50强公司的SEO变更而设计的。 它运行了三个多星期,覆盖了大约20个不同的站点,然后我们才有足够的数据并停止了它。 想象一下,如果我们停电并且所有数据都在位桶中会发生什么。

毕竟,您还需要让您的代码了解正确的蜘蛛礼仪: 创建网络爬虫时的关键考虑因素是什么?

所以你想要一个好的基于Ruby的网络爬虫 ?

尝试蜘蛛或海葵 。 根据RubyGems下载计数,两者都有可靠的用法。

到目前为止,其他答案都是详细有用的,但是他们没有像激光一样专注于这个问题,它要求网页抓取工具使用ruby库。 看起来这种区别可能会变得混乱:请参阅我对“爬网与网络刮痧?”的回答。

Tin Man的综合名单很好,但对我来说已经过时了。

我的客户处理的大多数网站都依赖于AJAX / Javascript。 我一直在使用Watir / watir-webdriver / selenium几年,但是在后端加载一个隐藏的Web浏览器来渲染DOM的东西的开销是不可行的,更不用说所有这些了他们仍然没有实现一个可用的“浏览器会话重用”,让新代码执行重用内存中的旧浏览器来实现此目的,最终拍下可能最终在API层上运行的票证。 (参见https://code.google.com/p/selenium/issues/detail?id=18 ) **

https://rubygems.org/gems/phantomjs

正是我们正在将新项目迁移到现在,以便在没有任何不可见的Xvfb内存和CPU重的Web浏览器的情况下渲染必要的数据。

**替代方法也未能成功:

  • 如何使用TCPServer序列化对象?
  • watir浏览器对象可以在以后的Ruby进程中重用吗?

如果您不想自己编写,请使用任何普通的Web爬网程序。 那里有几十个。

如果你想写自己的,那就写自己的。 网络爬虫不是一项复杂的活动,它包括:

  1. 下载网站。
  2. 找到该网站中的url,过滤但请你好好的。
  3. 对于该网站中的每个URL,请重复步骤1。

哦,这似乎是“ ruby中的Web爬虫 ”的重复。