だるろぐ

だるいぶろぐです

perlでサイトマップとサイトマップインデックスを作る

WWW::Sitemap::XML と WWW::SitemapIndex::XML を使う。

準備

  • libxml2 を入れておく
% sudo yum install libxml2-devel

モジュールのインストールでコケたら MooseX::Types のバージョンが古いかもしれないので最新にするなど

code

use strict;
use warnings;
use WWW::Sitemap::XML;
use WWW::SitemapIndex::XML;
use Time::Piece;

main();

sub main {
    my $output_dir = "/tmp";
    mkdir $output_dir unless -d $output_dir;
    unlink glob "$output_dir/sitemap*";

    my $base_url = "http://yoursite";
    my $tp = localtime;
    my $lastmod = $tp->ymd;

    my ($L, $n) = (5, 1);

    for my $i (1..$L) {
        my $map = WWW::Sitemap::XML->new;
        $map->add($base_url);
        for (1..$L) {
            $map->add(
                loc => "$base_url/contents/$n",
                lastmod => $lastmod,
                changefreq => 'monthly',
                priority => 1.0,
            );
            $n++;
        }
        $map->write("$output_dir/sitemap$i.xml", 1);
        #$map->write("$output_dir/sitemap$i.xml.gz");
    }

    my $index = WWW::SitemapIndex::XML->new;
    for my $i (1..$L) {
        $index->add(
            loc => "$base_url/sitemap$i.xml",
            #loc => "$base_url/sitemap$i.xml.gz",
            lastmod => $lastmod,
        );
    }
    $index->write("$output_dir/sitemap_index.xml", 1);
    #$index->write("$output_dir/sitemap_index.xml.gz");
}


writeメソッドの第二引数は true or false を求めてるので、別にpod通りに渡す必要は無い。
plain text で作るか gz で作るかは任意。

tips

  • lastmodのフォーマットの HH:MM:SS は省略可能
  • 数とサイズに注意

サイトマップ ファイルに含める URL は 50,000 個以下で、ファイル サイズは圧縮されていない状態で 10 MB 以下にする必要があります

  • 圧縮するかしないかはどちらでもいいようだ
  • このフォーマットに従わなくてもgoogle様は読んでくれる。が、

サイトマップ プロトコルに基づいてサイトマップを作成することをおすすめします。
そうすることで、作成したファイルを sitemaps.org のメンバーである Bing や Yahoo! など、他の検索エンジンに送信することができます。

  • とのことなので従っておいた方が楽
  • ファイル名も特に指定は無いようだ