【问题标题】:What are some good Ruby-based web crawlers? [closed]有哪些好的基于 Ruby 的网络爬虫? [关闭]
【发布时间】:2011-06-26 06:24:01
【问题描述】:

我正在考虑自己编写,但我想知道是否有任何用 Ruby 编写的优秀网络爬虫。

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

【问题讨论】:

标签: ruby web-crawler


【解决方案1】:

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

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

  1. 正在下载网站。
  2. 在该网站中定位 URL,但请过滤掉。
  3. 对于该网站中的每个 URL,重复步骤 1。

哦,这似乎是“Web crawler in ruby”的副本。

【讨论】:

  • 是的,处理这些是优化问题。 :) 其中一些问题将由一个好的 http 库处理,其中一些问题将变得无关紧要,具体取决于您想要使用爬虫的目的。问题:如果网址被损坏、混淆或其他原因,您应该抓取它吗?
  • 哈。像很多事情一样,理论上很容易,但实际上非常棘手。我们编写了一个爬虫,我想到了一些问题:错误或无效的 URL、错误/无效的基本 href、javascript 和 ajax 加载的内容、iframe 和嵌套的 iframe、大量的文件类型(以及一种文件类型与另一种扩展名?),压缩资产,正确规范化 URL,使用不同 URL 重复删除相同页面,爬虫陷阱,不一致的大小写敏感性,列表还在继续,数以百万计的边缘情况。您抓取的每个网站都会发现新的东西
  • “您抓取的每个网站都会发现新的东西”,尤其是有很多人不注意规范。
  • @Arafangion,“如果网址被损坏、混淆或其他原因,您应该抓取它吗?”没有人可以为您回答这个问题,这取决于您的需求。
  • @the Tin Man:这就是我问的原因。 :)
【解决方案2】:

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

它仍处于早期阶段,但已经具备基本功能。很快就会添加更多内容。

【讨论】:

  • 这非常酷。感谢您发布它。会去看看的。
  • 费利佩,袋熊看起来真的很有趣!也就是说,如果一个工具不抓取网络上的链接,那么说一个工具执行web crawling 是不公平的。从网络中提取信息的更好术语是web scraping——在我看来,袋熊就是这样做的。
  • @DavidJames 感谢您的澄清。事实上,在为它选择正确的术语(刮擦或爬行)时,我一直在怀疑。你说的有道理。不过,我计划在未来让它更像“爬虫”,允许它跟踪链接等。不过,感谢您的反馈! :)
【解决方案3】:

我曾经为我的工作编写蜘蛛、页面抓取工具和站点分析器,现在仍然会定期编写它们来解决一些我得到的痒。

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

  • Nokogiri 是我对 HTML 解析器的第一选择。我曾经使用 Hpricot,但发现一些网站让它在火焰中爆炸。之后我切换到 Nokogiri 并且对此非常满意。我经常使用它来解析 HTML、RDF/RSS/Atom 和 XML。 Ox 看起来也很有趣,所以这可能是另一个候选者,尽管我发现搜索 DOM 比尝试遍历大哈希(例如 Ox 返回的内容)容易得多。

  • OpenURI 作为一个简单的 HTTP 客户端很不错,但是当您想做更复杂的事情或需要同时触发多个请求时,它可能会妨碍您。我建议查看HTTPClientTyphoeus with Hydra 以获得中等到重量级的工作。 Curb 也不错,因为它使用 cURL 库,但界面对我来说不是那么直观。不过值得一看。 HTTPclient 也值得一看,但我倾向于前面提到的那些。

    注意:OpenURI 存在一些缺陷和漏洞,可能会影响毫无戒心的程序员,因此它在某种程度上已经失宠。 RestClient 是非常值得的接班人。

  • 您需要一个后备数据库,以及与之对话的某种方式。这不是 Rails 本身的任务,但您可以使用与 Rails 分离的 ActiveRecord 与数据库通信。我已经这样做了几次,效果很好。相反,我真的很喜欢 Sequel 我的 ORM。它在如何让您与数据库对话方面非常灵活,从使用直接 SQL 到使用 Sequel 以编程方式构建查询的能力,再到对数据库进行建模和使用迁移。建立数据库后,您可以使用 Rails 作为数据的前端。

  • 如果您要以任何方式浏览网站,而不是简单地抓取页面和跟踪链接,您将需要查看Mechanize。它使填写表格和提交页面变得容易。作为额外的奖励,您可以将页面内容作为 Nokogiri HTML 文档获取,然后使用 Nokogiri 的众多技巧进行解析。

  • 我非常喜欢Addressable::URI 的按摩/修改网址。它比内置的 URI 模块功能更全面。 URI 做的一件好事是它有URI#extract 方法来扫描字符串中的URL。如果该字符串恰好是网页的正文,它将是定位链接的另一种方法,但它的缺点是您还将获得指向图像、视频、广告等的链接,并且您必须过滤这些出来,可能会比使用解析器并专门查找 <a> 标记需要更多的工作。就此而言,Mechanize 也有 links 方法,它返回页面中的所有链接,但您仍然需要过滤它们以确定您是要关注还是忽略它们。

  • 如果您认为您需要处理 Javascript 操作的页面,或从 AJAX 动态获取其内容的页面,您应该考虑使用 WATIR 变体之一。不同操作系统上的不同浏览器有不同的风格,例如 Firewatir、Safariwatir 和 Operawatir,因此您必须弄清楚哪些适合您。

  • 您确实希望将要访问的 URL 列表或已访问的 URL 保存在内存中。设计一个数据库模式并将该信息存储在那里。花一些时间预先设计架构,考虑在收集网站上的链接时您想知道什么。 SQLite3、MySQL 和 Postgres 都是很好的选择,这取决于您认为您的数据库需要有多大。我的一个站点分析器是定制的,旨在帮助我们为财富 50 强公司推荐 SEO 更改。在我们获得足够的数据并停止它之前,它运行了三周多,覆盖了大约 20 个不同的站点。想象一下,如果我们停电并且所有数据都进入位桶会发生什么。

毕竟,您还想让您的代码了解适当的爬虫礼仪:What are the key considerations when creating a web crawler?

【讨论】:

  • 精彩的答案!我认为 Hpricot 现在已经过时了,所以我总是用 Nokogiri 代替。
  • 我觉得Hpricot是维护的,或者是我最后一次看,但我还是更喜欢和推荐Nokogiri。 Ox 也很有趣,所以可能值得一看。
【解决方案4】:

Tin Man 的综合list 不错,但对我来说有些过时了。

我的客户处理的大多数网站都严重依赖 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 密集型网络浏览器。

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

【讨论】:

    【解决方案5】:

    所以你想要一个好的基于 Ruby 的web crawler

    试试spideranemone。根据 RubyGems 下载计数,两者都有可靠的使用情况。

    到目前为止,其他答案详细有帮助,但他们没有像激光一样关注这个问题,它要求用于网络的 ruby​​ 库抓取工具。似乎这种区别会变得混乱:参见my answer to "Crawling vs. Web-Scraping?"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多