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

| 8 Comments | 1 TrackBack | WebBlog Articles

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的一些资料,记录在下,供大家参看

引用通告|TrackBacks (1)

本日志的TrackBack URL: http://easun.org/cgi-bin/mtos/tb_mt_41.pl/63.

以下罗列的是网络上引用了本日志 [[Perl脚本]Perl写的生成 Google SiteMap 的小程序] 的 Blog 连接。

顺手写的代码。 用于自动提交自己Website SiteMap的修改到Google,是这里("[Perl脚本]Perl写的生成 Google SiteMap 的小程序")的附加而已。 详细Perl程序如下:... [阅读更多...]

本文相关评论|Comments (8)

果然是自己动手丰衣足食挖~~~嘿嘿~~

呵呵,还行。回家了。

咦……wood后面多了个小人儿~~~貌似资料页面呢~~~忽然冒出来的,嘿嘿~~
PS 也该回去了呢~~~晚安~~:)

这个东西,注意上面有个"登陆",到那里申请一个帐号,以后就不用输入了。而且也会有这个头像。
PS:默认的不好看,换一个。

那个……速度真够可观的。。-_-|||
00:10……汗。。。
貌似老哥单位零点就断网的……周末例外么~~~

周五,周六晚上不断。
PS:那个的好处就是能把你的身份认证下来而已。

那个……木有明白呀……
有没有白痴可以听得懂的说法?

Ok,谢谢路杨,先Google书签了,日后再改:)

发表该文评论|Leave a comment

最近发表|Recent Entries

[八卦]话说修路这件事

建国路貌似又在修。根本没有办法步行。这个让我想起来一个笑话:话说某A国人来北京,在东城区丢了一枚戒指,于是乎找警察,警察告诉他尽可能的帮他找。过了几天,此人发现整个东城的马路都挖开了,于是感叹曰:北京的警察真好。看来这个笑话的地点可以换在朝阳了?是不是某人的戒指又丢了?PS: 城市规划城市规划,年年挖年年修。。。生命不休,挖路不止…

[SiteLog]Blog升级到了 Movable Type Pro 4.25

Thisi is a SiteLog of Easun's WebBlog.今天终于升级到了 Movable Type Pro 4.25 ,貌似一切顺利,也没有发现什么特别大的改动?只是 Community Pack 变成了 1.62, Professional Pack 升级成了1.3 。其他的一切顺利,模版也没有修改,我甚至连重建前台HTML的事情都没有做。。。就这样吧,继续用这个风格,等有时间了再慢慢研究吧。如果非要说有什么修改的话,就是评论的登陆方式又丰富了很多,包括…

IE脚本错误,可以尝试以下办法

IE 脚本错误是个很麻烦的问题,一般定位都是 JS 引擎 和 VB 引擎出错。但是有时间反复注册 jscript.dll 和 vbscript.dll 也不能解决问题。具体表现 部分 js 解析正常,而部分就不行,尤其是基于 Web2.0的网站。不说别的,就连 ie7/ie8 本身第一次运行向导的"保存设置"也出错。其实研究下,貌似都出现在 XML 解释上? 重新注册…