Высокопроизводительный анализ RSS / Atom с помощью Ruby on Rails - PullRequest
7 голосов
/ 14 февраля 2009

Мне нужно проанализировать тысячи каналов, и производительность является обязательным требованием. У вас есть предложения?

Заранее спасибо!

Ответы [ 5 ]

10 голосов
/ 14 февраля 2009

Я не пробовал, но недавно прочитал о Feedzirra (утверждается, что он создан для производительности): -

Feedzirra - это библиотека каналов, которая предназначен для получения и обновления многих каналов как можно быстрее. Это включает используя libcurl-multi через таф2-бордюрный камень для быстрого http получает, и libxml через нокогири и саксофон для более быстрого разбора.

3 голосов
/ 14 февраля 2009

Вы можете использовать RFeedParser, Ruby-порт (известного) Python Universal FeedParser. Он основан на 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
1 голос
/ 15 февраля 2009

Когда у вас есть только молоток, все выглядит как гвоздь. Рассмотрим для этого решение, отличное от Ruby. Хотя я люблю Ruby и Rails и не буду расставаться с ними для веб-разработки или, возможно, для языка, специфичного для предметной области, я предпочитаю тяжелый перенос данных того типа, который вы описываете, выполняемый в Java, или, возможно, Python или даже C ++.

Учитывая, что местом назначения этих проанализированных данных, скорее всего, является база данных, он может выступать в качестве точки соприкосновения между частью Rails вашего решения и частью другого языка. Тогда вы используете лучший инструмент для решения каждой из ваших проблем, и результат, вероятно, будет проще для работы и действительно соответствует вашим требованиям.

Если скорость действительно важна, зачем добавлять туда дополнительное ограничение и говорить: «О, это важно только до тех пор, пока я использую Ruby».

0 голосов
/ 10 марта 2012

Первоначально я использовал 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 # => ["...", "..."]

если вы хотите сделать больше с фидами, например, проанализировать их, вам будет достаточно

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
0 голосов
/ 14 февраля 2009

Не уверен насчет производительности, но на аналогичный вопрос был дан ответ на Парсинг Atom и RSS в Ruby / Rails?

Вы также можете заглянуть в Hpricot, который анализирует XML, но предполагает, что он правильно сформирован и не выполняет никакой проверки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...