LWPモジュール入門 -WEBページを取得する-

WEBプログラムを書いていると、ネット上のデータを自動的に取得したい時が度々出てきます。
例えば、どこかのXML Feedを取得したいだとか、何かのリアルタイムデータを取得したいだとか。

いくつかの手法が考えられますが、私が良く使うのは、PerlのLWP(libwww-perl)モジュール。
手軽に使えるので、大好きです。いくつかの問題点は置いといて。

基本的な使い方は、下記のようにします。
[lwptest.cgi]


#!/usr/bin/perl

use LWP::UserAgent;
$ua = LWP::UserAgent->new;

$req = HTTP::Request->new(GET => 'http://www.yahoo.co.jp/');
$req->header('Accept' => 'text/html');

$res = $ua->request($req);

if ($res->is_success) {
	print "Content-type:text/html\n\n";
	print $res->content;
} 

テキストエディタに貼り付けて、FTPでアップ。パーミッションを755 or 705にして、アクセスしてみましょう。
YahooJAPANのTOPページが出たでしょうか。


サーバーにあるプログラムからネット上のデータが取得できるということは、色々な事が出来る可能性が考えられますね。
細かい説明よりも、実例を紹介します。
下記URLは、Yahoo!占いのページです。
http://fortune.yahoo.co.jp/fortune/12astro/

このページから、それぞれの星座の紹介に移動できるのですが、私はしし座なので、しし座をクリック。
下記のURLが出てきます。
http://fortune.yahoo.co.jp/fortune/12astro/20080131/leo.html
この中で、変化する可能性があるものは、[20080131]の部分。日付ですね。

ここを変化させれば、前後の占いを見ることが出来ます。
ちなみに、どの範囲までの占いがあるのかと調べてみたら、2007年1月1日〜2008年2月9日までのデータがあるようです。
今日が2008年1月31日ですので、今の所、10日くらい先までは、私の運命は決まっているようです。

さて、では、実際のスクリプトを書いてみます。

下記のスクリプトは、今日の占いを取得し、総合運のみを表示します。
[getastro.cgi]

#!/usr/bin/perl

use strict;

#エラーをブラウザに表示
use CGI::Carp qw(fatalsToBrowser);

#LWPモジュールの読み込み
use LWP::UserAgent;

#新しいインスタンスを作成
my $ua = LWP::UserAgent->new;

#自分の星座のファイル名を指定
my $astro = '/leo.html';

#ベースとなるURIを指定
my $base_uri = 'http://fortune.yahoo.co.jp/fortune/12astro/';

#今日の日付を sub get_timeから持ってくる
my $today = &get_time();

#取得するURIを繋げる。
my $req_uri = "$base_uri$today$astro";

my $req = HTTP::Request->new(GET => $req_uri);
$req->header('Accept' => 'text/html');
my $res = $ua->request($req);

#取得したページを新しい変数に入れる
my $result = $res->content;

#総合運の部分を正規表現で取得
$result =~ s|.+<b>(\d+?)点</b>/\d+?点</td>.+|$1|s;

#Contentタイプヘッダの出力
print "Content-type:text/html\n\n";

#結果の出力
print "$today$result点<br>\n";
exit();

sub get_time {
	$ENV{'TZ'} = "JST+9";my $times = time;
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($times);
	$mon = "0".$mon if ($mon < 11);
	$mday = "0".$mday if ($mday < 10);
	my $date = $year+1900 . $mon+1 . $mday;
	return $date;
}


FTPでアップして、アクセスすると、
20080130は70点
のように表示されれば成功です。
これを、少し改造すると、下記のようなものも作れます。

■1週間先占い
・フォームから自分の星座を選んで、ボタンを押せば、一週間後の占いが見れる

■2007年運勢バイオリズムグラフ
2007年1月1日から2007年12月31日までの運勢をバイオリズムで表示(365回Yahoo!占いにアクセスするので迷惑がかかりますが。。。)

■星座バトル
2007年1月1日から2007年12月31日までの全ての星座の全ての運勢で、ポイントを付け、平均点で順位を付ける(4380回Yahoo!占いにアクセスするので迷惑がかかりますが。これはブラウザがタイムアウトするであろうと思われます)


と、色々できちゃうので、迷惑がかからない程度にWEBサービスマッシュアップして遊んでみるのも面白いと思います。