[Perl脚本]Perl写的生成 Google SiteMap 的小程序

This is a SiteLog of Easun's WebBlog.
我的网站的 SiteMap 原来一直采用的是 MT 模板的方式 ,参考 Google Sitemaps using Movable Type , 这样的好处是我的 Website 是基于 MT 的。会随着新Blog 的发布自动更新。

然而,也有不好的方面,这个 MT 模板只收录blog的单篇文章地址。而且,我准备把 旧站 迁移过来,这样的话,这些原来网页的地址就被排除到了 SiteMap 外。

怎么办呢? 想起了老本行,Perl 。Perl 擅长文本处理,写个小的CGI程序遍历一下整个 WebSite 并不是困难的事情。
代码是标准的 Perl 快餐式代码,简历但有效。
代码共享如下:


#!/usr/bin/perl -w
#
# SIteMap Maker By Easun(路杨)
# http://easun.org
#
use CGI();
my $cgi= new CGI;
use CGI::Carp qw(fatalsToBrowser); #打开浏览器检错,不需要请删除之。


#WebSite的变量设置
my $mydir ='/home/www/easun'; #没有'/'
my $url ='http://easun.org/'; #后面有'/'
my $xmlfile ='/home/www/easun/sitemap.xml'; #目标

print $cgi->header;

unlink $xmlfile; #先删除旧文件方便生成新的。

open LOG, ">>$xmlfile";
print LOG <<XMLHEAD;
<?xml version="1.0" encoding="UTF-8"?>
<urlset
  xmlns="http://www.google.com/schemas/sitemap/0.84"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84
                      http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">
XMLHEAD

&dodir($mydir,$url);
print LOG '</urlset>'."\n";
close LOG;

print 'That is all OK!';
exit;

sub dodir
{
my ($mydir,$url) =@_;

$url = $mydir.'/' unless $url;

opendir(DIR, $mydir);
my @files = readdir(DIR);
close(DIR);
 print '<ul>';
for (0 .. $#files)
{
my $name = $files[$_];
next if $name eq '.';
next if $name eq '..';
# 我的siteMap不想收录动态地址,如果你想收录,请修改下面的这句
next if $name =~ /^\.ht|\.pl$|\.pm$|\.cgi$|\.php$|\.asp$/i;
# 一些特殊目录也不想收录
next if $name eq 'static';

if (-d $mydir.'/'.$name) {&dodir($mydir.'/'.$name,$url.$name.'/'); next;};
my $mtime = xmltime ((stat($mydir.'/'.$name))[9]);
my $printname = $name eq 'index.html' ? '':$name;
# 开始当前文件
   print LOG '<url>'."\n";
   print LOG ' <loc>'.$url.$printname.'</loc>'."\n".' <priority>0.5</priority>'."\n".' <lastmod>'.$mtime.' </lastmod>'."\n";
   print LOG '</url>'."\n";
# 结束
  print '<li>'.$url.$printname.'<br />--On '.$mtime.' </li>';

}
  print '</ul>';
}

sub xmltime
{
my $time =shift;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime ($time);
sprintf ('%04d-%02d-%02dT%02d:%02d:%02dZ', $year + 1900, $mon + 1, $mday, $hour, $min,$sec);
}
1;


代码很简单,存成 sitemap.cgi 放在网站能执行 Perl_CGI 的目录,权限设置为 755,运行之。
SiteMap.xml 顺利生成。以后要是网站有了更新,重新运行一次就OK了。

关于SiteMap的一些资料,记录在下,供大家参看