- 课程介绍看这里:juejin.im/post/5df25c…
- 项目github地址:github.com/hellozhangr…
目前 node.js 爬虫工具比较火的有 node-crawler
puppeteer
。不过我目前没打算用这些,由于至少如今咱们的项目还用不到。只要能发送请求、解析dom咱们就能本身实现一个爬虫。因此我选择了axios + cheerio来本身写爬虫。javascript
首先咱们用 axios + cheerio 来获取博客园的首页编辑推荐文章,并解析出这篇文章的正文部分。html
// controller/crawler.js 文件
const axios = require('axios');
const cheerio = require('cheerio');
// articleCtrl是一个写好了的controller,里面有存储数据到mongo的逻辑。
const articleCtrl = require('./article');
async function cnblogs () {
const res = await axios.get('https://www.cnblogs.com/');
// 把axios获得的数据用cheerio解析,解析后的$对象拥有jquery的能力,能够经过jquery api直接操做dom
const $ = cheerio.load(res.data);
const $href = $('#editor_pick_lnk');
let name = $href.text();
// 找到编辑推荐文章的url,继续访问该页面
let href = $href.attr('href');
const subRes = await axios.get(href);
const $$ = cheerio.load(subRes.data);
// 得到编辑推荐文章的正文部分的html
const bodyStr = $$('#cnblogs_post_body').html();
// 存入mongodb,具体articleCtrl.create方法的实现能够从项目源码中看,位置express/controller/article.js
const cRes = await articleCtrl.create({
from: 'cnblogs',
title: name,
article: bodyStr,
hot_level: 1,
favor: 1,
comment: 1
});
};
module.exports = {
cnblogs
};
复制代码
经过上面简单的代码,咱们就能把博客园的推荐文章正文部分存到数据库。接下来要建立定时任务,把天天的推荐文章都存到本身的数据库了。java
定时任务工具我选择 node-schedule
,先上实例,后面再详细讲下用法。node
// schedule/index.js 文件
var schedule = require('node-schedule');
// 能够按照cron的格式设置
function runSchedule (cb) {
// cron风格的配置:天天上午10点执行一次
schedule.scheduleJob('0 0 10 * * *', function () {
console.log('定时任务执行一次');
cb && cb();
});
// object风格的配置:天天上午10点执行一次
// 注意,这里须要加minute:0, 不然10点的每一分钟都执行一次。
schedule.scheduleJob({hour: 10, minute: 0}, function () {
console.log('定时任务执行一次');
cb && cb();
});
}
module.exports = runSchedule;
复制代码
接下来说讲 cron 与 object 两种配置风格的差别。jquery
建议你们直接用 cron 风格的配置方式。当我第一次看到 object 配置风格的时候也以为很人性化,可用事后会发现坑太多,越用成本越大。不信能够慢慢看linux
// 天天上午7点的每分钟都执行一次 (本觉得会天天7点执行一次)
let obj = { hour: 7};
// 同上
let obj = { hour: 7, minute: null};
// 上午7点整执行一次
let obj = { hour: 7, minute: 0};
// 每秒执行一次
let obj = { second: null }
// 每分钟执行一次
let obj = { hour: null }; // 费解,这个不该该是每小时执行一次吗
// 每分钟执行一次
let obj = { minute: null };
// 每小时执行一次
let obj = { hour: null, minute: 0 }
复制代码
* * * * * *
每秒执行一次0 * * * * *
每分钟的第0秒执行一次0 0 * * * *
每小时的0分0秒执行一次0 0 7 * * *
天天早上7点的0分0秒执行一次0 0 7 1 * *
每个月的1日早上7点0分0秒执行一次0 0 7 * * 1
每周1的早上7点0分0秒执行一次对比完了这两种风格能明显的看出:虽然 object 更人性化但我的觉的有点中看不中用的感受。尤为是对于个性化的配置,object 显的很蹩脚,并且你根本无法查,没那么多使用说明给到你。相比下 cron 自己就是linux的通用定时任务,各类玩法都被人用了多少遍了。ios
最后,在 app.js
补上下面的逻辑,node app.js
启动服务,等待定时任务的执行吧。git
const runSchedule = require('./schedule');
const crawlerCtrl = require('./controller/crawler');
function listen () {
app.listen('3000', () => {
console.log('listen: 3000');
// 开启自动脚本
runSchedule(function() {
crawlerCtrl.cnblogs();
})
});
}
复制代码
完整的逻辑去项目里翻代码吧。github