Skip to content
7月 15 / rakkyoo

rubyでRSS情報取得(自分用のRSS readerもどきの作成)

ブログやニュースなどの記事を巡回して,記事のタイトルなどを取得する方法として,

上記のように検討してきたのですが,とりあえず形にしてみました.
といっても,結果をHTMLに出力するようにしただけですが,,,
かなり素人らしいソースになっているような気もするのですが,とりあえずの目的が達成できているので一安心です.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# -*- coding: utf-8 -*-
# make_rss.rb
require 'kconv'
require 'feed-normalizer'
require 'date'
 
class Rss_get
  def initialize(url_hash)
    @url_hash = url_hash
    @rss_title = Hash.new()
    @rss_description = Hash.new()
    @rss_link = Hash.new()
    @rss_blog_title = Hash.new()
  end
 
  def url_split
    @url_hash.each do |rss_url, blog_title|
      read_rss([rss_url, blog_title])
    end
  end
 
  def read_rss(rss_url)
    begin
      rss = FeedNormalizer::FeedNormalizer.parse(open(rss_url[0]))
      rss.entries
    rescue
      day = Time.now
      # リンク切れなどで、サイトが参照できない時用
      @rss_title[day] = "not found"
      @rss_description[day] = "#{rss_url[0]}"
      @rss_link[day] = "not found"
      @rss_blog_title[day] = "not found"
    else
        rss.entries.map do |item|
          @rss_title[item.date_published] = item.title
          @rss_description[item.date_published] = item.description
          @rss_link[item.date_published] = item.url
          @rss_blog_title[item.date_published] = rss_url[1]
      end
    end
 
  end
 
  def make_html(out_html_file)
    File.open(out_html_file,"w") do |out_f|
      out_f.puts('<!DOCTYPE html>')
      out_f.puts('<html lang="ja">')
      out_f.puts('<head>')
      out_f.puts('<meta charset="UTF-8">')
      out_f.puts('<title>rss結果</title>')
      out_f.puts('</head>')
      out_f.puts('<body>')
      out_f.puts('<h1>')
      out_f.puts("#{out_html_file}")
      out_f.puts('</h1>')
      out_f.puts('<script>')
      out_f.puts('</script>')
 
      @rss_title.sort.reverse.each do |temp|
        out_f.print(temp[0].strftime("%B %d %X"))
        out_f.print("  -- #{@rss_blog_title[temp[0]]}")
        out_f.puts('<br>')
        out_f.print('<a href = "')
        out_f.print(@rss_link[temp[0]])
        out_f.print('">')
        out_f.print(@rss_title[temp[0]])
        out_f.print('</a><br>')
        out_f.puts(@rss_description[temp[0]])
        out_f.puts('<br><br>')
      end
      out_f.puts('</body>')
      out_f.puts('</html>')
    end
  end
end
 
begin
  # webに繋がっているかどうかをgoogleに接続してみてチェック
  rss = FeedNormalizer::FeedNormalizer.parse(open("http://www.google.co.jp/"))
rescue
  # webに繋がっていない状態を回避
else
  # rss用のURLに自分でわかりやすいサイト名をハッシュに登録
  url_hash = { 
    "http://b.hatena.ne.jp/search/tag?q=emacs&mode=rss" => "hatena emacs",
    "http://b.hatena.ne.jp/hotentry.rss" => "hatena人気エントリー",
    "http://rss.itmedia.co.jp/rss/1.0/topstory.xml" => "IT Media",
    "http://netafull.net/index.rdf" => "ネタフル",
    "http://gigazine.net/index.php?/news/rss_2.0/" => "Gigazine",
    "http://blog.livedoor.jp/dankogai/index.rdf" => "404 blog not found",
    "http://slashdot.jp/slashdotjp.rss" => "スラッシュドット",
  }
  b = Rss_get.new(url_hash)
  b.url_split
  b.make_html("rss_result.html")

これでとりあえず取得するには,

1
$ ruby make_rss.rb

とするだけです.
取得したものを確認するには,「w3m」が入っている場合は,

1
$ w3m rss_result.html

とすれば,確認できて快適でした♪

なお,以下のようにして,巡回してからブラウザで確認したり,

1
$ ruby make_rss.rb && open rss_result.html

cronに登録して,巡回させたりしています.
cronへの登録は簡単で,

1
$ crontab -e

としてから,(ソースファイルが「/Users/rakkyoo/Script/make_rss.rb」にある場合)

1
*/15 * * * * /opt/local/bin/ruby1.9 /Users/rakkyoo/Script/make_rss.rb

と登録して,15分に1回取得してきたりさせています.

初心者でも,やりたいことがなんとかなってしまうのが,rubyのすごさですね.

[`twib` not found]

Leave a comment

CAPTCHA


This blog is kept spam free by WP-SpamFree.