我需要解析成千上万的Feed,而性能是必不可少的要求。你有什么建议吗?
提前致谢!
答案 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