利用Yahoo! Pipes制作全文RSS源

今天要介绍的东西已经不算什么新的玩意儿了,几年前就有人各种介绍了,最近已经冷下来了。不过在现在恶劣的网络环境当中,这样的工具变得越来越有实用价值了。

我们知道通过 Google Reader 订阅的 RSS 源只要有更新就会被 Google 记录,从而即使原文被删除,Reader 中还是有原文的记录,于是我们甚至还可以通过 Google Reader API 获取历史 RSS 条目。所以像韩寒那样的博客在 Reader 中总是能够读到原文。

但是最近我发现新浪博客的停止了全文 RSS 源输出,而仅仅输出摘要,导致一旦文章被删,Reader 里也只剩下摘要了,再要找原文看就比较麻烦了。这时候我想到了 Yahoo! Pipes 这个异常强大好用的数据整合工具,给博客来做个全文 RSS 源应该是轻而易举吧。结果在创建过程当中,发现新浪博客在博客文章源码中做了一些很恶心的处理(见下图),会抽出文章中的几段文本,随即插入文章中,再设定样式将其隐藏,导致用普通的全文抓取的方法来制作 RSS 源会生成不少重复的文本块,插入文章中以后根本无法正常阅读。
新浪博客文章源码

幸好这“防御”措施还有规律可循,用正则替换就能轻松绕过,最后还是可以生成完美的全文 RSS 源的。下面就来分享一下这个过程吧,就以韩寒的博客为例:

  1. 首先要注册个 Yahoo! ID (废话),在 Pipes 主页 上方可以找到 “Create a pipe” 按钮,点之,就进入了 Pipe 编辑界面。左侧是模块选择区域,右侧是编辑区域。将一个个模块拖动到右侧相连接,控制模块的逻辑组合与输入输出,我们就可以对原始的数据进行一系列复杂的操作。
  2. 从左边找到 Sources > Fetch Feed 拖动到右侧编辑区域,添加一个 Feed 模块。在 URL 输入框里填入博客的 RSS 源地址:
    http://blog.sina.com.cn/rss/1191258123.xml
    这样这个模块输出的就是这个 RSS 源的数据,一切顺利的话,底部的 Debugger 区域就能显示出文章标题列表了。
    Added Fetch Feed
  3. 找到 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 中的摘要覆盖了。接下来就要处理上面说到的新浪博客的重复文本问题了。
    Loop Page
  4. 通过观察,新浪博客的隐藏文本都是放在一个 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 模块,编辑过程就大功告成了。
    Filter Content
  5. 点击右上角 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~

Comments (3)

  1. 12:56, 2011-12-25Andrew  / Reply

    挺实用啊

  2. 23:12, 2011-12-25Alex  / Reply

    你这个有点问题,正则是没有替换掉多余的新浪故意加的文字,我修改了一下,请见下面:
    http://pipes.yahoo.com/pipes/pipe.info?_id=6304abbb98883f596e32f51fe1c5836c
    欢迎邮件探讨。

  3. 00:01, 2011-12-26Justice  / Reply

    @Alex
    之前是好的,你改了哪儿了?加了个 Sub String 么?

Leave a Reply

Allowed Tags - You may use these HTML tags and attributes in your comment.

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Pingbacks (0)

› No pingbacks yet.