dshimizu/blog

アルファ版

RubyのFeedライブラリ"Feedzirra"でFeedの情報を取得してみる

はじめに

Railsの勉強のため、簡単なRSSリーダーを作ってみて、その中で利用しているFeed取得・解析用のRubyライブラリ"Feedzirra"というものについて、基本的な使い方等を簡単なメモとして記載しておきます。

feedzirra

Feed取得・解析用のRubyライブラリです。
詳しい説明はREADMEを読んでいただくのが早いと思います。使い方のサンプルなども載ってます。

環境

実行環境は以下です。

OS CentOS 6.4 x86_64 (カーネルバージョン 2.6.32-358.18.1)
Ruby バージョン 2.0.0p195 (2013-05-14 revision 40734) [x86_64-linux]
Feedzirra バージョン 0.2.2
インストール

gemコマンドでインストールできます。


$ gem search feedzirra
サンプルプログラム

試しに実行して、いくつかのデータを取得してみます。
FeedzirraはFeedのURLを解析するため、逐一対象WebサイトのFeedのURLを自分で調べるのは手間なので、Nokogiriを利用してWebサイトのURLからそのWebサイトのFeedのURLを取得して、それを解析するようにします。

記事のデータ取得に関しては、Webサイト側で配信されている順に配列で取得されます。
ニュースサイト等は必ずしも公開時間順になっている訳ではないようで、収集データを時系列で管理する場合は取得後に並び変える必要がありました(以下では特に記載してません)。


#!/usr/bin/env ruby

require 'open-uri'
require 'nokogiri'
require 'rss'
require 'feedzirra'


### 引数で受けとったWEBサイトのURLをnokogiriで解析してFeedのURLを取得
filename = ARGV[0]
doc = Nokogiri::HTML(open(filename),nil,'utf-8')
doc.css('link').each do |link|

if link['type'] == 'application/rss+xml' && link['rel'] == 'alternate'
href = link['href']
@feed_url = URI.join(filename, href)

elsif link['type'] == 'application/atom+xml' && link['rel'] == 'alternate'
href = link['href']
@feed_url = URI.join(filename, href)

end
end

### FeedのURLをFeedzirraで取得・解析
feed = Feedzirra::Feed.fetch_and_parse "#{@feed_url}"

### データ取得例
### 対象サイトのURL取得
p "url: #{feed.url}"
### 対象サイトのFeed用URL取得
p "feed_url: #{feed.feed_url}"
### 対象サイトの最終更新日取得
p "last_modified: #{feed.last_modified}"

### 全記事を取得(配列で取得される)
p "ALL articles: #{feed.entries[0]}"
### 最初の記事の公開日を取得
p "The first article 'title': #{feed.entries[0].title}"
### 2番目の記事の公開日を取得
p "The second article 'published': #{feed.entries[1].published}"
実行

本ブログを対象に実行してみました。


$ ruby feedzirra-test.rb http://kanjuku-tomato.blogspot.com

実行結果


"url: http://kanjuku-tomato.blogspot.com/"
"feed_url: http://kanjuku-tomato.blogspot.com/feeds/posts/default?alt=rss"
"last_modified: 2013-11-17 13:55:23 +0900"
"ALL articles: [#<Feedzirra::Parser::RSSEntry:0x007fb4d607c910 @entry_id=\"tag:blogger.com,1999:blog-522146242299075566.post-5854226855805152372\", @published=2013-10-05 10:51:00 UTC, @categories=[\"FreeBSD\", \"さくらのVPS\"], @title=\"FreeBSD 9.1-RELEASEをFreeBSD 9.2-RELEASEへアップグレード\", @summary=\"<
...(略)...
致します。

\", @url=\"http://kanjuku-tomato.blogspot.com/2013/01/blog-post.html\", @author=\"noreply@blogger.com (dshim)\">]"
"The first article 'title': FreeBSD 9.1-RELEASEをFreeBSD 9.2-RELEASEへアップグレード"
"The second article 'published': 2013-09-15 08:52:00 UTC"

おわりに

Feed取得用のRuny Gemは他にも以下のようなものがあるようです。

どのような違いがあるのか使って比較してないのでわかりませんが、現状ではFeedzirraはGithubリポジトリ上の更新も頻繁に行われているようなので、Feedzirraを使ってみてます。取得したデータをDBに格納するようにして、RailsでFeed Readerを作ってます。

参考