今天要介绍的东西已经不算什么新的玩意儿了,几年前就有人各种介绍了,最近已经冷下来了。不过在现在恶劣的网络环境当中,这样的工具变得越来越有实用价值了。
我们知道通过 Google Reader 订阅的 RSS 源只要有更新就会被 Google 记录,从而即使原文被删除,Reader 中还是有原文的记录,于是我们甚至还可以通过 Google Reader API 获取历史 RSS 条目。所以像韩寒那样的博客在 Reader 中总是能够读到原文。
但是最近我发现新浪博客的停止了全文 RSS 源输出,而仅仅输出摘要,导致一旦文章被删,Reader 里也只剩下摘要了,再要找原文看就比较麻烦了。这时候我想到了 Yahoo! Pipes 这个异常强大好用的数据整合工具,给博客来做个全文 RSS 源应该是轻而易举吧。结果在创建过程当中,发现新浪博客在博客文章源码中做了一些很恶心的处理(见下图),会抽出文章中的几段文本,随即插入文章中,再设定样式将其隐藏,导致用普通的全文抓取的方法来制作 RSS 源会生成不少重复的文本块,插入文章中以后根本无法正常阅读。

幸好这“防御”措施还有规律可循,用正则替换就能轻松绕过,最后还是可以生成完美的全文 RSS 源的。下面就来分享一下这个过程吧,就以韩寒的博客为例:
- 首先要注册个 Yahoo! ID (废话),在 Pipes 主页 上方可以找到 “Create a pipe” 按钮,点之,就进入了 Pipe 编辑界面。左侧是模块选择区域,右侧是编辑区域。将一个个模块拖动到右侧相连接,控制模块的逻辑组合与输入输出,我们就可以对原始的数据进行一系列复杂的操作。
- 从左边找到 Sources > Fetch Feed 拖动到右侧编辑区域,添加一个 Feed 模块。在 URL 输入框里填入博客的 RSS 源地址:
http://blog.sina.com.cn/rss/1191258123.xml
这样这个模块输出的就是这个 RSS 源的数据,一切顺利的话,底部的 Debugger 区域就能显示出文章标题列表了。

- 找到 Operators > Loop 模块拖到右边,并将 Fetch Feed 模块的输出拖放到此模块的输入位置,表示对输入的列表元素进行循环处理。编辑具体处理的逻辑需要从左侧再拖动 Sources > Fetch Page 到 Loop 模块内,URL 选 item.link。下面的 Cut content from ... to ... 是用来截取需要的文本的。也就是把从上面 Feed 模块中得到的每个 item 的 URL 输入 Fetch Page 模块中,可以输出这个 URL 的源码,我们需要找到标志文章开始和结束的代码标记,从而程序可以将这之间的代码取出来作为输出数据。分析一下新浪博客的文章页源码,我们可以分别将开始和结束标记填为 “
<div id="sina_keyword_ad_area2" class="articalContent ">”及 “<INS>来源:”。Split using delimiter 这项只需留空即可,我们不需要再将内容进行分隔。最后,我们要将模块的输出重命名为 item.description。到这里我们已经用全文内容作为 description 将原来 feed 中的摘要覆盖了。接下来就要处理上面说到的新浪博客的重复文本问题了。

- 通过观察,新浪博客的隐藏文本都是放在一个 class 属性值为 MASS + 12 位字母数字的 span 元素中,所以只要将这个元素中的内容都过滤掉,就可以得到“干净”的文章内容了。从左边找 Operators > Loop 拖到右边,将上面模块的输出绑定。左边找到 String > String Regex 模块拖入 Loop 模块。For each 后面选择 item.description,来对前面的输出中的每篇文章内容做循环处理。replace 后面填入这个正则表达式:
<span class='MASS[a-zA-Z0-9]+'>[^>]*</span>,
然后将最下方的 assign results to 选为 item.description。最后,把整个模块的输出连到 Pipe output 模块,编辑过程就大功告成了。

- 点击右上角 Save 来保存配置,点击上方的 “Run Pipe...”,查看运行结果。在输出页面找到 Get as RSS 链接,这个链接的地址就是一个可用的 RSS 源了,在 Google Reader 中订阅吧!
这仅仅是对 Yahoo! Pipes 的一个简单应用,其实还有更多强大的功能我都没研究过,但仅仅利用这么一些初级的功能,我们已经可以得到一些实用的输出了。下面是我已经创建好的韩寒博客的全文 RSS 源,请自取。
Pipes 原始地址:
http://pipes.yahoo.com/pipes/pipe.run?_id=86b82a340ea9fa635fb4732e0e2819f1&_render=rss
Feedburner 烧制的源:
http://feeds.feedburner.com/twocoldfulltext
Enjoy~
12:56, 2011-12-25Andrew /
挺实用啊
23:12, 2011-12-25Alex /
你这个有点问题,正则是没有替换掉多余的新浪故意加的文字,我修改了一下,请见下面:
http://pipes.yahoo.com/pipes/pipe.info?_id=6304abbb98883f596e32f51fe1c5836c
欢迎邮件探讨。
00:01, 2011-12-26Justice /
@Alex
之前是好的,你改了哪儿了?加了个 Sub String 么?