无中生有:神器Yahoo!pipes之从静态网页到RSS订阅
Author:西格玛 IN:IT悟语, 我的大学, 网络 标签: Html, Regex, RSS, YahooPipes 评论: 6 自从上次写了“从邮箱查看学院新闻——网站信息的2.0大迁移(Beta)”之后,这个Beta版就石沉大海,什么RTM之类的完全没有,懒人自有懒的原因,本人也没怎么用学院新闻的RSS,回想起来惭愧之极,连维护的意识都没有,太没有艺德了… <扯淡> 只到偶尔见到某亮仔,问起上次那篇文章如何如何,这才想起来我这货除了扯皮之外也干过点儿事情,顿感有负国家四个现代化建设和和谐社会balabala对我的期望,内牛满面之余决定在这个大家都在狂刷学院新闻的多事之秋(你懂的)完成上次没有干完的活儿,以示对钓鱼岛主权的支持(汗……) </扯淡> 本文主要讲解从某某大学某学院学院新闻的静态PHP网页中制作全文RSS的过程,如果不想看其中的过程,可以直接跳转到最后看RSS的应用部分~ 对于RSS的介绍,上篇文章中已经说过了,简单的说,就是将信息以一个约定俗成的格式推送给你,而你可以决定用什么方式来阅读和处理这些信息(QQ阅读器、GoogleReader、甚至Windows的桌面小工具等等)。 RSS是一个好东西,他可以不限制你所访问的地方,而让你同时获取不同渠道的信息,但是一些网站,大抵是由于懒得做啊、懒得做啊或是懒得做之类的缘故(…),总之是自觉没有必要提供这样的东西,因此大家就只能痛苦的去登陆某网查看信息,这样当然不符合网络中心化的原则,因此,就有必要从静态网页着手,做一个RSS源。 之前提供的方法都是通过在线的一些服务商提供的RSS生成服务来进行的,虽然效率很高,但是这些服务商必然不能为你自己服务,要么有广告,要么有限制,人家是要赚money活路地,既然这样,就要寻找一些比较自由的方式,这样的神器当然也有,那就是传说中的YahooPipes! 以下是Yahoo Pipes的简介,来源:百度百科 Pipes is a powerful composition tool to aggregate, manipulate, and mashup content from around the web. 顾名思义,Pipes就是提供一个信息流动的“管道”,在管道中间,你可以定制规则,进行裁剪,定制信息等等工作,最后将输出的信息烧制成RSS供你使用~ 登录http://pipes.yahoo.com 如上图所示,点击Create a pipe 就可以免费创建一个自己的“管子”~ 当然,不知为何,pipes在教育网享受了http://www.python.org 一样的悲惨待遇,它的登录界面被Wall了,如果你在用教育网,请用搜狗浏览器开启教育网代理进行访问。 首先熟悉一下Pipes的工作环境,登录后点击Create a pipe 就会出现一个如下的工作界面: 左侧的工具栏中放着各种兵器,用于获取,处理各种信息格式,常用的有Source下,用于抓取网页代码的工具,Operations中放着Loop等常规操作方式,还有Regex等工具可以使用,之后会说到用法。工具的使用都靠“拖”,脑海中不禁浮现出了Csharp的英雄形象。Pipes的目标是大众化信息处理,因此上手并不难,拖动模块进入后,圆圈代表输入或输出,从任意一端点击那个“圈”就会出现pipe,拖动到另一个模块的圈上,两个模块就连接好了。 这里以学生周知http://ssdut.dlut.edu.cn/news/student.php为例,首先在Pipe中添加Sources下面的FetchPage一项,在URL中填入http://ssdut.dlut.edu.cn/news/student.php,这样网页的信息就输入到管道的“入口”了。下面打开上面的网页,右键点击选择查看源代码,可以看出,网站的有用信息是有一定格式的,它的开头和结尾和条目之间的分割如下: 开头:<td height=”24″ align=”center”> 结尾:<tr bgcolor=”#CCCCCC”> 分隔符:</tr> 这时再将输出与Outpu相连,就可以看到预输出结果。 这时条目的实际代码如下: 1. x00542c;说二补考安排”>2009级本科生英语听说二补考安排</a> 我们需要的信息实际上之有 http://ssdut.dlut.edu.cn/news/show.php?id=6310 这个link 和 “2009级本科生英语听说二补考安排” 这个title而已,其他的都是浮云,一个feed的一个条目最少需要这两个信息:link和title 但是我们的条目中目前只有一个孤军奋战的content 因此需要增加一些内容,将Operator下的Rename拖入工作区,并将Fetch的结果与之相连,然后如下操作: 这样就有了title与link两项,剩下的就是过滤掉没用的信息,留下有用的了,这时需要正则表达式起作用了~ 拖入Operator下的Regex模块,添入过滤用正则表达式: 这里的正则表达式如下: .*href=”(.*?)”.*”>(.*)</a.* 以下是分项解析: .* –> 表达任意数量的不包含换行的字符,我们这个例子里表达的就是…target=”_blank” href= –> 就是它本身href= “(.*?)” –> .*? 意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。小括号来指定子表达式(也叫做分组)。”代表它本身(也就是”) .*”> –> 表达的就是……x005b89;排”> (.*) –> 又表示了一个分组 </a.* --> <表示它本身(也就是<),/表示/(这里如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找本身,你也得用\)。这样,这里就表达成了</a> 2010-09-14 <a rel=”nofollow” target=”_blank” 这一连串字符 通过表达式过滤,获得了想要的部分,利用Regex模块,获取正确的信息: Regex模块的规则是这样的形式: In[element] replace [regex pattern] with [value] Value可以设置成任何字符,比方说我们输入狗*日的腾讯,就会显示成狗*日的腾讯。 实际上,link我们使用的是$1,这个就和我们前面使用的正则表达式有关了。 对于表达式之中匹配的()圆括号之类的内容,会为之创建带有数字编号的引用,引用的格式是以$美元符号开头,它就可以代替()圆括号内匹配的内容。 对于我们的正则表达式,我们使用了两个()圆括号,所以$1作为引用,它的内容就是(.*?)匹配出来的内容,就是我们所要寻找的link。$2作为引用,它的内容就是(.*)匹配出来的内容,就是我们所要寻找的title。 另外勾选上s 如刚才的图所示,这时,将输出与Output连接,就可以看到结果了: 这个Pipe就可以当成RSS用了,点击Save 起名,之后点击Run pipe 这时候结果就会在下方显示出来,点击获取RSS按钮,这时浏览器中的URL就是你烧出来的RSS了。 我烧制RSS的地址: http://pipes.yahoo.com/pipes/pipe.run?_id=4008466210fa86043ccdcee0388f4a6b&_render=rss 到这里,要求不高的童鞋可以拿去玩儿去了,起码可以做做标题党,然而这毕竟不符合我们的要求,为啥非得跳转下才能看新闻呢?因此这时我们需要全文RSS,就是将该新闻的内容一起和RSS的link与title推送过来,我们以刚刚做好的rss为蓝本,(当然一个普通的标准RSS也符合这个条件)制作一个全文RSS。 仍然新建一个Pipe,从Sources中拖入Fetch Feeds 添入刚刚做好的Rss地址: 与之前相比,多了一对乱码七糟的东西,那是yahoo给我们加上的RSS标准格式,这里不做介绍。既然有link,自然想到可以读link的页面,与之前获得item同样的原理去获取内容,但是条目很多,不至于一个个去访问,于是就要用到一个编程常用工具:Loop。将Operator下的Loop拖入工作区。 其中的For each是循环的迭代器接口,这里我们不用填写,当将Feed的输出与之连接时,它的默认值为feed item,就是对每个项如何如何操作,中间的区域就是我们要做的操作了,我们将Sources下面的Fetch Page拖入其中,那么每次loop就会执行Fetch 。在URL中,我们可以选择item.link一项,让它去fetch我们提供的link,就是新闻的链接页面了。我们如法炮制,分析新闻正文的页面: <td class=”content”><P>时间:9月15日(本周三)下午13:00</P> <P>地点:教学楼A415</P> <P>请补考同学准时参加。</P></td> </tr> 找了个短的,很明显,开始位置是<td class=”content”> 介绍位置</tr> 只有一个正文因此不用分割。 照搬的添入Fetch选项中,最后assign 选择all 就是将所有FetchLoop的结果保存到哪儿,我们RSS中声明正文的信息叫做item.description 因此添入,如图所示: 就这样,全文RSS的制作就完成了,可以点击Save 然后Run ,最后happy或者不happy(那是有bug,检查一下)的看到最终的结果,与上面一样,制成RSS,这个RSS地址就可以使用了。 用yahoo pipes产生的RSS与正常RSS使用一样,但是据说: 这样获取的全文RSS肯定没有直接获取的高效,大概会有半小时左右的延时吧。 全文RSS在这里!!: http://pipes.yahoo.com/pipes/pipe.run?_id=3ed58d9916f74a6f67963b5936032ad3&_render=rss 是可以正常使用的,使用方式参见上一篇文章“从邮箱查看学院新闻——网站信息的2.0大迁移(Beta)”以及到百度上Google一下Google Reader ,QQ reader和本地阅读器的使用方法。 这里提供使用的截图,看起来还是蛮不错的。 Google Reader QQ邮箱阅读器。 除此之外RSS还有很多神奇的用途,比如,人人的某些特殊用户可以导入新闻RSS,这样方便上人人的同学了解最新情况: 有了RSS 一些皆有可能。 本人制作的RSS只为个人用途,不保证RSS的实时性,30分钟至1小时的延时是正常现象,并且不保证信息的完整有效,对信息很苛刻的同学建议仍然坚持通过刷屏的方式查收信息,本RSS制作不触犯国家法律,不撞墙,不敏感,五毛退散…… 本人在这个敏感时期,仍然不无正业的做着基本上毫无意义的边角工作,是在是让我自己都感觉不争气,然而既已如此,那就只要放任,望广大童鞋以我为戒,不要无所事事,要为伟大的共产主义事业贡献终身… 1、http://bbs.pxysm.com/thread-5116-1-1.html 感谢RSS燃烧室http://cuefor.tk/ 提供了详细的教程支持,本文很多文章属于过度引用,请作者见谅。一、RSS和Yahoo!Pipes
二、从HTML下手获取RSS

于是在Cut content from 中写入 :<td height=”24″ align=”center”> to:<tr bgcolor=”#CCCCCC”> delimiter:</tr>
<a rel=”nofollow” target=”_blank” href=”http://ssdut.dlut.edu.cn/news/show.php?id=6310” title=”2009级本科生英语&#
2010-09-14
<a rel=”nofollow” target=”_blank” href=”http://ssdut.dlut.edu.cn/news/studentlist.php?comefrom=2″>教务办公室</a> 三、从RSS到全文RSS
三、RSS的使用
四、无耻的免责声明
五、杂记
六、参考文献















