wcheet : 詳細解説

はじめに

Webサーバー上にフリーの全文検索システムを構築する際、 試作段階のページや部門内限定ページなどを検索対象から除外したいとすると、 “トップページからのリンクを辿って到達可能か”、 “.htaccessファイルでアクセス制限がかけられていないか” などの調査に手間がかかってしまいます。

wcheet はこのような調査を自動で行い、検索対象とすべきページのみを リストアップするWebサイト内解析ツールです。

また、wcheet にはリンク切れファイルを検出する機能もあります。

開発言語

wcheet の開発には Perl のバージョン 5.8.X を使用しました。

リンクの抽出方法

wcheet は CPAN(Comprehensive Perl Archive Network)に登録されている HTML-Parser というPerlのモジュール・パッケージの中にある HTML::LinkExtorモジュールを使用してHTML内のリンク情報を抽出しています。

ただし、HTML::LinkExtorモジュールは、 HTMLの文字コードがISO-2022-JPの場合に 一部のリンクが抽出できないことがありました。

そこで、文字コードは、Encode::Guess モジュールのguess_encoding() を使って自動判別した後、Encode モジュールのfrom_to() で ascii に変換するようにしています。

これにより、HTMLの文字コードが ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8, UTF-16, BOM 付きの UTF-32 のいずれかであれば、 正常にリンクを抽出できるようになっています。 ただし、不正な文字コードが含まれている場合などで 自動判別がうまくいかないこともあります。

なお、BOM なしの UTF-32 はバイナリファイルとの区別が 難しいので対象から外しています。

リンクを辿るアルゴリズム

wcheet は下記のような動的計画法的なアルゴリズムでリンクを辿ります。

※ 図中の ○ はページ、→ はリンクを示します。

図1
  • 0のページをトップページとしてスタートする。
  • 最初のリンクで辿れるページは、自動的に求まり、1, 2, 3 のページが見つかる。
  • この1, 2, 3 を深さ1のページとする。
  • 1度見つかったページは全て記憶して、2回以上辿らないようする。
図2
  • 深さ1のページである1のページからリンクを辿ると、4のページが見つかり、2のページからリンクを辿ると、5と6のページが見つかる。
  • 1度見つかったページは全て記憶することにしているので、3のページからはページは見つからない。
  • これで、深さ2のページ 4, 5, 6 が見つかる。
図3
  • 同様の手順で、深さ2のページからリンクを辿ると、4のページから7と8が見つかり、5のページから9が見つかり、6のページからはページが見つからない。
  • これで、深さ3のページ 7, 8, 9 が見つかる。
図4
  • 同様の手順で、深さ3のページからリンクを辿ると、7のページから10と11が見つかり、8と9のページからはページが見つからない。
  • これで、深さ4のページ 10, 11が見つかる。
  • 12のページを見つけるには、深さ5まで辿る必要がある。

コマンドライン・オプション

wcheet には以下のコマンドライン・オプションを指定できます。 ([]の中の値はデフォルト値です。)

-h, --help
ヘルプを表示して終了します。
-a, --access-check
.htaccessのアクセス判定を行います。
-r, --recursive
再帰的にリンクを辿ります。
-L, --link-err-check
再帰的にリンク切れ検出を行います。
-I, --ip=IPADDR
.htaccessのアクセス判定に使用するIPアドレスを指定してください。
※ -a オプションと一緒に指定してください。
-D, --domain=NAME
.htaccessのアクセス判定に使用するドメイン名を指定してください。
※ -a オプションと一緒に指定してください。
-u, --user
ユーザー用ディレクトリについてもリンクを辿ります。
-p, --parent
親ディレクトリについてもリンクを辿ります。
-e, --extra
ファイル名以外の情報も出力します。 いまのところは深さ情報だけです。
-d, --depth=NUMBER
再帰的にリンクを辿る深さを指定してください。 [3]
※ -r または -L オプションと一緒に指定してください。
--size=NUMBER
HTMLファイルの最大サイズを指定してください。 [10240000]
--accept=LIST
リストアップするファイルの拡張子をカンマ(,)区切りで列挙してください。 [html,htm,pdf]
※ カンマの前後にスペースは入れないでください。
※ 全ての場合は '*' としてください
--html=LIST
HTMLファイルの拡張子をカンマ(,)区切りで列挙してください。 [html,htm]
※ カンマの前後にスペースは入れないでください。
--element=LIST
リンクを辿るHTMLの要素と属性の組み合わせを '要素名:属性名'という記述でカンマ(,)区切りで列挙してください。 [a:href,frame:src,area:href]
※ コロンまたはカンマの前後にスペースは入れないでください。
※ 全ての場合は '*' としてください
--idrctv=LIST
無視するディレクティブをカンマ(,)区切りで列挙してください。 [AddType,ErrorDocument]
※ カンマの前後にスペースは入れないでください。
--cache-in=FILE
読み込み用キャッシュファイルを指定してください。
--cache-out=FILE
書き込み用キャッシュファイルを指定してください。
--server-name=NAME
WebサーバーのServerNameを指定してください。
--document-root=DIR
WebサーバーのDocumentRootを指定してください。
--directory-index=NAME
WebサーバーのDirectoryIndexを指定してください。 [index.html]
--user-dir=NAME
WebサーバーのUserDirを指定してください。 [public_html]
--access-file-name=NAME
WebサーバーのAccessFileNameを指定してください。 [.htaccess]

.htaccessの解析

wcheet は .htaccessファイル内の記述のうち、 FilesMatch, Files, Limit, Order, Deny, Allow の 6つのディレクティブを解析して、 アクセス判定を行います。

この6ディレクティブ以外のものが記述された場合はエラーと判定します。 ただし、使用頻度の高い AddType, ErrorDocument の 2ディレクティブについては無視します。 この無視するディレクティブは、コマンドライン・オプション で変更できます。

リンク切れ検出

wcheet はリンク切れページを検出するという目的にも使用できます。

以下のようにコマンドライン・オプションを指定すると、 /var/www/html/foo.html から再帰的に深さ5までリンクを辿って リンク切れ検出を行うことができます。

% wcheet -L -d 5 -e --accept='*' --element='*' /var/www/html/foo.html

※ 存在しないファイルには、行の先頭に '!' が付加されます。
※ --accept='*' --element='*' と指定すると、 存在しないファイルを根こそぎ検出します。

注意事項

参考文献

Copyright(C) 2006-2007 MURATA Yasuhisa. All rights reserved.
Last modified: 2007-06-15