Googleのクロール用のサイトマップ生成にあたって、既存のツールをいくつか試してみたのですが適当なツールが見つからず自作することにしました。サイトマップの仕様は
http://www.sitemaps.org/ja/protocol.htmlにあるように、以下のタグを使って記述しますが、複雑に要素が入れ子になることもないので簡単に作成することができます。
<urlset> | - |
<url> | - |
<loc> | ページのURL, 必須 |
<lastmod> | 最終更新日時, オプション |
<changefreq> | ページの更新頻度, オプション |
<priority> | ページの重要度 |
個々のページは<loc>, <lastmod>, <changefreq>, <priority>を使って設定しますが、これらのタグは<url>に含まれます。それぞれの<url>タグは<urlset>に含まれます。
以下はねこや書店のサイトマップの一部です。
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://books-nekoya.jp/index.html</loc>
<lastmod>2012-09-08</lastmod>
<changefreq>daily</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://books-nekoya.jp/link.html</loc>
<lastmod>2012-06-06</lastmod>
<priority>0.5</priority>
</url>
...
</urlset>
ページ数が少なければ、手書きでも簡単に作れます(UTF-8でエンコードする必要があります)が、サイト内のファイル数もかなり増えているので今回はこれをPerlスクリプトで生成しました。正確にツールを作るなら、サーバー上にあるファイルの更新日付を調べたり、HTMLのリンクをたどった方がいいのかも知れませんが、仕様を簡単にするために、ローカルのあるディレクトリ(ホーム)以下のHTMLを検索することでサイトマップを作る仕様にしました。ファイル更新日付はローカルにあるファイルから取得します。ねこや書店ではほとんど逐次Webサーバーに更新したHTMLを送っていますのでこの方法でまったく問題はありません。
基本的なアルゴリズムは、以下の通りです。
(1) Perlスクリプトからlsコマンドでホームディレクトリ以下のファイルを検索
ls $base -Rl --full-time
(2) 検索結果からHTML以外のファイルの情報を抽出
(3) 必要であれば、ページ(HTML)ごとに更新頻度(changefreq)やページの重要度(priority)を設定する
(4) 結果をサイトマップに出力