更新日の新しい順のリンク集

作成日:2003-04-12
最終更新日:

ホームページにはリンク集があるのが通例になっている。 たまに、なぜリンク集があるのか不思議になることがある。 というのも、それぞれのページでハイパーリンクを張っておけばそれでいいのではないかと思うからだ。 しかし、ページ作成者の考えを全体として表すリンク集は、 個々のページの文脈で必要なリンクと異なることも事実だ。 そう思って、私もリンク集を用意している。 リンク集をどのような基準で用意するかといえば、 自分が何度もそのリンクを使って見に行きたいと思うかだ。ただ、 自分のリンク集がそうなっているかどうかは、自信がない。

何回も見に行きたくなる、そんなページとはどういう条件を満たしているのか。 一つ考えたのは、頻繁に更新されているページではないかということだ。 これが一般に必要な条件だとは思わない。しかし、私が見に行きたくなるのは、 絶えずなにかしら新しい、できれば面白いことが得られるページだ。 そのようなページは、どのようにして捜せるか。

中小企業診断士関係のリンク集を作ることにして、今述べた考えを実行に移すことにした。 リンク集の元ネタは私自身がいろいろなところからかき集めたものを使う。 手順は次の通り。

  1. 元ネタを集めたページを用意する
  2. 集めたページからハイパーリンクを抽出する
  3. 集めたハイパーリンクのヘダー情報を得る。ヘダー情報には最終更新日情報が入っている
  4. 最終更新日が新しい順にリンクを並び変える

まず、ハイパーリンクを指定して、ヘダー情報を表示させてみる。 典型例を以下に示す。

text/html 422 3132209488  Apache/1.3.27 (Unix)
第1列 ドキュメントの型(text/html )
第2列 ドキュメントの大きさ(バイト数)
第3列 ドキュメントの年齢(おそらく最終更新時刻の time 値表現)

第4列以降は WEB サーバの種類が表示されるようだ。

そこで、URL を指定して第 3 列のドキュメントの年齢を引き出し、 この年齢にしたがって整列させれば、目的を達することができる。 Perl の場合は、LWP::Simpleモジュールを使って、 head サブルーチンを呼び出す。

  use LWP::Simple
  $url = "http://www.ne.jp/asahi/music/marinkyo/index.html.ja";
  $modified_time = localtime((head($url))[2])
  print $modified_time #=>Sat Feb  3 11:37:04 2007

当初はこの方法をもとにリンク集を作っていた。 その後、Perl の代わりに Ruby で書き直した。 その後休止期間もあったが、再開した。

なお、上記の結果を受けて行った結果を記す。

表示は下記の通りだ。一部伏字にしている。

OK:    http://www.*******.com/ 3098820797
OK:    http://www.geocities.co.jp/WallStreet-Bull/****/ 
OK:    http://member.nifty.ne.jp/shindanshi-*******/ 3134602169
ERROR: http://www.kt.sakura.ne.jp/%7E****/
(以下省略)

この結果を受けて、まずは次のように作ってみたいと考えた。

  1. エラーが出たページや、OK だったが最終更新日を返さないページは除外する。
  2. 最終更新日が新しい順にリンクを並び変える

以上を実現するために、まずは、エラーが出ず、かつ最終更新日を返すページをハッシュ変数に納める。 キーは URL、値は最終更新日の time 値表現である。

次に、そのハッシュ変数を、値の降順にソートする。 ハッシュ変数のソートは、「初めてのPerl」に出ている。 ここでは、3項演算子 <=> を用いる。

http://member.nifty.ne.jp/shindanshi-*******/ :  3134602169
http://www.bekkoame.ne.jp/**/*******/ :  3134564945
http://homepage1.nifty.com/*******/ :  3133764866

ここまできたらもう少しだ。 最終更新日の time 値表現を、通常の年月日時分秒表現に変換して表示します。

しかし、まだ問題点がある。

  1. すべての結果を得るまでに時間がかかってしまう。
  2. リンクの説明文が入っていない。

1.の問題は、head リクエストのタイムアウトの時間がデフォルトで 180 秒であることに起因します。 この値は、LWP::Simple モジュールでは変えられない。 そこで方針を変更した。LWP::UserAgent モジュールを使うことに変更し、 ここでタイムアウト値を変更すればよいだろう。ここでは最短の1secとしている。 刻み幅も 1sec とした。 2.リンクの説明文を用意するには、次の2種類の方法がある。 一つは、リンク先をとってくるページで、リンク先のタグに書かれている内容を抽出する方法だ。 もう一つは、リンク先のページからタイトルを持ってくる方法だ。 第1の方法は、HTML::LinkExtor にその機能がないので、あきらめた。 第二の方法は、リクエストを head から get に変えなければならず、そのため、負荷がかかる。 結局、どちらの方法も用いていない。

また、問題がありました。 私のリンクが、ERROR となってしまう。 試したのは 2003 年 5 月 5 日、夜 10 時ごろだった。 同じことを2003 年 5 月 6 日(時刻不明)実施したら、今度は正常に処理された。 私のリンクが ERROR となってしまったのは、 おそらくレスポンスがネットワークのタイムアウト時間までになかったためだろう。 今まではタイムアウト時間を 1 秒にしていたが、これからは 2 秒にする。

まりんきょ学問所Perl 手習い > 更新日の新しい順のリンク集


MARUYAMA Satosi