如何在Ruby中抓取,解析和爬网文件?

时间:2011-10-06 01:19:52

标签: ruby parsing web-crawler

我有一些数据文件需要处理,数据仓库的格式如下:

: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。冲洗并重复。

我认为我必须缺少一些lib,那些具有更多经验的人会用来清理/加快这个过程,并使脚本更灵活,可以在其他数据集上重复使用。

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

对于简单来说,或许是更好的方法或库的任何输入?

3 个答案:

答案 0 :(得分: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有真正的Web爬虫宝石,但基本任务非常简单,我从不打扰它们。如果您想查看其他替代方案,请访问右侧的一些链接,以获取有关该主题的其他问题。

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

最后,虽然在一些评论中推荐的ActiveRecord很不错,但在Rails之外查找使用它的文档可能很困难或令人困惑。我建议使用Sequel。这是一个伟大的ORM,非常灵活,并且有很好的文档记录。

答案 1 :(得分:2)

您的问题主要关注“低级”细节 - 解析URL等等。 “Ruby Way”的一个关键方面是“不要重新发明轮子”。利用现有的图书馆。 :)

我的推荐?首先,利用spideranemone等抓取工具。其次,使用Nokogiri进行HTML / XML解析。第三,存储结果。我推荐这个,因为你以后可能会做不同的分析,你不想丢掉你的蜘蛛的辛勤工作。

在不了解您的约束的情况下,我会考虑将结果存储在MongoDB中。想到这个之后,我做了一个快速搜索,找到了一个很好的教程Scraping a blog with Anemone and MongoDB

答案 2 :(得分:1)

嗨,我首先要仔细研究名为Mechanize的宝石,然后再开启任何基本的开放式东西 - 因为它构建成机械化。它是一个出色,快速且易于使用的宝石,用于自动化网络爬行。由于您的数据格式非常奇怪(至少与json,xml或html相比),我认为您不会使用内置解析器 - 但您仍然可以看一下它。它被称为nokogiri,也非常聪明。但是在最后,在抓取和获取资源之后,你可能不得不使用一些很好的旧正则表达式的东西。

祝你好运!