使用Ruby on Rails进行高性能RSS / Atom解析

时间:2009-02-14 13:36:53

标签: ruby-on-rails ruby

我需要解析成千上万的Feed,而性能是必不可少的要求。你有什么建议吗?

提前致谢!

5 个答案:

答案 0 :(得分:10)

我没有尝试过,但最近我读到了Feedzirra(它声称是为了提高性能): -

  

Feedzirra是一个饲料库   旨在获取和更新许多供稿   尽快。这包括   通过使用libcurl-multi   taf2-curb gem获得更快的http获取,   和libxml通过nokogiri和   sax-machine用于更快的解析。

答案 1 :(得分:3)

您可以使用RFeedParser,一个(着名的)Python Universal FeedParser的Ruby端口。它基于Hpricot,它非常快速且易于使用。

http://rfeedparser.rubyforge.org/

一个例子:

require 'rubygems'
require 'rfeedparser'
require 'open-uri'

feed = FeedParser::parse(open('http://feeds.feedburner.com/engadget'))

feed.entries.each do |entry|
  puts entry.title
end

答案 2 :(得分:1)

当你拥有的只是一把锤子时,一切看起来都像钉子。考虑一下Ruby以外的解决方案。虽然我喜欢Ruby和Rails,并且不愿意将它们用于Web开发或者可能用于特定于域的语言,但我更喜欢用Java描述的类型的大量数据提升,或者Python或者甚至是C ++。

鉴于此解析数据的目标可能是数据库,它可以充当解决方案的Rails部分与其他语言部分之间的公共点。然后,您将使用最好的工具来解决每个问题,结果可能更容易处理并真正满足您的要求。

如果速度确实是最重要的,那么为什么要在那里添加一个额外的约束并说“哦,只要我使用Ruby就只有它的本质。”

答案 3 :(得分:0)

不确定效果,但在Parsing Atom & RSS in Ruby/Rails?

上回答了类似的问题

您也可以查看Hpricot,它解析XML但假设它格式正确并且不进行任何验证。

http://wiki.github.com/why/hpricot http://wiki.github.com/why/hpricot/hpricot-xml

答案 4 :(得分:0)

最初我使用nokogiri进行一些基本的xml解析,但它很慢且不稳定(有时)我切换到feedzirra并且不仅有很好的性能提升,没有错误而且很容易作为馅饼。 示例如下所示

# fetching a single feed
feed = Feedzirra::Feed.fetch_and_parse("http://feeds.feedburner.com/PaulDixExplainsNothing")

# feed and entries accessors
feed.title          # => "Paul Dix Explains Nothing"
feed.url            # => "http://www.pauldix.net"
feed.feed_url       # => "http://feeds.feedburner.com/PaulDixExplainsNothing"
feed.etag           # => "GunxqnEP4NeYhrqq9TyVKTuDnh0"
feed.last_modified  # => Sat Jan 31 17:58:16 -0500 2009 # it's a Time object

entry = feed.entries.first
entry.title      # => "Ruby Http Client Library Performance"
entry.url        # => "http://www.pauldix.net/2009/01/ruby-http-client-library-performance.html"
entry.author     # => "Paul Dix"
entry.summary    # => "..."
entry.content    # => "..."
entry.published  # => Thu Jan 29 17:00:19 UTC 2009 # it's a Time object
entry.categories # => ["...", "..."]

如果您想对Feed进行更多操作,例如解析它们,则以下内容就足够了

source = Feedzirra::Feed.fetch_and_parse(http://www.feed-url-you-want-to-play-with.com)
  puts "Parsing Downloaded XML....\n\n\n"

  source.entries.each do |entry|

    begin
      puts "#{entry.summary} \n\n"
      cleanURL = (entry.url).gsub("+","%2B")  #my own sanitization process, ignore
      scrapArticleWithURL(cleanURL)
  rescue
    puts "(****)there has been an error fetching (#{entry.title}) \n\n"
  end