我有一些数据文件需要处理,数据仓库的格式如下:
: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,那些具有更多经验的人会用来清理/加快这个过程,并使脚本更灵活,可以在其他数据集上重复使用。
此外,我将绘制和可视化此数据以及生成报告,因此也许应该考虑这一点。
对于简单来说,或许是更好的方法或库的任何输入?
答案 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”的一个关键方面是“不要重新发明轮子”。利用现有的图书馆。 :)
我的推荐?首先,利用spider或anemone等抓取工具。其次,使用Nokogiri进行HTML / XML解析。第三,存储结果。我推荐这个,因为你以后可能会做不同的分析,你不想丢掉你的蜘蛛的辛勤工作。
在不了解您的约束的情况下,我会考虑将结果存储在MongoDB中。想到这个之后,我做了一个快速搜索,找到了一个很好的教程Scraping a blog with Anemone and MongoDB。
答案 2 :(得分:1)