RubyでRSS取得チュートリアル

RubyでRSSを取得するチュートリアルを解説します。

Rubyでスクリプトを作成し、RSS取得を取得・抽出します。

RSSを取得すると様々なデータが取れるようになり、組み合わせることでアプリケーションに応用できます。

チュートリアル概要

クラスメソッドさんが運営しているDevelopers.ioのRSSを取得し出力するスクリプトを作成します。

参考 developers.ioクラスメソッド

準備

まずは準備をしていきましょう!

適当なディレクトリを作成します。(ruby_rssでなくても問題ありません)

$ mkdir ruby_rss

作成したディレクトリに移動

$ cd ruby_rss

rss_practice.rbという名前のRubyファイルを作成

$ touch rss_practice.rb
メモ
Ruby言語の拡張子は.rbです

これで準備は完了です。

RSS取得

それではRSSを取得していきましょう。

rssライブラリ読み込み

RSS取得にはrssという標準ライブラリを使用します。

参考 rssライブラリRubyリファレンスマニュアル
メモ

標準ライブラリとは、Rubyに組み込まれているライブラリです。

require ‘ライブラリ名’ をすることでクラスやメソッドが利用できるようになります。

標準ライブラリと外部のライブラリについては補足説明をしています。

それでは、rss_practice.rbにコードを加えていきましょう。

rssライブラリを読み込んで、classの定義をします。

require 'rss'

class RssPractice
end

取得

Developers.ioのRSSのURLは、https://dev.classmethod.jp/feed/です。

コードを加えます。

require 'rss'
class RssPractice
  RSS_URL = 'https://dev.classmethod.jp/feed/'.freeze

  def get_rss
    rss = parse_rss
    p rss
  end

  private

  def parse_rss
    RSS::Parser.parse(RSS_URL)
  end

end

RssPractice.new.get_rss

RSS::Parser.parse にURLを渡すとparseしてくれます。

実行しましょう。

$ ruby rss_practice.rb

RSSを取得できましたね!

#<RSS::Rss:0x00007ff1b3845948 @parent=nil, @converter=nil, @do_validate=true, @channel=#<RSS::Rss::Channel:0x00007ff1b384e700 @parent=nil, @converter=nil, @do_validate=true, @title="Developers.IO", @link="https://dev.classmethod.jp", @description="クラスメソッド発「やってみた」系技術メディア", @language="ja", @copyright=nil, @managingEditor=nil, @webMaster=nil, @rating=nil, @pubDate=nil, @lastBuildDate=2020-08-09 17:02:15 +0000, @docs=nil, @cloud=nil, @skipDays=nil, @skipHours=nil, @image=nil, @textInput=nil, @generator="https://wordpress.org/?v=5.3.2", @ttl=nil, @itunes_image=nil, @itunes_owner=nil, @itunes_new_feed_url=nil, @itunes_author=nil, @itunes_block=nil, @itunes_explicit=nil, @itunes_keywords=nil, @itunes_subtitle=nil, @itunes_summary=nil, @item=[#<RSS::Rss::Channel::Item:0x00007ff1b3121090 @parent=nil, @converter=nil, @do_validate=true, @title="[cdk8s] CDK で Kubernetes を定義してみる", @link="https://dev.classmethod.jp/articles/typescript/cdk8s-cdk-kubernetes-typescript/", @description="<p><img src=\"https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/08/k8s-eyecatch-640x336.png\" /></p><p>Overview Cloud Development Kit for Kubernetes(または cdk8s)は CDK で Kubernetes リソースの定義を行うためのフレームワークです。cdk8s は 2020 […]</p>", @source=nil, @enclosure=nil, @comments=nil, @author=nil, @pubDate=2020-08-09 13:16:28 +0000, @guid=#<RSS::Rss::Channel::Item::Guid:0x00007ff1b3161ac8 @parent=nil, @converter=nil, @do_validate=true, @isPermaLink=false, @content="https://dev.classmethod.jp/?p=611644">, @content_encoded=nil, @itunes_author=nil, @itunes_block=nil, @itunes_explicit=nil, @itunes_keywords=nil, @itunes_subtitle=nil, @itunes_summary=nil, @itunes_name=nil, @itunes_email=nil, @itunes_duration=nil, @trackback_ping=nil, @category=[#<RSS::Rss::Channel::Item::Category:0x00007ff1b3140620 @parent=nil, @converter=nil, @do_validate=true, @domain=nil, @content="Typescript">, #<RSS::Rss::Channel::Item::Category:0x00007ff1b3152fc8 @parent=nil, @converter=nil, @do_validate=true, @domain=nil, @content="AWS CDK">, #<RSS::Rss::Channel::Item::Category:0x00007ff1b315a480 @parent=nil, @converter=nil, @do_validate=true, @domain=nil, @content="cdk8s">], @dc_title=[], @dc_description=[], @dc_creator=[#<RSS::DublinCoreModel::DublinCoreCreator:0x00007ff1b3138290 @parent=nil, @converter=nil, @do_validate=true, @content="me">], @dc_subject=[], @dc_publisher=[], @dc_contributor=[], @dc_type=[], @dc_format=[], @dc_identifier=[], @dc_source=[], @dc_language=[], @dc_relation=[], @dc_coverage=[], @dc_rights=[], @dc_date=[], @trackback_about=[]>, #<RSS::Rss::Channel::Item:0x00007ff1b3170370 @parent=nil, @converter=nil, @do_validate=true, @title="RDS for SQL Serverか
らS3バケットにアクセスできるようになりました", @link="https://dev.classmethod.jp/articles/rds-sql-server-s3-integration/", @description="<p><img src=\"https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2019/12/sqlserver-640x336.png\" /></p><p>こんにちは。データアナリティクス事業本部の松村です。 2ヶ月以上前の話ですが、RDS for SQL ServerからS3バケットにアクセスができるようになりましたのでご紹介します。この機能は公式ドキュメントではS3との […]</p>"

ここまでで取得が完了です。

取得したデータの抽出

次に取得したデータを抽出していきます。

今回は、タイトルとリンクを抽出して出力してみましょう。

show_dataというメソッドを定義し、ループで回し出力してみましょう。

require 'rss'
class RssPractice
  RSS_URL = 'https://dev.classmethod.jp/feed/'.freeze

  def get_rss
    rss = parse_rss
    rss.items.each do |item|
      show_data(item)
    end
  end

  private

  def parse_rss
    RSS::Parser.parse(RSS_URL)
  end

  def show_data(item)
    puts '--------'
    puts item.title
    puts item.link
  end

end

RssPractice.new.get_rss

それでは実行しましょう。

ruby rss_practice.rb

抽出できていますね!

--------
[cdk8s] CDK で Kubernetes を定義してみる
https://dev.classmethod.jp/articles/typescript/cdk8s-cdk-kubernetes-typescript/
--------
RDS for SQL ServerからS3バケットにアクセスできるようになりました
https://dev.classmethod.jp/articles/rds-sql-server-s3-integration/
--------
[AWS 입문] AWS CLI 에서 S3 + CloudFront 로 Vue.js 웹페이지 배포하기
https://dev.classmethod.jp/articles/aws-cli-s3-cloudfront-kr/
--------
React + Material-UIのアプリで選択されているサイドバーメニューの項目を目立たせてみた
https://dev.classmethod.jp/articles/highlight-selected-sidebar-menu-in-react-materialui-app/
--------
【待望】PayPayのオンライン決済APIが公開されたので試してみる #paypay #python
https://dev.classmethod.jp/articles/try-paypay-opa/
--------
【テレワークにオススメ】Amazon Connectを立ち上げてみました
https://dev.classmethod.jp/articles/sales-amazonconnect-launch/
--------

抽出できる要素

今回は、titlelinkを抽出しましたが、他にもこんな情報も抽出可能です。

  • description
  • category
  • pubDate(配信日時)
  • dc:creator(作者)

標準ライブラリ

おまけなりますが、Rubyの標準ライブラリについて解説をします。

もしぼやっと理解している方がいましたら、読んでみてください。

ライブラリ(Gem)の読み込み方

Rubyは、ライブラリをgemと呼んでいます。

基本的には、Gemをインストールし

require 'gemの名前'をすると利用できるようになります。

標準ライブラリ(gem)の場合

標準ライブラリは、Ruby自体にhttps://github.com/ruby/ruby/blob/master/gems/bundled_gems で読み込まれています。

例えば、今回のrssもそうですね。

Githubだとこちらのレポジトリにコードが置いてあります。

参考 rssGithub

すでに読み込まれているので、requreのみで利用できるというわけです。

外部ライブラリの場合

外部ライブラリの場合は、Rubyにはまだ読み込まれていないので

requireをしても利用できません。

その場合に一般的な方法としてbundlerというライブラリを利用して、Gemfileに利用したいGemを追加する必要があります。

まとめ

RubyでRSSを取得・抽出するチュートリアルでした。

RSSを簡単に実装できますね。

Rubyの基礎をもとに、何かツールを作ることはより深く知識を得ることにつながります。