Egg 提供了 this.ctx.curl 方法获取远程的数据,让我们可以轻松的实现一个简单的爬虫功能,以下是一个使用的具体示例。
首先在config文件夹下的 config.default.js 中定义要获取数据的域名。
'use strict';
module.exports = appInfo => {
const config = exports = {};
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1532656413112_8161';
// add your config here
config.middleware = [];
// 配置公共的请求域名
config.api = 'http://www.phonegap100.com/';
return config;
};
然后在service文件夹下添加服务的文件news.js,并在文件中添加服务的方法getNewsList和getNewsContent,分别获取新闻列表与新闻详情。
'use strict';
const Service = require('egg').Service;
class NewsService extends Service {
// 获取新闻列表
async getNewsList() {
var api = this.config.api + 'appapi.php?a=getPortalList&catid=20&page=1'
// curl的方法获取远程的数据
var response = await this.ctx.curl(api);
// 把返回的Buffer类型转转换成对象
var data = JSON.parse(response.data);
return data.result;
}
// 获取新闻详情(控制器中调用时要传参)
async getNewsContent(aid) {
var api = this.config.api + 'appapi.php?a=getPortalArticle&aid=' + aid;
// curl的方法获取远程的数据
var response = await this.ctx.curl(api);
// 把Buffer类型转转换成对象
var data = JSON.parse(response.data);
return data.result;
}
}
module.exports = NewsService;
通过以上的操作,就可以在控制器中调用服务的方法,将数据返回给前台或是渲染到模板文件上面了。