最近搜集RSS解析工具中找到了MagPieRSS 和基于其設計的Lilina;Lilina的主要功能:
1 基于WEB界面的RSS管理:添加,刪除,OPML導出,RSS后臺緩存機制(避免對數據源服務(wù)器產(chǎn)生過(guò)大壓力),ScriptLet: 類(lèi)似于Del.icio.us it的收藏夾即時(shí)訂閱JS腳本;
2 前臺發(fā)布:將自己的首頁(yè)改成了用Lilina發(fā)布我??吹膸讉€(gè)朋友的網(wǎng)志,也省去了很多更新自己網(wǎng)頁(yè)的工作,需要php 4.3 + mbstring iconv

記得年初Wen Xin在CNBlog的研討會(huì )上介紹了個(gè)人門(mén)戶(hù)的概念,隨著(zhù)RSS在CMS技術(shù)中的成熟,越來(lái)越多的服務(wù)可以讓個(gè)人用戶(hù)根據自己需求構建門(mén)戶(hù),也算是符合了互聯(lián)網(wǎng)的非中心化趨勢吧,比如利用Add to My Yahoo!功能,用戶(hù)可以輕松的實(shí)現自己從更多數據源進(jìn)行新聞?dòng)嗛?。想象一下把你自己的del.icio.us書(shū)簽收藏 / flickr圖片收藏 / Yahoo!新聞都通過(guò)這樣一個(gè)RSS聚合器聚合/發(fā)布起來(lái)。其傳播效率將有多快。
好比軟件開(kāi)發(fā)通過(guò)中間平臺/虛擬機實(shí)現:一次寫(xiě)成,隨處運行(Write once, run anywhere),通過(guò)RSS/XML這個(gè)中間層,信息發(fā)布也實(shí)現了:一次寫(xiě)成,隨處發(fā)布(Write once, publish anywhere...)
安裝Lilina需要PHP 4.3 以上,并帶有iconv mbstring等函數的支持,請確認一下PHP模塊的支持:‘--enable-mbstring‘ ‘--with-iconv‘
另外就是一個(gè)需要能通過(guò)服務(wù)器端向外部服務(wù)器發(fā)送RPC請求,這點(diǎn)51.NET不支持。感覺(jué)PowWeb的服務(wù)很不錯,很多缺省的包都安裝好了:
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 其實(shí)是.tgz,需要重命名一下):上傳到服務(wù)器相應目錄下,注意:相應cache目錄和當前目錄的可寫(xiě)入屬性設置,然后配置一下conf.php中的參數即可開(kāi)始使用。
何東給我的建議:
1)右邊的一欄,第一項的sources最好跟hobby、友情鏈接一樣,加個(gè)圖片。
2)一堆檢索框在那兒,有些亂,建議只有一個(gè),其它的放到一個(gè)二級頁(yè)面上。
3)把聯(lián)系方式及cc,分別做成一條或一個(gè)圖片,放在右邊一欄中,具體的內容可以放到二級頁(yè)面上,因為我覺(jué)得好象沒(méi)有多少人會(huì )細讀這些文字。
4)如果可能,把lilina的頭部鏈接漢化一下吧?
一些改進(jìn)計劃:
1 刪除過(guò)長(cháng)的摘要,可以通過(guò)尋找第2個(gè)"
" 實(shí)現;
2 分組功能:將RSS進(jìn)行組輸出;
修改默認顯示實(shí)現:Lilina缺省顯示最近1天發(fā)表的文章,如果需要改成其他時(shí)間周期可以找到:
$TIMERANGE = ( $_REQUEST[‘hours‘] ? $_REQUEST[‘hours‘]*3600 : 3600*24 ) ;
進(jìn)行改動(dòng)。
RSS是一個(gè)能將自己的所有資源:WIKI / BLOG / 郵件聚合起來(lái)的輕量級協(xié)議,以后無(wú)論你在何處書(shū)寫(xiě),只要有RSS接口就都可以通過(guò)一定方式進(jìn)行再次的匯聚和發(fā)布起來(lái),從而大大提高了個(gè)人知識管理和發(fā)布/傳播效率。
以前對RSS理解非常淺:不就是一個(gè)DTD嘛,真了解起解析器來(lái),才知道namespace的重要性,一個(gè)好的協(xié)議也應該是這樣的:并非沒(méi)有什么可加的,但肯定是沒(méi)有什么可“減”的了,而真的要做到這個(gè)其實(shí)很難很難……。
我會(huì )再?lài)L試一下JAVA的相關(guān)解析器,將其擴展到WebLucene項目中,更多Java相關(guān)Open Source RSS解析器資源。
另外找到的2個(gè)使用Perl進(jìn)行RSS解析的包:
使用XML::RSS::Parser::Lite和XML::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
優(yōu)點(diǎn):
方法簡(jiǎn)單,支持遠程抓??;
缺點(diǎn):
只支持title, url, description這3個(gè)字段,不支持時(shí)間字段,
計劃用于簡(jiǎn)單的抓取RSS同步服務(wù)設計:每個(gè)人都可以出版自己訂閱的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";
}
優(yōu)點(diǎn):
能夠直接將數據按字段輸出,提供更底層的界面;
缺點(diǎn):
不能直接解析遠程RSS,需要下載后再解析;
2004-12-14:
從cnblog的Trackback中了解到了Planet RSS聚合器
Planet的安裝:解包后,直接在目錄下運行:python planet.py examples/config.ini 就可以在output目錄中看到缺省樣例FEED中的輸出了index.html,另外還有opml.xml和rss.xml等輸出(這點(diǎn)比較好)
我用幾個(gè)RSS試了一下,UTF-8的沒(méi)有問(wèn)題,但是GBK的全部都亂碼了,planetlib.py中和XML字符集處理的只有以下代碼:看來(lái)所有的非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.")
近期學(xué)習一下Python的unicode處理,感覺(jué)是一個(gè)很簡(jiǎn)潔的語(yǔ)言,有比較好的try ... catch 機制和logging
關(guān)于MagPieRSS性能問(wèn)題的疑慮:
對于Planet和MagPieRSS性能的主要差異在是緩存機制上,關(guān)于使用緩存機制加速WEB服務(wù)可以參考:可緩存的cms設計。
可以看到:Lilina的緩存機制是每次請求的時(shí)候遍歷緩存目錄下的RSS文件,如果緩存文件過(guò)期,還要動(dòng)態(tài)向RSS數據源進(jìn)行請求。因此不能支持后臺太多的RSS訂閱和前端大量的并發(fā)訪(fǎng)問(wèn)(會(huì )造成很多的I/O操作)。
Planet是一個(gè)后臺腳本,通過(guò)腳本將訂閱的RSS定期匯聚成一個(gè)文件輸出成靜態(tài)文件。
其實(shí)只要在MagPieRSS前端增加一個(gè)wget腳本定期將index.php的數據輸出成index.html,然后要求每次訪(fǎng)問(wèn)先訪(fǎng)問(wèn)index.html緩存,這樣不就和Planet的每小時(shí)生成index.html靜態(tài)緩存一樣了嗎。
所以在不允許自己配置服務(wù)器腳本的虛擬主機來(lái)說(shuō)Planet根本是無(wú)法運行的。
更多關(guān)于PHP中處理GBK的XML解析問(wèn)題請參考:
MagPieRSS中UTF-8和GBK的RSS解析分析
2004-12-19
正如在SocialBrain 2005年的討論會(huì )中,Isaac Mao所說(shuō):Blog is a ‘Window‘, also could be a ‘Bridge‘,Blog是個(gè)人/組織對外的“窗口”,而RSS更方便你將這些窗口組合起來(lái),成為其間的“橋梁”,有了這樣的中間發(fā)布層,Blog不僅從單點(diǎn)發(fā)布,更到P2P自助傳播,越來(lái)越看到了RSS在網(wǎng)絡(luò )傳播上的重要性。
Posted by chedong at December 11, 2004 12:34 AM Edit
聯(lián)系客服