【コラム】

日本語で10行プログラミング

8 WEBページのリンク切れをチェック その2

    クジラ飛行机  [2005/03/03]

    今回は前回作ったリンク切れチェッカーをさらに改良してみます。リンク切れチェッカーを改良していくことで、リンク切れをチェックするだけでなく、更新チェックやもっと別の方法に応用することもできるようになると思います。

    まずは、前回作ったリンク切れチェッカーの問題点をおさらいしてみます。一番の問題は適当なURLでチェックしてみると分かるのですが、サーバ自体がないとエラーになってしまいます。ページがないだけならサーバが「そのページはありませんよ」と教えてくれるのですが、サーバ自体がない場合は、応答のしようもないのでエラーになるのです。

    次の問題は、ページ自体はWEB上に存在しているのだけど、すでに別のサーバへ引っ越してしまっているという場合です。これもある意味「リンク切れ」と表現することができると思います。

    PINGでサーバを確認する

    まずは1つ目の問題から。サーバがあるのかないのか応答を調べるには、PINGを利用して確認することができます。まずは手動での確認方法を書いておきます。PINGは会社や家庭でパソコンをLANで接続している場合に、ちゃんとつながっているのか確認するのにも使えます(ですのでこの方法は覚えておいても損はありません)。

    PINGを使うには、Windows のスタートメニューにある「ファイル名を指定して実行」に「cmd」(Windows 98/MEの人は「command」)と入力してOKボタンを押し、DOS窓を起動させます。次に、ここに、「ping (調べたいドメイン)」と入力しENTERキーを押すと、応答があるのかないのか結果を表示してくれます。

    手動でPING

    これを、なでしこのプログラムで確認するにはどうするのかといえば、以下のように書きます。以下のプログラムを実行し、もし、0が表示されたら、応答がないということで1が表示されれば応答があったということです。

    「pcweb.mycom.co.jp」へPINGして表示。

    ところが、PINGで解決しない場合もあります。セキュリティの関係でPINGに応答しないサーバもあるのです(某大手レンタルサーバはPINGしても応答がありませんでした)。

    それなら、そもそもサーバに接続してみて、エラーが出たらリンク切れと判定するようにします。実は、エラーが出てもプログラムの実行を止めないようにする方法があります。「エラー監視~エラーならば~」という構文でエラーの発生する文を挟むのです。

    以下は存在しないサーバからヘッダ取得しようとするプログラムです。本来ならサーバに接続できなくてエラーで止まってしまうはずが、「エラー監視~エラーならば~」構文で挟んでいるので、エラーは出ず、「リンク切れ」とだけ表示されます。

    エラー監視
        「http://www.example.com/」からHTTPヘッダ取得
    エラーならば
        「リンク切れ」と言う

    引っ越しを判別する方法

    次にページ自体は存在するものの、すでに引っ越してしまっている場合について考えてみます。この場合、サーバを移転していれば、「引っ越しました」とか「移転しました」と告知があります。そこでこのような告知文を利用することで、リンクが切れているという状況を検出しようと思います。

    ここで問題となるのが、告知文に使われる語句です。いろいろ引っ越しの告知ページを見て回った結果「URLが変更」「引っ越しました」「移転しました」などの告知があれば引っ越したとみなすことにしました。しかし、この場合、確実に引っ越したとは言えないため、最終的には人間の目で見て判断することになります。

    有効なURLかどうか判定する10行プログラム

    以上のことから考えて「リンク切れ」の検出方法は以下のようになると思います。

    (1) サーバからヘッダを取得する
    (2) 取得に失敗してエラーが出たらリンク切れ確定
    (3) ヘッダの一行目を見て「200 OK」がなければンク切れ確定
    (4) HTML本体を調べて、引っ越しの告知文があればリンク切れの可能性

    これを実際になでしこでプログラムにしたのが以下です。一行目で指定したURLが有効なURLなのかどうかを判定します。

    URL=「http://pcweb.mycom.co.jp/column/nihongoprog/tekitounaurl.html」#1
    告知=「URLが変更{改行}引っ越しました{改行}移転しました」             #2
    エラー監視                                                           #3
        URLからHTTP簡易ヘッダ取得してヘッダに代入。                      #4
        もし((ヘッダ\0で「200」が何文字目)=0)ならば、エラー発生。        #5
        URLからHTTPデータ取得。SJIS変換して、本文に代入。                #6
        告知を反復、もし(本文で対象が何文字目>0)ならば、エラー発生。     #7
        「エラーなし」と言って終わる。                                   #8
    エラーならば                                                         #9
        「リンク切れ」と言って終わる。                                   #10
    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サイトに対する信頼性を疑うといいます。ぜひ、オリジナルリンク切れチェッカーを作って、自分のサイトにリンク切れがないか確認してみてください。

    関連サイト

    新着記事

    特設サイトの情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      マイナビニュースマガジン