このページの目次


株価のRSS

 株価を取得してRSS化するスクリプトです。

概要

 株価のRSSがあってもいいんじゃないかと思い作成しました。

要素

XML::RSS

 RSSの作成はPerlモジュールのXML::RSSを利用すると簡単に出力できます。

 はじめに宣言します。

# XML::RSSを利用
use XML::RSS;

 RSSを作成します。versionは0.9や0.91、1.0、2.0が指定可能です。

# RSSを作成
my $rss = new XML::RSS (version => '1.0');

 RSSは大きく分けるとchannelとitem群に分けることが出来ます。channelにはそのサイトの情報が入り、itemはそのサイト更新情報が入ることになります。まず、channelに入れる情報は以下のように指定できます。

# channelの作成
$rss->channel(
	title => "test",
	link => "http://www.xlabo.net/test/test_rss.cgi",
	description => "test RSS",
	dc => {
		date => "2005-07-28T19:59:29+09:00",
		subject => "test subject",
		creator => 'test@xlabo.net',
		publisher => 'test@xlabo.net',
		rights => 'Copyright 2005, x Laboratory',
		language => 'jp',
	}
);

 次に更新情報については以下のadd_itemを使用します。更新情報分このadd_itemを繰り返すことになります。

# Itemの追加
$rss->add_item(
	title => "Test Item",
	link => "http://test.com/",
	description => "Description",
	dc => {
		subject => "Category test",
		creator => "abeken",
		date => "2005-07-28T19:59:29+09:00",
		publisher => "BlognPlus",
		rights => "abeken"
	}
);

 以下のようにすることで出力できます。

# RSSの出力
print $rss->as_string;

 ファイルに保存もできます。

# RSSの出力
print $rss->save("rss.rdf");

 RSSを作成する際には有用なモジュールです。他にもファイルからRSSデータを読み込んだり、出力するバージョンを変更したりできます。

 以下を参照ください。

http://search.cpan.org/~kellan/XML-RSS-1.05/lib/RSS.pm

Template::Extract

 HTMLをハックする際に利用したPerlモジュールのTemplate::Extractです。

 はじめに宣言します。

# 宣言
use Template::Extract;

 オブジェクトを作成します。

# オブジェクトを作成
my $obj = Template::Extract->new;

 $templateと$documentを作成する。

# template
my $template = << '.';
<ul>[% FOREACH record %]
<li><A HREF="[% url %]">[% title %]</A>: [% rate %] - [% comment %].
[% ... %]
[% END %]</ul>
.

# document
my $document = << '.';
<html><head><title>Great links</title></head><body>
<ul><li><A HREF="http://slashdot.org">News for nerds.</A>: A+ - nice.
this text is ignored.</li>
<li><A HREF="http://microsoft.com">Where do you want...</A>: Z! - yeah.
this text is ignored, too.</li></ul>
.

 extractで処理を行います。

# 処理する
my $ext = $obj->extract($template, $document);

 上記のようにいたってシンプルですが、templateの作成が結構難しい場合があります。今回はdocumentをYahooファイナンスからgetし、templateは以下のように作成しました。

<td nowrap align=left><a href="[% ... %]">[% trade_code %]</a></td>
<td nowrap align=center>[% market_place %]</td>
<td nowrap align=left><small>[% company_name %]</small></td>
<td nowrap align=center>[% trade_time %]</td>
<td nowrap><b>[% last_trade %]</b></td>
<td nowrap>[% change %]</td>
<td nowrap>[% change_percent %]</td>
<td nowrap>[% volume %]</td>
<td nowrap align=center><small><a href="[% chart_url %]">

 1品種の株価のデータであるため、上記のような単純なテンプレートで株価のデータを取得することができました。複数個のデータセットを取得する場合などは[% FOREACH record %]などを利用して複数個分取得する必要があります。それと、このテンプレートは曖昧な設定をしてしまうとextractに時間がかかるようですのでご注意ください。

 単純にtitleとdescriptionに株価の情報を入れるだけではつまらないので、XML::RSSモジュールの名前空間を独自に定義する機能を利用して株価データを配信するようにします。

 通常のRSSとしては以下のデータを出力します。

title
 会社名+株価+前日比
link
 YahooファイナンスのURL
description
 取得したすべてのデータ
dc:date
 株価の確定した日時
dc:creator
 私

 そして、新たにstockという名前空間を定義して以下のデータを出力します。

trade_code
 株価コード
market_place
 取引市場
company_name
 会社名
trade_time
 時間
last_trade
 取引値
change
 前日比
change_percent
 前日比(%)
volume
 出来高
chart_url
 YahooファイナンスのURL

cgi

 上記の要素を組み合わせて作成しました。

http://www.xlabo.net/cgi-bin/rss_stock.cgi?9991

 "?"以降にコードを追加することで、そのコードの株価のRSSを出力します。また、さらに"&"で区切ってコードを追加することで複数の株価のRSSを出力できます。

http://www.xlabo.net/cgi-bin/rss_stock.cgi?9991&9992&9993

 複数個指定した場合は、それだけ時間がかかりますのでご注意ください。

cgi2

 ある方がHTMLにて表示するには? との要望がありましたので、RSSに出力するのではなく、HTMLにてテーブル表示するものを作成しました。

http://www.xlabo.net/cgi-bin/html_stock.cgi?9991&9992&9993

ソース

 cgiの中身はこんな感じです。UTF-8で見てください。

Jcode版

 Jcodeしか利用できない場合は以下のソースで表示できます。

http://www.xlabo.net/cgi-bin/rss_stock.txt

http://www.xlabo.net/cgi-bin/url_get.txt

Encode-compat版

 Encode-compatが使用できる場合は以下のソースを使用したほうが文字化けしないです。

http://www.xlabo.net/cgi-bin/rss_stock_new.txt

http://www.xlabo.net/cgi-bin/url_get_new.txt

html版

 RSSで出力するのではなくHTMLで出力するソースです。

http://www.xlabo.net/cgi-bin/html_stock.txt

ご意見やコメント

 ご意見やコメントは以下のフォームからお願いします。

 メールはこちらまで。admin@xlabo.net (@を全角で書いてます半角にして送付ください。)