全文Feed的终极解决方案

作者: 阮一峰

日期: 2010年4月17日

珠峰培训

正如我们都知道的,全文Feed最有用。

但是,世界上的大部分Feed,都是摘要Feed,甚至是标题Feed。我们只好自己动手,制作全文Feed。

传统的制作方法非常麻烦,需要针对不同的网站,编写不同的内容提取规则。要是有一个傻瓜型的"全文Feed生成器",把摘要Feed往里面一扔,全文Feed就自动生成了,那该多好。

FiveFilters.org提供的生成器,大概最接近于这种要求。

举例来说,网易的社会新闻Feed(http://news.163.com/special/00011K6L/rss_sh.xml)是一个摘要Feed。

我们把这个网址,送进FiveFilters.org,点击"Create Feed"按钮,全文Feed就自动产生了!(查看效果

但是,这个生成器并不是百用百灵,比如新浪的Feed(http://rss.sina.com.cn/news/society/focus15.xml)就无法抓取全文。

好在今年3月份,它开源了。作者Keyvan Minoukadeh将所有代码都公开了,所以如果遇到不能生效的Feed,现在我们就可以修改源码了。因此理论上,几乎所有的摘要Feed都可以自动转成全文Feed了。

源码存放在launchpad.net上,需要安装Bazaar的客户端才能下载。我为大家提供方便,把它们压缩成一个zip文件,点击下载(1.0版,217KB)。

下载后,上传到支持PHP 5.2的虚拟主机上,就可以直接使用。使用的时候,需要将cache子目录设为可写(权限777)。在config-sample.php文件中,可以查看设置选项,修改默认值后,将文件名改为config.php,就会生效。(不修改亦可,config文件并不是必需的。)

这个程序的核心是readability.php文件,它负责判断当前网页中,那一部分属于页面的主要内容,然后将其抓取出来。实现原理照搬了arc90的ReadAbility脚本。简单说,思路是这样的:1)检查页面中所有p元素的父容器;2)根据相关特征,为每一个父容器计算一个特征值;3)特征值最大的容器,就是放置主要内容的容器。

具体实现请阅读代码,源码写得非常清晰,而且有详细的注释。如果遇到不能抓取全文的Feed,你就要自己修改readability.php,增加相应的规则。比如,在我提供下载的代码中,我就设置了新浪网的规则,新浪网的全文Feed就能自动生成了。

这个程序使用的是AGPL许可证,这就是说你可以自由地使用、修改、发布这个程序,但是只要你向他人提供基于这个程序的服务,你就必须公开源码。

作者Keyvan Minoukadeh允诺,只要使用者向他捐款200美元,就发布2.0版。如果你喜欢这个程序,建议向他捐款

P.S.

这几天,我还发现了一个非常优秀的开源相册软件ZenPhoto,也推荐使用。

UPDATE(2010.6.3)

Full TEXT RSS 1.5版下载(283KB)

UPDATE(2010.11.10)

Full TEXT RSS 2.1版下载(362KB)

(完)

一灯学堂

留言(26条)

能不能介绍些Movable Type的文章,我比较喜欢它的静态页面,国内关于它的资料好像还不多。特别是MT5出来后,多页面功能可能会让刚接触的人晕头转向。

很好,谢谢作者,只是赶到花了大量的时间在新闻上似乎有点不利于思考。

用一个图书管理软件(BLM)整理了大学期间看过的书,仅有180本左右,汗颜,这就是我的大学……

现在参加工作了,好在业余时间还算充裕,希望可以多读一些书。

如果是手机RSS的话,摘要Feed比较好。一般浏览摘要,感兴趣的点进全文,这样比较节省流量。

嗯,野草一直在用他:)

引用AlbertDiao的发言:

如果是手机RSS的话,摘要Feed比较好。一般浏览摘要,感兴趣的点进全文,这样比较节省流量。

流量会越来越便宜,真正昂贵的是你的时间。所以还是全文Feed好。

引用zp的发言:

能不能介绍些Movable Type的文章。

我有这个打算,但是文章不太好写,还需要准备。

昨晚测试了此订阅
同时我也保留了原订阅。
今天发现,同样订阅了163新闻的情况下
全文订阅比官方订阅少了很多新闻
不知其他童靴有没有这样子情况

呵呵~ 这样都可以啊~

引用AlbertDiao的发言:

如果是手机RSS的话,摘要Feed比较好。一般浏览摘要,感兴趣的点进全文,这样比较节省流量。

我更喜欢全文博客,因为在手机上看Google Reader,自动都排好了版,而看全文的时候需要浏览器排版,没有Google Reader那样专门设计给手机的看着舒服。

另外,也可以用YAHOO PIPE 和YQL来抓取全文。这样除了可以把非全文的FEED变成全文输出外,还可以处理根本没有FEED输出的网页。(不过有很多网页需要处理一下GB2312和UNICODE转换。).而且这样还有一个最大的好处,就是不用建立自己的服务器。


下面两个FEED 就是用这种办法生成的。
http://feeds.feedburner.com/wenxuecity_news

http://feeds.feedburner.com/boxun_headline

可以用GOOGLE READER 来读取它们。也不失为一种间接翻越G/F/W 的办法。

引用luops的发言:

全文订阅比官方订阅少了很多新闻

全文Feed默认只有4个条目,下载代码后,你可以自己修改这个值。

不懂编程只会用GR的文科生飘过~~~
ps:阮老师的这篇文章GR里也只是显示标题,所以漂洋过海地过来了(牛博编辑的那个频道,已经将你的博客订阅了呵O(∩_∩)O)~~

引用luops的发言:

全文订阅比官方订阅少了很多新闻


是这样的,丢失了好多,时效性好差

想请教一下你怎么修改规则来全文输出新浪网rss的, 我也碰到几个Feed,缺省的配置不能正确处理.
另外我建议设立一个地方大家可以交流一下脚本不能处理的feed,以及修改的方法, 这样各人不用重复浪费时间了.

下载了lz的代码,发布到网站上,功能可用了。rss数量自己设置就好。

杯具的是网站只有内网地址,gr不认生成的feed地址。

只能CS订阅,不喜。

http://mrss.dokoda.jp/
虽然是小鬼子的网站,但是是我找到的能够全文Feed最好的在线工具了,和LZ推荐的网站相比,可以输出所有项目,而没有4条目的限制,当然也不必自己搭建服务器,日文内容很简单,如果使用的是FF或Chrome浏览器还可以利用Google的自动翻译功能将大致内容翻译为中文(FF利用Google Toolbar)——其实即使不翻译一样很容易使用。

引用kuber的发言:

想请教一下你怎么修改规则来全文输出新浪网rss的, 我也碰到几个Feed,缺省的配置不能正确处理.

新浪的内容容器,有一个比较怪的ID名。只要搜索这个字符串,就能提取内容了。

最终,你还是需要读readability.php的代码,只要读懂了,我觉得任何页面都能提取。

哇 源码写得相当清爽啊~注释习惯很棒

有人在appspot上部署了一个python的port
http://andrewtrusty.appspot.com/readability/
这个没有4篇post的限制

很好用,谢谢!

博主,作者把1.5版本放出来了,
可否再麻烦你打包一下,我bazzar一直不成功

引用harvey的发言:

博主,作者把1.5版本放出来了,
可否再麻烦你打包一下,我bazzar一直不成功

已经加上去了,:-)

博主,全文Feed默认只有4个条目,下载代码后,修改哪段代码可以改变这个值啊,config-sample.PHP中的数值吗?我是新手,希望博主指点一下,谢谢。

看不懂readability,不知道博主能否提供一下过滤页面上的干扰字符的方法

提一个小意见,有的PHP环境中会有警告信息:“Creating default object from empty value”
在makefulltextfeed.php的第73行(2.1版代码),需要在这里加一行
$options = new stdClass();
对$options进行初始化,这样更加规范

源码现在已经不在launchpad.net上了,现在托管在Bitbucket上
http://code.fivefilters.org/
现在版本已经变化好大了啊

这个网站现在在卖授权,而且很贵。。。

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接