作者:车东 发表于:2004-12-11 00:12 最后更新于:2007-04-15 19:04
版权声明:可以任意转载,转载时请务必以超链接形式标明文章和作者信息及本版权声明

最近搜集RSS解析工具中找到了MagPieRSS 和基于其设计的Lilina;Lilina的主要功能:

1 基于WEB界面的RSS管理:添加,删除,OPML导出,RSS后台缓存机制(避免对数据源服务器产生过大压力),ScriptLet: 类似于Del.icio.us it的收藏夹即时订阅JS脚本;

2 前台发布:将自己的首页改成了用Lilina发布我常看的几个朋友的网志,也省去了很多更新自己网页的工作,需要php 4.3 + mbstring iconv
lilina.png
开源软件对i18n的支持越来越好了,php 4.3.x,’–enable-mbstring’ ‘–with-iconv’后比较好的同时处理了UTF-8和其他中文字符集发布的RSS。
需要感谢Steve在PHP进行转码方面MagPieRSS进行和XML Hacking工作。至少目前为止:Add to my yahoo还不能很好的处理utf-8字符集的RSS收藏

记得年初Wen Xin在CNBlog的研讨会上介绍了个人门户的概念,随着RSS在CMS技术中的成熟,越来越多的服务可以让个人用户根据自己需求构建门户,也算是符合了互联网的非中心化趋势吧,比如利用Add to My Yahoo!功能,用户可以轻松的实现自己从更多数据源进行新闻订阅。想象一下把你自己的del.icio.us书签收藏 / flickr图片收藏 / Yahoo!新闻都通过这样一个RSS聚合器聚合/发布起来。其传播效率将有多快。

好比软件开发通过中间平台/虚拟机实现:一次写成,随处运行(Write once, run anywhere),通过RSS/XML这个中间层,信息发布也实现了:一次写成,随处发布(Write once, publish anywhere…)

安装Lilina需要PHP 4.3 以上,并带有iconv mbstring等函数的支持,请确认一下PHP模块的支持:’–enable-mbstring’ ‘–with-iconv’

另外就是一个需要能通过服务器端向外部服务器发送RPC请求,这点51.NET不支持。感觉PowWeb的服务很不错,很多缺省的包都安装好了:

iconv
iconv support enabled
iconv implementation unknown
iconv library version unknown

Directive Local Value Master Value
iconv.input_encoding ISO-8859-1 ISO-8859-1
iconv.internal_encoding ISO-8859-1 ISO-8859-1
iconv.output_encoding ISO-8859-1 ISO-8859-1

mbstring
Multibyte Support enabled
Japanese support enabled
Simplified chinese support enabled
Traditional chinese support enabled
Korean support enabled
Russian support enabled
Multibyte (japanese) regex support enabled

将安装包解包(下载文件扩展名是.gz 其实是.tgz,需要重命名一下):上传到服务器相应目录下,注意:相应cache目录和当前目录的可写入属性设置,然后配置一下conf.php中的参数即可开始使用。

何东给我的建议:
1)右边的一栏,第一项的sources最好跟hobby、友情链接一样,加个图片。
2)一堆检索框在那儿,有些乱,建议只有一个,其它的放到一个二级页面上。
3)把联系方式及cc,分别做成一条或一个图片,放在右边一栏中,具体的内容可以放到二级页面上,因为我觉得好象没有多少人会细读这些文字。
4)如果可能,把lilina的头部链接汉化一下吧?

一些改进计划:
1 删除过长的摘要,可以通过寻找第2个"

" 实现;
2 分组功能:将RSS进行组输出;

修改默认显示实现:Lilina缺省显示最近1天发表的文章,如果需要改成其他时间周期可以找到:
$TIMERANGE = ( $_REQUEST[‘hours’] ? $_REQUEST[‘hours’]*3600 : 3600*24 ) ;

进行改动。

RSS是一个能将自己的所有资源:WIKI / BLOG / 邮件聚合起来的轻量级协议,以后无论你在何处书写,只要有RSS接口就都可以通过一定方式进行再次的汇聚和发布起来,从而大大提高了个人知识管理和发布/传播效率。

以前对RSS理解非常浅:不就是一个DTD嘛,真了解起解析器来,才知道namespace的重要性,一个好的协议也应该是这样的:并非没有什么可加的,但肯定是没有什么可“减”的了,而真的要做到这个其实很难很难……。

我会再尝试一下JAVA的相关解析器,将其扩展到WebLucene项目中,更多Java相关Open Source RSS解析器资源

另外找到的2个使用Perl进行RSS解析的包:
使用XML::RSS::Parser::LiteXML::RSS::Parser 解析RSS

XML::RSS::Parser::Lite的代码样例如下:

#!/usr/bin/perl -w
# $Id$
# XML::RSS::Parser::Lite sample

use strict;
use XML::RSS::Parser::Lite;
use LWP::Simple;

my $xml = get("http://www.klogs.org/index.xml");
my $rp = new XML::RSS::Parser::Lite;
$rp->parse($xml);

# print blog header
print "<a href=\"".$rp->get(‘url’)."\">" . $rp->get(‘title’) . " – " . $rp->get(‘description’) . "</a>\n";

# convert item to <li>
print "<ul>";
for (my $i = 0; $i < $rp->count(); $i++) {
my $it = $rp->get($i);
print "<li><a href=\"" . $it->get(‘url’) . "\">" . $it->get(‘title’) . "</a></li>\n";
}
print "</ul>";

安装:
需要SOAP-Lite

优点:
方法简单,支持远程抓取;

缺点:
只支持title, url, description这3个字段,不支持时间字段,

计划用于简单的抓取RSS同步服务设计:每个人都可以出版自己订阅的RSS。

XML::RSS::Parser代码样例如下:
#!/usr/bin/perl -w
# $Id$
# XML::RSS::Parser sample with Iconv charset convert

use strict;
use XML::RSS::Parser;
use Text::Iconv;
my $converter = Text::Iconv->new("utf-8", "gbk");

my $p = new XML::RSS::Parser;
my $feed = $p->parsefile(‘index.xml’);

# output some values
my $title = XML::RSS::Parser->ns_qualify(‘title’,$feed->rss_namespace_uri);
# may cause error this line: print $feed->channel->children($title)->value."\n";
print "item count: ".$feed->item_count()."\n\n";
foreach my $i ( $feed->items ) {
map { print $_->name.": ".$converter->convert($_->value)."\n" } $i->children;
print "\n";
}

优点:
能够直接将数据按字段输出,提供更底层的界面;

缺点:
不能直接解析远程RSS,需要下载后再解析;

2004-12-14:
从cnblog的Trackback中了解到了Planet RSS聚合器

Planet的安装:解包后,直接在目录下运行:python planet.py examples/config.ini 就可以在output目录中看到缺省样例FEED中的输出了index.html,另外还有opml.xml和rss.xml等输出(这点比较好)

我用几个RSS试了一下,UTF-8的没有问题,但是GBK的全部都乱码了,planetlib.py中和XML字符集处理的只有以下代码:看来所有的非UTF-8都被当作iso8859_1处理了:
try:
data = unicode(data, "utf8").encode("utf8")
logging.debug("Encoding: UTF-8")
except UnicodeError:
try:
data = unicode(data, "iso8859_1").encode("utf8")
logging.debug("Encoding: ISO-8859-1")
except UnicodeError:
data = unicode(data, "ascii", "replace").encode("utf8")
logging.warn("Feed wasn’t in UTF-8 or ISO-8859-1, replaced " +
"all non-ASCII characters.")

近期学习一下Python的unicode处理,感觉是一个很简洁的语言,有比较好的try … catch 机制和logging

关于MagPieRSS性能问题的疑虑:
对于Planet和MagPieRSS性能的主要差异在是缓存机制上,关于使用缓存机制加速WEB服务可以参考:可缓存的cms设计

可以看到:Lilina的缓存机制是每次请求的时候遍历缓存目录下的RSS文件,如果缓存文件过期,还要动态向RSS数据源进行请求。因此不能支持后台太多的RSS订阅和前端大量的并发访问(会造成很多的I/O操作)。

Planet是一个后台脚本,通过脚本将订阅的RSS定期汇聚成一个文件输出成静态文件。

其实只要在MagPieRSS前端增加一个wget脚本定期将index.php的数据输出成index.html,然后要求每次访问先访问index.html缓存,这样不就和Planet的每小时生成index.html静态缓存一样了吗。

所以在不允许自己配置服务器脚本的虚拟主机来说Planet根本是无法运行的。

更多关于PHP中处理GBK的XML解析问题请参考:
MagPieRSS中UTF-8和GBK的RSS解析分析

2004-12-19
正如在SocialBrain 2005年的讨论会中,Isaac Mao所说:Blog is a ‘Window’, also could be a ‘Bridge’,Blog是个人/组织对外的“窗口”,而RSS更方便你将这些窗口组合起来,成为其间的“桥梁”,有了这样的中间发布层,Blog不仅从单点发布,更到P2P自助传播,越来越看到了RSS在网络传播上的重要性。