使用 nodejs 的库
python 脚本的详细编写,请看之前的博文:radioit 计划——动画广播辅助脚本 radioitScript。
需要用 node 实现脚本中的某些逻辑是获取和提取广播的信息,整合成 JSON 格式的数据。
而用一些库就能轻松做到。
superagent
superagent 是一个极其简单的 AJAX 库。
使用方法简单得令人发指。
1 | var request = require( 'superagent' ); |
还用介绍吗?不用了。
bluebird
bluebird 是一个 Promise 库。
凡是类似 IO 的操作,必定需要异步。经典的解决方法是回调,然而是时候用 Promise 了!
bluebird 声称拥有无与伦比的速度。其实更实用的功能是它支持能够将一些本身是不支持 Promise 的库转化为支持 Promise 的库。
然而,要配合之前的 superagent,则需要另外一个库 superagent-bluebird-promise。superagent 本身不支持 Promise,从上面的代码来看就是使用回调的方法,这个库就是将 superagent 和 bluebird 融合在一起的“融合卡”。
使用的时候只需要:
1 | var Promise = require( 'bluebird' ); |
立刻就可以使用上 then
了,方便吧。
cherrio
cheerio 是一个语法类似 jQuery,为服务端提供 jQuery 核心功能的库。这里用到的是它的 CSS 选择器功能。
代码同样很简单,使用过 jQuery 的人会倍感亲切。
1 | var cheerio = require( 'cheerio' ), |
使用 cheerio 有比较推荐的做法就是添加上 decodeEntities
和 lowerCaseAttributeNames
这个两个 options 配置,能避免各种 HTML 文本的奇怪问题。
1 | $ = cheerio.load( HTMLtext, { |
综上,四个库的混合使用例子如下:
1 | var Promise = require( 'bluebird' ); |
编写逻辑
npm 安装库的过程略。
因为是信息整合,那么必定需要有一个统一的数据格式。于是先来确定数据格式。
广播站中所有广播的信息整合数据格式。
1 | // data will be formated as a json object in following structure: |
单个广播的信息整合数据格式。
1 | // data will be formated as a json object in following structure: |
有了输出的数据格式,抓取信息的时候就能有的放失。
以 響 - HiBiKi Radio Station - 为例。因为在之前编写脚本的时候已经得到了页面上信息的位置,所以可以直接应用在代码中。
1 | // 一些固定的信息和变量 |
以下开始获取广播站的广播。
1 | // 获取信息的对象 |
以下开始获取某个广播的详细信息,函数定义在上面的对象中。
1 | getBangumiAsync: function ( id ) { |
代码看似很多,其实就是多了信息提取的部分,其他代码完全就是上一节中四个库的混合使用。
要注意的有一点,就是 promise 链中的 then( fulfilledHandler, rejectedHandler )
。其中 fulfilledHandler
在最后需要使用 return data;
将数据传出去,而 rejectedHandler
也需要使用 throw new Error( err );
重新抛出错误,不然 promise 链中下一个函数将不会得到处理好的数据或者异常(因为已经处理掉了)。
最后别忘了将对象导出。
1 | module.exports = hibiki; |
同理,另外两个广播站的代码基本都一样,不同的只是信息提取的部分。
整合
对于取数据的调用者而言,是无需理会数据从哪来的,只需要知道使用什么 API 就够了。
再者,既然有 “整合” 之名,就要行 “整合” 之实。因此要将这三个或者日后出现的更多个广播站提取代码整合起来,只提供一个调用入口。
新建目录 provider
,将三个广播站的脚本都放进去。
再新建一个 provider.js
文件,写入以下代码。
1 | var catalogue = { |
整体思路是提供一个可调用的列表,然后根据参数调用相应脚本的功能,就是一个 dispatcher
的功能。
如此,就实现了应用的一大部分主要功能了。