Huginn: 烧录RSS的神器

转自简书

http://www.jianshu.com/p/4a47e452abc9

作者 笠三叶

Huginn Logo

RSS重度用户,应该都会关注三件事:

  • 摘要RSS 转为 全文RSS
  • 为不提供RSS的网站,制作全文RSS
  • 根据关键词等条件,过滤RSS

在以前,Yahoo Pipes可以做这三件事儿。但Yahoo Pipes关闭以后呢?

这篇小文介绍一个很棒的替代品,Github上有一万多收藏的明星项目:Huginn(链接)。


提示
使用Huginn需具备最起码的折腾能力,和这些前提知识:

  • Linux基本操作
  • CSS基本使用
  • Xpath基本使用
  • RSS最基本知识
  • JSON最基本知识

1. 什么是Huginn

Huginn是将信息流组装、拼接和变形的一个工具。如果你听说过IFTTT(链接),Huginn约等于加强版的IFTTT。它能:

  • 监控天气预报,如果明天下雨,则给你发送提醒;
  • 监控某款商品的网页,一旦降价,通知你;
  • 监控游戏官网,一旦游戏有发售或新动态,通知你;
  • ……

官方WIKI(链接)内有更多例子。但为了不跑题,这篇短文只围绕RSS方面的应用来说。


2. Huginn怎样工作

Huginn中的关键概念Agent,就类似于IFTTT中的Recipe。如果你不了解IFTTT,那我们从头说起:

要给不提供RSS的网站制作全文RSS,这件事儿可以被比喻成,要把原木材制作成一套高脚桌椅。那么就需要一个“家具厂”来做。Huginn就像是这一座RSS的“家具厂”:

木材是原材料,被运进工厂,1号车间木材加工成板材,2号车间把板材组装成原木桌椅,3号车间将原木桌椅喷涂外漆和装箱,最终出厂的是商品:高脚桌椅

Huginn就像这一条流水线:

  • 出厂的高脚桌椅,即最终产物,比喻烧制成功的、我们需要的全文RSS
  • 原材料木材,即待处理的素材,比喻不提供RSS的网站,或等待被加工的原始RSS源

Agent Event Flow流水线

那么显然,这里的关键问题是,怎样把平淡无奇的木材(不提供RSS的网站),逐步加工成有价值的高脚桌椅(全文RSS)呢?

当然门道都在车间上!

使用几台车间?用什么类型的车间?所需的这几种类型车间有现成的吗?这都是要考虑的问题。而使用Huginn也完全一样的。


在Huginn中,这三组干活儿的车间,就被称作Agent

用Huginn 90%的时间,都是在操作Agent:用几个车间/Agent?什么类型的车间/Agent?我需要的车间/Agent,Huginn有提供吗?

例如,这是我创建的一部分Agent:

Agent页面

车间/Agent之间传递的,前一个车间/Agent传递给下一个车间/Agent板材/原木桌椅/中间物料,被Huginn称作Event


所以,整套过程是:

最初的素材A(或者是等待烧制RSS的网站,或者是摘要RSS),进入Huginn/工厂,通过一个又一个的Agent/车间流水线,在工厂内存在形态是Event,最终变成了我们想要的成品B(全文RSS)。

那么显然,Huginn能做什么,不能做什么,关键看它提供了哪些Agent。而我们用Huginn烧制RSS,关键就是选择它提供的一个个Agent,填入地址和必要的参数,等着输出全文RSS就行了。


下面就以具体例子演示,当想把一个摘要RSS转换成全文RSS时,创建几个Agent、哪些类型的Agent。


3. 举例:摘要RSS 转 全文RSS

比如我要把纽约时报的摘要RSS(链接),转换成全文RSS呢?也就是说,摘要RSS相当于木材,我想制作的全文RSS相当于高脚桌椅。那么,我要创建哪些Agent/车间,来完成这活儿呢?

如同把大象放进冰箱一样,只需把这活儿拆解成三步,即三个Agent

  1. 获取纽时的摘要RSS
  2. 去依次访问其中每个URL,抓取全文
  3. 把抓取的全文,再包装回RSS,输出订阅地址

这三个Agent,Huginn都已经提供了模板,只需要往里面填地址、写属性就行了,很简单。

3.1. 获取原始摘要RSS

比如第一步,获取纽约时报摘要RSS的Agent。Huginn里获取RSS的Agent,叫做RSSAgent,因此我们创建一个RSSAgent,填写入纽时的RSS地址:

{
  "expected_update_period_in_days": "14",
  "clean": "false",
  "url": "http://cn.nytimes.com/rss.html"
}

上面各项参数的含义,在创建Agent的页面上就有帮助说明。例如expected_update_period_in_days表示估计这个RSS源更新的频率。

创建成功后,Agent就有了一个专属页面:

单个Agent页面

当该Agent运行后,就去抓取RSS源,获取到许多Feed Entry。每一条取到的Feed就等于是一条中间物料/板材/Event,例如其中一个Event如下:

{
  "id": "http://cn.nytimes.com/health/20151110/c10pressure/",
  "date_published": "2015-11-10 10:12:35 +0800",
  "last_updated": "Tue, 10 Nov 2015 10:12:35 +0800",
  "url": "https://d3qlz4p8smvoli.cloudfront.net/health/20151110/c10pressure/",
  "urls": [
    "https://d3qlz4p8smvoli.cloudfront.net/health/20151110/c10pressure/"
  ],
  "description": "传统的收缩压标准将140毫米汞柱上下为正常,但美国研究人员最新发现,收缩压如果保持在120毫米汞柱以下,可以使发生心血管疾病或中风的风险降低25%。<p>![布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。 Charlie Mahoney for The New York Times](http://upload-images.jianshu.io/upload_images/206186-3efd2089eb6b1781.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<\/p>                <p style='text-align: right; color: gray; font-size: 11px!important; line-height: 10px;'>Charlie Mahoney for The New York Times<\/p>                <p style='text-align: left; color: gray; font-size: 11px!important; line-height: 10px;'>布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。<\/p>                ",
  "content": "传统的收缩压标准将140毫米汞柱上下为正常,但美国研究人员最新发现,收缩压如果保持在120毫米汞柱以下,可以使发生心血管疾病或中风的风险降低25%。<p>![布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。 Charlie Mahoney for The New York Times](http://upload-images.jianshu.io/upload_images/206186-3efd2089eb6b1781.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<\/p>                <p style='text-align: right; color: gray; font-size: 11px!important; line-height: 10px;'>Charlie Mahoney for The New York Times<\/p>                <p style='text-align: left; color: gray; font-size: 11px!important; line-height: 10px;'>布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。<\/p>                ",
  "title": "“正常”的血压值或许并不利于预防心脏病",
  "authors": [
    "GINA KOLATA"
  ],
  "categories": [
    "健康"
  ]
}

这些Event/中间物料/板材/都会吐给下一个Agent,它要访问其中url指向的网页,抽取全文内容。

3.2. 抓取全文

访问某个URL,去抓取全文,这类工作在Huginn中由WebsiteAgent完成,因此我们新建一个WebsiteAgent:

{
  "expected_update_period_in_days": "14",
  "url": "{{url}}",
  "type": "html",
  "mode": "merge",
  "extract": {
    "description_full": {
      "css": ".content_list",
      "value": "."
    }
  }
}

同样,里面各字段的含义,新建Agent时页面上都有帮助说明。通过extract字段指定的css和xpath(需要有相关基础知识),这一步Agent/车间就抓到了全文内容,并生成如下event:

{
  "id": "http://cn.nytimes.com/health/20151110/c10pressure/",
  "date_published": "2015-11-10 10:12:35 +0800",
  "last_updated": "Tue, 10 Nov 2015 10:12:35 +0800",
  "url": "https://d3qlz4p8smvoli.cloudfront.net/health/20151110/c10pressure/",
  "urls": [
    "https://d3qlz4p8smvoli.cloudfront.net/health/20151110/c10pressure/"
  ],
  "description": "传统的收缩压标准将140毫米汞柱上下为正常,但美国研究人员最新发现,收缩压如果保持在120毫米汞柱以下,可以使发生心血管疾病或中风的风险降低25%。<p>![布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。 Charlie Mahoney for The New York Times](http://upload-images.jianshu.io/upload_images/206186-3efd2089eb6b1781.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<\/p>                <p style='text-align: right; color: gray; font-size: 11px!important; line-height: 10px;'>Charlie Mahoney for The New York Times<\/p>                <p style='text-align: left; color: gray; font-size: 11px!important; line-height: 10px;'>布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。<\/p>                ",
  "content": "传统的收缩压标准将140毫米汞柱上下为正常,但美国研究人员最新发现,收缩压如果保持在120毫米汞柱以下,可以使发生心血管疾病或中风的风险降低25%。<p>![布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。 Charlie Mahoney for The New York Times](http://upload-images.jianshu.io/upload_images/206186-3efd2089eb6b1781.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<\/p>                <p style='text-align: right; color: gray; font-size: 11px!important; line-height: 10px;'>Charlie Mahoney for The New York Times<\/p>                <p style='text-align: left; color: gray; font-size: 11px!important; line-height: 10px;'>布莱根妇女医院心脏病学家、哈佛大学医学教授马克·阿兰·费弗尔博士表示,这项研究结果出来后,他会觉得自己现在有义务帮助病人进一步降低自己的血压。<\/p>                ",
  "title": "“正常”的血压值或许并不利于预防心脏病",
  "authors": [
    "GINA KOLATA"
  ],
  "categories": [
    "健康"
  ],
  "description_full": "<div class=\"content_list\">\n                \n        \n            \n                <figure class=\"img_row\">\n                  <div class=\"img_box\">\n                    <img href=\"http://static01.nyt.com/images/2015/11/10/science/10Pressure2/10Pressure2-popup.jpg\" src=\"http://static01.nyt.com/images/2015/11/10/science/10Pressure2/10Pressure2-articleInline.jpg\" alt=\"77岁的威廉·多尔蒂有家族心脏病史。经过药物治疗,他的血压基本控制在140之下。\">\n                  <\/div>\n                    <figcaption>\n                      <p class=\"img_text caption\">77岁的威廉·多尔蒂有家族心脏病史。经过药物治疗,他的血压基本控制在140之下。<\/p>\n                      <small class=\"credit\">Charlie Mahoney for The New York Times<\/small>\n                    <\/figcaption>\n                <\/figure> \n                \n            \n        \n        \n        <p class=\"\">今年9月,联邦政府宣布,因研究结果太过惊人,它突然叫停了一个大型血压研究,医生们因此陷入了进退维谷的境地。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">声明称,研究人员发现,将收缩压控制在远低于目前建议的水平——低于120,而非140或150毫米汞柱——可以挽救生命,以及预防心脏病和中风。但他们拒绝透露挽救了多少生命,预防了多少心梗,以及其他关键的量度数据。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">“不进一步了解他们的发现,怎么敢在血压控制上做任何不同的尝试?”耶鲁心脏病学家哈伦·克鲁姆霍尔茨(Harlan Krumholz)博士说,这也是其他专家的顾虑所在。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">周一,这项研究的调查人员在于佛罗里达州奥兰多市举行的美国心脏协会(American Heart Association)会议上做了报告,同时在《新英格兰医学期刊》(New England Journal of Medicine)发表了一篇文章,揭开了这项研究的面纱。该研究对9361名病人进行了为期平均3.2年的跟踪,结果发现,和将收缩压控制在目前的140的病人相比,控制在120以下的病人,死亡率低27%(155人对210人),出现心力衰竭的几率低38%(62人对100人)。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">收缩压是两项血压指标中更高的那一个,代表心脏收缩时的血压状况。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">这项研究的主要研究员之一保罗·K·惠尔顿(Paul K. Whelton)表示,总体而言,发生心梗、心脏衰竭或死于心脏病的比率可以降低25%(243人对319人)。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">年长的参与者跟年轻的情况一样好。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">没有参与该研究的哈佛大学教授马克·阿兰·费弗尔(Marc Alan Pfeffer)博士表示,这些研究结果会对美国数百万高血压患者产生颠覆性影响。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">费弗尔表示,这项研究出现之前,遇到年纪超过50岁、收缩压136、并对胆固醇等对心脏病重要风险因素有很好控制的病人,他会拍拍对方的肩膀然后说,“做得不错。”而现在,他会觉得自己有义务给病人开更多高血压药物。否则,他说,“我将错失挽救另一个生命的机会。”<\/p>\n    \n        \n            \n        \n         \n          <div class=\"nytcn_article_ad\" id=\"div-gpt-ad-bigad\">\n            <script type=\"text/javascript\">\n              googletag.cmd.push(function() { googletag.display('div-gpt-ad-bigad'); });\n            <\/script>\n          <\/div>\n        \n        <p class=\"\">据没有参与这项研究的阿拉巴马大学流行病学家保罗·芒特纳(Paul Muntner)测算,至少有1700万美国人马上就会受到这些发现的影响。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">这项名为Sprint的研究招募年龄50岁及更高的高血压病人参与。这些病人至少还有一项罹患心脏病的其他风险因素,比如吸烟、高胆固醇,患有肾脏疾病或只是年龄大于75岁。其中一半被要求将血压控制在140以下,与现行做法一致。另一半则被要求将血压控制在120以下。这项研究原计划持续到2017年,但今年夏天突然终止,当时研究人员宣布他们发现了有“有可能挽救生命”的研究结果。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">长期以来,医生们一直纠结于该把血压控制在什么水平。如果血压太低,可能导致眩晕、昏厥等并发症,对年纪大的人来说尤其如此。周一发布的结果显示,将血压控制在120的参与者中,有5%——即220人——在研究进行期间出现了严重的并发症——血压过低,导致严重眩晕或昏厥症状,或对肾脏产生不可逆的损伤。在将血压控制在140的参与者中,有118人出现了严重的并发症。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">研究人员担心血压指标为120或更低的人在起身时出现血压骤降的并发症状,而实际上,这种情况在血压控制目标更高的人身上更容易出现。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">“把这些并发症放在可以降低27%的死亡率的大背景下看,似乎益处大于风险,”韦克森林浸会医疗中心(Wake Forest Baptist Medical Center )生物统计学家维·M·勒布桑(David M. Reboussin)说,他是该研究的首席研究员。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">还有一个问题是,血压究竟应该低到什么程度。在这项新研究中,一些病人将收缩压控制在低于110的水准,而对大多数人而言,保持在120就已经不易。克利夫兰大学医院凯斯医疗中心(University Hospitals Case Medical Center)高血压项目主任、本研究的研究员小杰克逊·J·赖特(Jackson T. Wright Jr.)博士表示,很难想象再进行一个大型研究来对比110和120的血压状况。“这个区隔非常窄,”他说,得到的研究结果的差别会很小,这意味着研究规模要非常大,时间要很长。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">芒特纳表示,医生和病人只能面对一些不确定性。“临床试验再多也不够,”他说。<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">一些高血压专家劝诫大家要小心谨慎。纽约艾伯特·爱因斯坦医学院(Albert Einstein College of Medicine)的血压专家迈克尔·奥尔德曼(Michael Alderman)估计,这些研究结果意味着,每年在1000人中有6个人可以避免出现心梗、中风或心脏衰竭。他表示,这会让医生不知如何给病人个体提供建议。“如果它没有危害,或像安全的一次性疫苗接种一样危害很小,医生们就很容易做决定。但如果它意味着健康的人需要连续几十年服用药物,就没那么容易了。”<\/p>\n    \n        \n            \n        \n        \n        <p class=\"\">耶鲁大学的克鲁姆霍尔茨表示,尽管研究结果让人兴奋,但不应该将更低的血压定为要求。他说,血压那样低,“是有风险的。”医生们必须先和病人就侧重点和目标进行沟通。<\/p>\n    \n\n\n\n                \n                  <div class=\"nytcn_authorinfo\">\n                    <p>翻译:常青<\/p>\n                  <\/div>\n                \n              <\/div>"
}

可以看到,description_full字段已经是文章全文。说明抓取成功了。

3.3 输出全文RSS地址

最后一步,就剩下把抓到的全文Event,以RSS的格式输出。这里使用Data Output Agent:

{
  "secrets": [
    "newyork"
  ],
  "expected_receive_period_in_days": "7",
  "template": {
    "title": "纽约时报中文网 国际纵览",
    "description": "纽约时报中文网 国际纵览",
    "item": {
      "title": "{{title}}",
      "description": "{{description_full}}",
      "link": "{{id}}",
      "pubDate": "{{last_updated}}",
      "guid": "{{id}}"
    }
  }
}

大功告成。

最后在第三步Agent的页面,会给出新的全文RSS的订阅地址,如图:

输出RSS地址

生成的全文RSS地址,可以通过FeedBurner(链接)烧录后,分享到网上供更多人使用。例如通过以上三步Agent,生成的纽时全文RSS订阅在这里


结语

本来,几乎没必要写Huginn的使用介绍,因为官方帮助文档(链接)已经详细到令人发指的地步。可惜如此神器,国内使用的人却很少,讨论的也少,故写文安利下。

篇幅原因,没有介绍如何安装Huginn。目前被采纳最多的三种部署方式是:

  • Docker部署:适合本地练手用
  • 部署在Heroku:优点是免费,缺点是限制多
  • 部署在Linux:优缺点与上相反

如果你看完本文起了使用的心,超级详细的安装手册可以查阅官方文档(链接)。

另,除了这里介绍的摘要RSS转全文RSS以外,由不提供RSS的网站直接生成全文RSS的例子见这里(链接),根据关键词等条件过滤RSS的例子见这里(链接)。官方文档内有更多五花八门的应用范例。

首发于:http://walden.farbox.com/post/huginn-a-rss-master-piece
(完)

 

发表回复

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部