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!占いにアクセスするので迷惑がかかりますが。これはブラウザがタイムアウトするであろうと思われます)