【问题标题】:How can I scrape, parse and crawl files in Ruby?如何在 Ruby 中抓取、解析和抓取文件?
【发布时间】:2011-10-06 01:19:52
【问题描述】:

我有许多来自数据仓库的数据文件要处理,格式如下:

:header 1 ...
:header n
# remarks 1 ...
# remarks n
# column header 1
# column header 2
DATA ROWS
(Example: "#### ## ## #####   ########  ####### ###afp##      ##e###")

数据由空格分隔,同时包含数字和其他 ASCII 字符。其中一些数据将被拆分并变得更有意义。

所有数据都将进入一个数据库,最初是一个用于开发的 SQLite 数据库,然后推送到另一个更永久的存储。

这些文件实际上是通过 HTTP 从远程服务器拉入的,由于它们跨越文件夹和许多文件,所以我将不得不爬一点来获取其中的一些。

我希望得到一些输入,什么是最好的工具和方法可以以“Ruby 方式”完成此任务,并抽象出其中的一些内容。否则,我可能会像在 Perl 或我以前采用的其他此类方法中那样处理它。

我正在考虑使用OpenURI 打开每个网址,然后如果输入是 HTML,则收集要抓取的链接,否则处理数据。我每次都会使用String.scan 将文件适当地分解为一个多维数组,根据数据提供者建立的格式解析每个组件。完成后,将数据推送到数据库中。继续下一个输入文件/uri。冲洗并重复。

我想我一定遗漏了一些库,那些有更多经验的人会使用这些库来显着清理/加快这个过程,并使脚本更加灵活,以便在其他数据集上重用。

此外,我将绘制和可视化这些数据以及生成报告,所以也许也应该考虑这一点。

关于可能是更好的方法或库的任何输入?

【问题讨论】:

  • 您可以使用“#### ## ##”.split(/\s+/) 之类的内容拆分行,并且您可能希望活动记录来执行数据库插入
  • 好点,我想你在 ActiveRecord 上很合适。

标签: ruby parsing web-crawler


【解决方案1】:

您的问题主要集中在“低级”细节上——解析 URL 等等。 “Ruby Way”的一个关键方面是“不要重新发明轮子”。利用现有的库。 :)

我的建议?首先,利用诸如spideranemone 之类的爬虫。其次,使用Nokogiri 进行HTML/XML 解析。第三,存储结果。我建议您这样做,因为您以后可能会进行不同的分析,并且您不想丢掉爬虫的辛勤工作。

在不太了解您的限制条件的情况下,我会考虑将您的结果存储在 MongoDB 中。想到这里,我快速搜索了一下,找到了一个不错的教程Scraping a blog with Anemone and MongoDB

【讨论】:

    【解决方案2】:

    我可能已经编写了 bajillion 蜘蛛和站点分析器,并发现 Ruby 有一些不错的工具可以让这个过程变得简单。

    OpenURI 使检索页面变得容易。

    URI.extract 可以轻松找到页面中的链接。来自文档:

    说明

    从字符串中提取 URI。如果给出块,则遍历所有匹配的 URI。如果给定块或匹配的数组,则返回 nil。

      require "uri"
    
      URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
      # => ["http://foo.example.com/bla", "mailto:test@example.com"]
    

    简单、未经测试的开始逻辑可能如下所示:

    require "openuri"
    require "uri"
    
    urls_to_scan = %w[
      http://www.example.com/page1
      http://www.example.com/page2
    ]
    
    loop do
      break if urls_to_scan.empty?
      url = urls_to_scan.shift
      html = open(url).read
    
      # you probably want to do something to make sure the URLs are not
      # pointing outside the site you're walking.
      #
      # Something like:
      # 
      #     URI.extract(html).select{ |u| u[%r{^http://www\.example\.com}i] }
      #
      new_urls = URI.extract(html)
    
      if (new_urls.any?)
        urls_to_scan += new_urls
      else
        ; # parse your file as data using the content in html
      end
    end
    

    除非您拥有要抓取的网站,否则您希望保持友善和温和:不要尽可能快地运行,因为它不是您的管道。注意网站的robot.txt 文件,否则有被封禁的风险。

    有真正的 Ruby 网络爬虫 gem,但基本任务非常简单,我从不理会它们。如果您想查看其他替代方案,请访问右侧的一些链接,了解涉及此主题的其他 SO 问题。

    如果您需要更多功能或灵活性,Nokogiri gem 可以简化 HTML 解析工作,允许您使用 CSS 访问器来搜索感兴趣的标签。有一些非常强大的 gem 可以让抓取页面变得容易,例如 typhoeus

    最后,虽然某些 cmets 中推荐的 ActiveRecord 很好,但在 Rails 之外查找使用它的文档可能会很困难或令人困惑。我推荐使用Sequel。这是一个很棒的 ORM,非常灵活,并且有据可查。

    【讨论】:

    • 由于这是进入 Rails 应用程序,最终将其滚动到 AR 与 Sequel 上更容易。无论如何,它必须每隔 x 分钟从 heroku 上的数据库中拉出,所以在拉取之前同时推入就可以了,所以它正在解决。非常感谢。
    【解决方案3】:

    您好,在启动任何基本的 open-uri 内容之前,我将首先仔细查看名为 Mechanize 的 gem - 因为它已内置于机械化中。它是一款出色、快速且易于使用的 gem,用于自动进行网络爬取。由于您的数据格式非常奇怪(至少与 json、xml 或 html 相比),我认为您不会使用内置解析器 - 但您仍然可以查看它。它被称为nokogiri,也非常聪明。但在最后,在爬取和获取资源之后,您可能不得不使用一些好的旧正则表达式的东西。

    祝你好运!

    【讨论】:

    • 对。我最终在许多情况下使用了 nokogiri,但是这个特殊的情况只是在字符串处理中使用正则表达式解析文档的问题。我可能很快就会搬到机械化。我已经关注了很多,但只是开始了另一条路径,并且对于迄今为止处理的约 1000 万个条目来说效果很好。
    • 太棒了! :-) Mechanize 实际上只是一个非常简单的库,用于填写表单、单击链接和发出请求 - nokgiri 在幕后为它提供动力,因此对您来说深入研究不会那么具有挑战性。
    • mechanize 当然可以提供帮助,但它并非旨在帮助您进行网络抓取的实际过程
    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多