10部 Perlから利用できる重要技術

RSSの概要

RSS(RDF Site Summary)概要

RSSは、ニュースヘッドラインを効率的に配信するために開発された規格です。ドキュメントの見出しやリンクなどのリストを共通の書式で記述するために特化されているので、サイトの目次や更新情報などを効率的に配信することができます。既にニュースやウェブログのヘッドライン配信で多く利用され、標準的配信方法としての地位を確立しています。RSSは書式の規格なので、扱うコンテンツに対しては制限ありません。個人的なブログやレビューなどもなんの問題もなくRSSとして扱えます。

RSSの活用方法

RSSは、ニュースの見出しや要約をXML文書としてまとめるための規格で、下記のように記述されます。

SMARTで配信しているRSSの一部抜粋
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SMART プログラミングとサイト構築のウェブマガジン</title>
	<atom:link href="https://rfs.jp/feed" rel="self" type="application/rss+xml" />
	<link>https://rfs.jp</link>
	<description>プログラミングとサイト構築の情報が集まるウェブマガジン &#34;SMART&#34;</description>
	<lastBuildDate>Sun, 11 Nov 2018 00:17:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.9.8</generator>
	<atom:link rel='hub' href='https://rfs.jp/?pushpress=hub'/>
	<item>
		<title>The Internet - Come Over</title>
		<link>https://rfs.jp/blog/music/the-internet-come-over.html</link>
		<comments>https://rfs.jp/blog/music/the-internet-come-over.html#respond</comments>
		<pubDate>Sun, 11 Nov 2018 00:17:48 +0000</pubDate>
		<dc:creator><![CDATA[リズムファクトリー]]></dc:creator>
				<category><![CDATA[MUSIC]]></category>

		<guid isPermaLink="false">https://rfs.jp/?p=5283</guid>
		<description><![CDATA[]]></description>
		<wfw:commentRss>https://rfs.jp/blog/music/the-internet-come-over.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	</item>

上記のような、ドキュメント内容の要約や更新情報が掲載されたXMLファイルをRSSフィードと呼びます。これから、RSSフィードがどのように利用されているかを紹介していきましょう。

外部サイトのニュース見出しとリンクを利用する

RSSを公開しているサイトがあれば、そのリソースを使って自分のホームページに埋め込むことができます。

一般的な方法としては、cronのようなコマンドを利用して、RSSフィードを読みにいくスクリプトを定期的に実行し、その内容を自分のホームページに埋め込みます。このような方法により、自分のホームページのニュース欄が自動的に更新されるようになります。

ヘッドラインビューアソフトでのニュース収集

RSSフィードを表示するための、 RSSリーダーと呼ばれるサービス・ソフトウェアがあります。これらはホームページを更新するためのものでなく、単純にRSSを公開しているサイトを巡回し、そのヘッドライン一覧を表示するものです。

RSSリーダーとして有名なサービスはinoreaderやfeedly(英語)です。どちらのサービスにもiPhoneやAndroidアプリも用意されているので、興味のある記事を一括管理することができます。

自作プログラム内でのRSSフィードの利用

プログラムから RSSフィードを活用するには、以下のページも参考になるでしょう。

RSSを利用するまでの流れ

RSSは、サイトの概要をメタデータとして記述するXMLフォーマットです。RSSとして記述された情報は、容易に他のサイトからも利用することができます。どこかのサイトで、ホロスコープや、天気予報、ヘッドライン・ニュースなどのコンテンツがRSSで記述されていれば、それを自分のサイトに自動的に埋め込むことができます。提供する側の利点としては、ニュースや天候予報などの情報を他サイトに流すことになりますが、ニュースの件名などに貼るリンク先を自サイトのURLにしておくことができるので、結果的にトラフィックを増やすことになります。

ソース提供サイトがニュースヘッドラインなどの情報を提供するまでの流れと、利用ユーザがRSSを自サイトに取り込むまでの流れは以下のとおりです。

ソース提供サイトの作業の流れ

  1. 既存の情報をRSSフィールドとして作成
  2. 利用ユーザにRSSフィードのURLを告知

利用ユーザが RSSを自サイトに埋め込むまでの作業の流れ

  1. ソース提供サイトにあるRSSフィードを取得
  2. 取得したデータを、HTMLなどに変換して出力

XMLとRDF

RSSのに関連した技術として 『XML』 と 『RDF』があります。XMLとRDFは、ウェブサイト運営をもっと簡単にするために考案された規格です。これらの規格が考案される背景には、ウェブに次のような問題がありました。

  • 内容とレイアウトを混合するHTML文書の限界
  • 保守性と柔軟性に欠けるウェブサイト運営
  • 動的コンテンツを効果的に提供するための手段の欠如
  • 巡回型検索エンジンで問題となっている、検索ワードに対する検索結果の精度

最初の2点をクリアするものとして、XMLが脚光を浴びて登場しました。XMLは、HTMLのようなシンプルなフォーマットで文書構造を記述でき、独自にタグを定義できることが特徴のマークアップ言語です。XMLを利用することにより、ウェブデータの保守を容易にし、柔軟性を高めることが可能になります。
残る2点の問題、動的コンテンツを効果的に提供、検索ワードに対する検索結果の制度を解決する手段として、RDFが開発されました。RDFは、異なるウェブアプリケーション同士がデータを交換できるようにするためのメタデータフレームワークで、ウェブ上にある膨大なドキュメントを容易に管理することを基本目的としています。その交換構文として、XMLを使用しています。つまり、RDFはXMLのアプリケーションの1種ということができます。

RSSの歴史

RSSはもともと、Netscape Communications社がMy Netscapeポータルページにニュースヘッドラインを配信する方法として、1999年3月に開発・公開した規格です。

最初のRSS(RSS0.9)はRDFベースに、見出し一覧を配信するためのRDFコンパクト版のようなものでした。1999年7月には、見出しだけでなく、要約、著作権、更新日付などさまざまな情報も加えたサイトサマリーを提供できるようにしたRSS0.91が登場します。

RSSへの注目度とは別に、Netscape社のポータル事業それほどの成功をもたらさず、同社はRSSの開発を事実上棚上げにしました。皮肉なことに、同技術のみはサイトサマリーを提供する枠組みとしてウェブサイト開発者に採用され、広く一般に浸透していきました。

多くのウェブサイトで利用されるようになると、これに独自の改造を加えたRSSなども出現し、多くの亜種が混在する危険性が高まりました。そのような事態を避けるために、基本的なサマリー提供機能をコアなRSSとして定義し、 より高度な機能はモジュールとして追加できるようにするという
規格が開発者のグループで検討されました。この成果として2000年12月に提案されたのがRSS1.0です。

RSSが一般に普及する理由

先に紹介したXMLとRDFにより、ウェブを管理する効果的な手法が提供されるようになりましたが、実際のところ、一般に普及しているとはいえないのが現状です。一般に普及しない要因として、XMLもRDFも抽象的な規格で、即時的な効果がないことが挙げられます。それとは反対に、これから紹介するRSSは、登場と同時に多くの利用者を獲得し、様々な技術で利用されるようになりました。RSSは、RDFから派生した規格で、交換構文としてXMLを使用しているので、このような紹介は正しくないのかもしれません。ですが、ここで強調したいのは、RSSが開発者の心をつかんだのは、XMLやRDFの理念ではないということです。

RSSが利用ユーザを増やした要因を端的に言えば、RSSを利用することにより、ニュースサイトのニュースヘッドラインや最新技術情報などを自分のサイトに自動的に埋め込むことができるので、常に新しいコンテンツを探しているウェブ運営者の目に留まったということです。また、ソース提供者にとっても、トラフィックを増やすための手段として受け入れられています。そこには、XMLやRDFの理念は関係ありません。XMLやRDFは、その利用により巡回型検索サービスなどの検索能力を向上させ、管理も容易にしますが、普通のサイト管理者に強くアピールするための、目に見える明快な効果というのは非常に薄いといえます。ブラウザで確認することのできる、明確なサービスを提供できるというのがRSSの強みではないでしょうか。

用語
RDF(Resource Description Framework)
RDF(Resource Description Framework) は、メタデータのプロパティを定義し、異なるアプリケーション同士がウェブを通じて効果的なデータ交換を可能にするためのメタデータフレームワークです。交換構文としてXMLを使用します。
XML(eXtensible Markup Language)
HTMLのようなシンプルなフォーマットで文書構造を記述でき、独自にタグを定義できることが特徴のマークアップ言語です。XML 準化は、W3Cで行なわれています。

RSS実技

  • RSSフィードの読み込み
  • RSSの出力
  • 定期的に巡回する方法

RSSフィードの読み込み

XMLはインターネット・エクスプローラでも閲覧することができますが、ソースの状態のまま表示されてしまいます。このままでは読みにくいので、RSSのヘッドライン情報を利用しているサイトのほとんどは、RSSフィードを読み込んでからHTML形式に変換して表示させています。

RSSフィードを読み込み、そこからタイトルやリンクだけを抜き取るには、XML::RSSモジュールが便利です。Perl 5.6には標準のモジュールとしてXML::Parserモジュールが含まれていますが、これは汎用的にXMLを扱うものです。RSSに関しては、RSS用に特化して設計されたXML::RSSモジュールを利用したほうがよいでしょう。

ダウンロードリンク

以下のプログラムは、インターネットで公開されているRSSフィードからデータを取得し、出力するためのものです。

#!/usr/local/bin/perl
use LWP::Simple 'get';
use XML:: RSS;

# RSSオブジェクトのリファレンスを取得
my $rss = new XML::RSS;

# LWP::SimpleのgetメソッドでRDFファイルを読み込み、
# XML::RSSのparseメソッドでRSSフィードをパースし、その結果を保存。
eval {
	$rss->parse( LWP::Simple::get('http://slashdot.org/slashdot.rdf') );
};
exit if $@;

# RSSの各 item ごとの title を抜き出し、出力
foreach my $ref( @{$rss->{items}} ) {
	print "$ref->{'title'}:$ref->{'link'}\n";
}

LWPはウェブにあるデータを処理するためのライブラリです

※LWPはPerlの標準モジュールなので、CPANからインストールする必要はありません。

XML::RSSのparseメソッドは、XML構文のパースに失敗すると例外を投げてスクリプトを終了させるので、evalを使ってそれを回避させるのがベストです。

ここでは、取得したヘッドラインニュースをそのまま出力していますが、データベースなどに挿入しておき、必要なときだけそこから取り出すようにしてもよいでしょう。

RSSの出力

RSSの出力は、読み込みと同様にXML::RSSモジュールを利用します。

処理の流れは、XML::RSSクラスのインスタンスを生成し、channel/add_itemメソッドで情報を登録、as_stringメソッドで出力となります。少し詳しく紹介していきましょう。

まず、XML::RSSクラスのインスタンスを生成します。ここで生成されたインスタンスからchannelメソッドを呼び出し、サイト情報を定義します。次に記事データを取得します。記事データは、データベースに登録してある情報などを取得するのが一般的ですが、ここではスクリプトの中でタイトルとURLを指定しています。記事データを取得したら、add_itemメソッドで記事を追加していきます。channelメソッドやadd_itemメソッドによって登録された情報は、as_stringメソッドで取得することができます。ここで取得したXMLデータを、JcodeモジュールでUTF8に変換、最後はprintで出力します。

以下は、RSSフィードを出力する簡単なスクリプトです。

#!/usr/bin/perl -w
use XML::RSS;
use Jcode;

# XML::RSSクラスのインスタンスを生成
my $rss = new XML::RSSversion => '0.91';

# サイト情報をchannelメソッドで 定義
$rss->channel(
	title => 'rhythmfactory',
	link => 'http://xxx/',
	language => 'ja',
	description => sprintf('Summary for %s',$title),
);

# 記事データを準備
my %item = (
	'title1' => 'http://xxx/1',
	'title2' => 'http://xxx/2',
);

# 記事をadd_itemメソッドで追加
while ( my($k,$v) = each %item ){
	$rss->add_item(
		title => $k,
		link => $v,
	);
}

# 出力
print "Content-Type:text/plain\n\n";	# or "text/xml"
print Jcode->new($rss->as_string)->utf8;

定期的に巡回する方法

ニュースなどのRSSは1日に1回、多ければ数回更新されます。これを自動で定期的に読み込み、データを同期するにはcrontabというシェルコマンドを使います。

crontabの書式は下記のとおりで、分・時・日・曜日とコマンドのパスを記入します。

min hour day month week command

分・時・日・曜日の代わりにワイルドカード( * )を使うことができます。たとえば、毎日 10:00 にcron.cgiを実行したい場合は、下記のように日・曜日にワイルドカードを使います。

10 0 * * * cron.cgi

毎月1日の10:00にcron.cgiを実行するには、下記のように記述します。

10 0 1 * * cron.cgi

それでは、crontabを実行して、定期実行の設定を行いましょう。cronファイルを編集するには、crontabにオプションの -e をつけて実行します。

crontab -e

  編集画面で、たとえば以下のように入力します。

0 0 * * * /home/www/cgi-bin/rss_outdb.cgi

上記の意味は、「毎日0時0分にrss_outdb.cgiを実行」となります。

RSS関連リンク集

現在提供されている RSS

RSSを集めて提供しているサイト

RSSツール・サンプル

RSS講座・解説

RSSに関連するプロジェクト

RSS関連の書籍

関連記事