[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

[MT Tips]如何让某个日志在Blog首页固顶?

貌似最简单的办法就是修改日期到一个很遥远的日期,比如 AnySQL 那样:) 但是带来的问题的很多,比如导致Feed阅读器犯糊涂或者影响搜索引擎的收录等等,更糟糕的是对于 日志来说,最主要的就是发布日期。也许大家都已经发现了,我的主页模仿 MT Forum 搞了一个固顶日志(也是为了风格统一)出来,这个固顶日志是后台通过自己设置实现的。是怎么设置的。答案是利用 <mt:Entries> 的tags 功能。 具体概念代码如下:<mt:Entries tag="@top" sort_by="authored_on" sort_order="descend" limit="1" blog_ids="1,5"> dosthing.....</mt:Entries> 这样我们只要要在固定的主题 加上…

北京 Perl Workshop 2008 网站开张 - 接受大会注册,演讲报名

网站开张了, 地址是 http://conference.perlchina.org/bjpw2008/ 由 PerlChina 和 Postgresql China 合办,2008 年 11 月 8 号举行的 Beijing Perl Workshop 是一个免费的 Perl 交流会,向所有对…

好玩的 MT Forum 的按作者归档

Perl Forum 用 MT4 的 MT Forum 的功能搭建起来了好几天了,一直没有发现什么意外,今天突然发现 按作者按月归档 貌似找完了整个发布完的 Perl Forum 也没有找到 link ,查看作者个人信息貌似也没有 link ? 真是好玩的 归档方式。从后台看,给每个用户(作者)都建立了按月的归档页面,估计是为了便于各用户归档自己的文章吧? 后台抓图如下:…