URLのリンク先が有効かチェックする方法

CGIテクニック集トップへ





概要

LWP::UserAgentを使って指定のURLのリンク先が有効かをチェックします。 メッセージボード5ディスカッションで使われています。

必用な処理

  1. PerlのPackage、LWP::UserAgentを読み込む
  2. チェックしたいURLを配列に入れる
  3. LWP::UserAgentのオブジェクトを作成
  4. タイムアウトの秒数を設定
  5. URLリストにあるURLに一つずつアクセスしページを取得するかチェック
  6. 結果に応じてメッセージを表示する

サンプルコード

 use LWP::UserAgent;
 
 my @urllist = qw(
               http://www.hidekik.com/
               http://www.hidekik.com/cookbook/
               http://www.fakefortest.abc
                 );
 
 my $ua = LWP::UserAgent->new;
 $ua->timeout(5);
 
 print "Content-Type:text/html\n\n";
 
 foreach (@urllist) {
    my $response = $ua->get($_);
    if ($response->is_success){
        print "$_ : is valid<br>";
    } else {
        print "$_ : is invalid<br>";
    }
    print $response->status_line;
    print "<p>";
 }

コードの解説

 use LWP::UserAgent;

LWP::UserAgentを読み込みます。

 my @urllist = qw(
               http://www.hidekik.com/
               http://www.hidekik.com/cookbook/
               http://www.fakefortest.abc
                 );

チェックしたいURLを配列に入れます。スクリプトがこれらのURLにアクセスします。

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

LWP::UserAgentのオブジェクトを作成します。ここではオプションは指定せずに全てデフォルトを使います。

 $ua->timeout(5);

URLにアクセスした時のタイムアウト秒数を設定します。ここでは5秒に設定しています。URL先から5秒経ってもレスポンスがない場合はタイムアウトと判定されます。

 print "Content-Type:text/html\n\n";

表示をブラウザに出力するために予め出力します。

 foreach (@urllist) {

URLが入っている配列を一つ一つループで取り出します。

 my $response = $ua->get($_);

取り出したURLにgetでアクセスします。getで取れない場合はエラーとなります。getでなくheadの方が負担が少なくていいのですが、まれにheadを禁止しているサイトもあるのでここではgetにしています。headの場合は、

 my $response = $ua->head($_);

とします。

返り値の$responseにはレスポンスオブジェクトが入ります。

 if ($response->is_success){
     print "$_ : is valid<br>";
 } else {
     print "$_ : is invalid<br>";
 }

$response->is_sucessメソッドでgetでそのURLに正しくアクセスできたかをチェックします。アクセスに成功したら「URLは有効」、失敗したら「URLは無効」のメッセージを出力します。 レスポンスステータスメソッドに関しましてはHTTP::Responseを参照してください。

 print $response->status_line;

getからの生メッセージを出力します。

関連するCGIテクニック

文中のURLを自動リンクする方法