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 は下記のような動的計画法的なアルゴリズムでリンクを辿ります。
※ 図中の ○ はページ、→ はリンクを示します。
|
- 0のページをトップページとしてスタートする。
- 最初のリンクで辿れるページは、自動的に求まり、1, 2, 3 のページが見つかる。
- この1, 2, 3 を深さ1のページとする。
- 1度見つかったページは全て記憶して、2回以上辿らないようする。
|
|
- 深さ1のページである1のページからリンクを辿ると、4のページが見つかり、2のページからリンクを辿ると、5と6のページが見つかる。
- 1度見つかったページは全て記憶することにしているので、3のページからはページは見つからない。
- これで、深さ2のページ 4, 5, 6 が見つかる。
|
|
- 同様の手順で、深さ2のページからリンクを辿ると、4のページから7と8が見つかり、5のページから9が見つかり、6のページからはページが見つからない。
- これで、深さ3のページ 7, 8, 9 が見つかる。
|
|
- 同様の手順で、深さ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='*' と指定すると、
存在しないファイルを根こそぎ検出します。
注意事項
-
ワイド文字(Wide character)を含む URI には対応していません。
ファイル名に ASCII の図形文字以外が含まれていた場合、
wcheet は '?' に置換して出力します。
また、このファイルからのリンク抽出は行いません。
-
フレームなどを使って複数のファイルでページを構成している場合は、
実際より深くリンクを辿る必要があります。
-
.htaccessの解析におけるエラー判定は、
Apache のバージョン 2.0.X のエラー判定と
できるだけ同じになるようにしていますが、
完全に一致するという保証はありません。
-
.htaccessの解析はIPv6用の記述には対応していません。
参考文献
-
村田安永,
“全文検索システム構築のためのサイト内解析ツールの開発”,
第17回分子科学研究所技術研究会報告集, March 2-3, 2006
Copyright(C) 2006-2007
MURATA Yasuhisa.
All rights reserved.
Last modified: 2007-06-15