【コラム】
今回は前回作ったリンク切れチェッカーをさらに改良してみます。リンク切れチェッカーを改良していくことで、リンク切れをチェックするだけでなく、更新チェックやもっと別の方法に応用することもできるようになると思います。
まずは、前回作ったリンク切れチェッカーの問題点をおさらいしてみます。一番の問題は適当なURLでチェックしてみると分かるのですが、サーバ自体がないとエラーになってしまいます。ページがないだけならサーバが「そのページはありませんよ」と教えてくれるのですが、サーバ自体がない場合は、応答のしようもないのでエラーになるのです。
次の問題は、ページ自体はWEB上に存在しているのだけど、すでに別のサーバへ引っ越してしまっているという場合です。これもある意味「リンク切れ」と表現することができると思います。
まずは1つ目の問題から。サーバがあるのかないのか応答を調べるには、PINGを利用して確認することができます。まずは手動での確認方法を書いておきます。PINGは会社や家庭でパソコンをLANで接続している場合に、ちゃんとつながっているのか確認するのにも使えます(ですのでこの方法は覚えておいても損はありません)。
PINGを使うには、Windows のスタートメニューにある「ファイル名を指定して実行」に「cmd」(Windows 98/MEの人は「command」)と入力してOKボタンを押し、DOS窓を起動させます。次に、ここに、「ping (調べたいドメイン)」と入力しENTERキーを押すと、応答があるのかないのか結果を表示してくれます。
これを、なでしこのプログラムで確認するにはどうするのかといえば、以下のように書きます。以下のプログラムを実行し、もし、0が表示されたら、応答がないということで1が表示されれば応答があったということです。
ところが、PINGで解決しない場合もあります。セキュリティの関係でPINGに応答しないサーバもあるのです(某大手レンタルサーバはPINGしても応答がありませんでした)。
それなら、そもそもサーバに接続してみて、エラーが出たらリンク切れと判定するようにします。実は、エラーが出てもプログラムの実行を止めないようにする方法があります。「エラー監視~エラーならば~」という構文でエラーの発生する文を挟むのです。
以下は存在しないサーバからヘッダ取得しようとするプログラムです。本来ならサーバに接続できなくてエラーで止まってしまうはずが、「エラー監視~エラーならば~」構文で挟んでいるので、エラーは出ず、「リンク切れ」とだけ表示されます。
次にページ自体は存在するものの、すでに引っ越してしまっている場合について考えてみます。この場合、サーバを移転していれば、「引っ越しました」とか「移転しました」と告知があります。そこでこのような告知文を利用することで、リンクが切れているという状況を検出しようと思います。
ここで問題となるのが、告知文に使われる語句です。いろいろ引っ越しの告知ページを見て回った結果「URLが変更」「引っ越しました」「移転しました」などの告知があれば引っ越したとみなすことにしました。しかし、この場合、確実に引っ越したとは言えないため、最終的には人間の目で見て判断することになります。
以上のことから考えて「リンク切れ」の検出方法は以下のようになると思います。
(1) サーバからヘッダを取得する
(2) 取得に失敗してエラーが出たらリンク切れ確定
(3) ヘッダの一行目を見て「200 OK」がなければンク切れ確定
(4) HTML本体を調べて、引っ越しの告知文があればリンク切れの可能性
これを実際になでしこでプログラムにしたのが以下です。一行目で指定したURLが有効なURLなのかどうかを判定します。
linkchecker2.nako
1行目でリンク切れかどうか確認するためのURLを設定します。2行目で引っ越した場合の告知メッセージを指定します。ここでは3パターンの告知メッセージを設定しています。
4行目の「HTTP簡易ヘッダ取得」命令でヘッダを取得します。もしサーバに接続できずエラーが起きたときは、9行目の「エラーならば」以降のブロックを実行します。
5行目では取得したヘッダにページ取得成功のコード番号200がなければ「エラー発生」命令でエラーを発生させます。もし、200がない場合、ここでわざとエラーを発生させて、9行目以降のエラーメッセージの表示を行うようにします。
6行目ではヘッダではなく、HTMLファイルの本文をサーバから取得して、変数「本文」に代入します。7行目では、HTMLの本文に引っ越しの告知があるのかどうか判別して、告知文があればわざとエラーを発生させます。
もし、エラーが起きず8行目まで無事実行することができたなら、「エラーなし」というメッセージを表示します。しかし、途中で何かしらのエラーが起きた場合は、9行目以降のブロックが実行されるという仕組みです。
今回のプログラムは、なでしこのバージョン 1.03a で動作確認を行いました。プログラムにエラーが出る場合などは、1.03a以降のバージョンで実行してみてください。なでしこでは、プログラム中のインデント(字下げ)も意味があるものとして認識していますので、入力の際には気をつけてください。「#」以降の数字は注釈文ですので意味はありません。
それでは、前回作ったプログラムと今回作ったプログラムをつなげた、完全なリンクチェッカーを以下に用意しました。
プログラムを実行するとURLを尋ねてくるので、チェックしたいページのアドレスを入力します。すると、そのページに書かれているリンクを抽出してリンク切れがないかチェックします。
linkchecker_complete.nako
※分かりやすくコメントや空行をたくさん入れているので60行ほどありますが、実際には、前回の10行プログラムと今回の10行プログラムを足したものがベースとなっています。
今回作ったプログラムでも、まだまだ完全なものではありません。実際にいろいろなサイトをチェックしていくと、このプログラムだけでは完全にリンク切れを判別できないことに気づくでしょう。
はじめに思いつくのは告知文の追加です。10行プログラムの中では、3つだけのパターンしかチェックしていませんが、細かい表記の揺れや他の告知文も追加したほうが、リンク切れ検出の精度があがると思います。
次に、今回のプログラムでは、トップページがフレーム構造のものに未対応です。また、リンク先のページを開いた先にあるリンクもチェックするにはどうしたら良いでしょうか?
たかがリンク切れ、されどリンク切れ。WEBサイトを訪れた読者は、リンク切れを見つけると、そのWEBサイトに対する信頼性を疑うといいます。ぜひ、オリジナルリンク切れチェッカーを作って、自分のサイトにリンク切れがないか確認してみてください。
| 【レポート】マカフィーの世界の専門家の意識調査「サイバー防衛報告書」とセキュリティソリューション [21:15 5/25] |
| アップル、Aperture 3.2.4を公開 - バグ修正、安定性向上など [20:51 5/25] |
| 【レポート】GTC 2012 - VGXでエンタープライズ環境でのGPU需要開拓を狙うNVIDIA [20:07 5/25] |
| デル、期間限定キャンペーンに特価アイテム追加、アップグレード無料も継続 [19:41 5/25] |
| 上海問屋、iPhoneとほぼ同じ薄さのバッテリ内蔵ヘッドホンアンプ [19:05 5/25] |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
|
「ゆりてつ」サイン会は作者と都電に揺られるツアー仕立て [17:45 5/27] ホビー |
|
【ネタバレもありの徹底解明コラム】『サザエさん』タマの意外な事実 [17:30 5/27] ホビー |