实现一个简易爬虫&启动定时任务

课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html
项目github地址:https://github.com/hellozhangran/happy-egg-server

爬虫

目前 node.js 爬虫工具比较火的有 node-crawler puppeteer。不过我目前没打算用这些,因为至少现在我们的项目还用不到。只要能发送请求、解析dom我们就能自己实现一个爬虫。所以我选择了axios + cheerio来自己写爬虫。

获取博客园的推荐文章

首先我们用 axios + cheerio 来获取博客园的首页编辑推荐文章,并解析出这篇文章的正文部分。

  1. // controller/crawler.js 文件
  2. const axios = require('axios');
  3. const cheerio = require('cheerio');
  4. // articleCtrl是一个写好了的controller,里面有存储数据到mongo的逻辑。
  5. const articleCtrl = require('./article');
  6. async function cnblogs () {
  7. const res = await axios.get('https://www.cnblogs.com/');
  8. // 把axios得到的数据用cheerio解析,解析后的$对象拥有jquery的能力,可以通过jquery api直接操作dom
  9. const $ = cheerio.load(res.data);
  10. const $href = $('#editor_pick_lnk');
  11. let name = $href.text();
  12. // 找到编辑推荐文章的url,继续访问该页面
  13. let href = $href.attr('href');
  14. const subRes = await axios.get(href);
  15. const $$ = cheerio.load(subRes.data);
  16. // 获得编辑推荐文章的正文部分的html
  17. const bodyStr = $$('#cnblogs_post_body').html();
  18. // 存入mongodb,具体articleCtrl.create方法的实现可以从项目源码中看,位置express/controller/article.js
  19. const cRes = await articleCtrl.create({
  20. from: 'cnblogs',
  21. title: name,
  22. article: bodyStr,
  23. hot_level: 1,
  24. favor: 1,
  25. comment: 1
  26. });
  27. };
  28. module.exports = {
  29. cnblogs
  30. };

通过上面简单的代码,我们就能把博客园的推荐文章正文部分存到数据库。接下来要创建定时任务,把每天的推荐文章都存到自己的数据库了。

定时任务

实例

定时任务工具我选择 node-schedule ,先上实例,后面再详细讲下用法。

  1. // schedule/index.js 文件
  2. var schedule = require('node-schedule');
  3. // 可以按照cron的格式设置
  4. function runSchedule (cb) {
  5. // cron风格的配置:每天上午10点执行一次
  6. schedule.scheduleJob('0 0 10 * * *', function () {
  7. console.log('定时任务执行一次');
  8. cb && cb();
  9. });
  10. // object风格的配置:每天上午10点执行一次
  11. // 注意,这里需要加minute:0, 否则10点的每一分钟都执行一次。
  12. schedule.scheduleJob({hour: 10, minute: 0}, function () {
  13. console.log('定时任务执行一次');
  14. cb && cb();
  15. });
  16. }
  17. module.exports = runSchedule;

接下来讲讲 cron 与 object 两种配置风格的差异。

建议大家直接用 cron 风格的配置方式。当我第一次看到 object 配置风格的时候也觉得很人性化,可用过后会发现坑太多,越用成本越大。不信可以慢慢看

object风格

  1. // 每天上午7点的每分钟都执行一次 (本以为会每天7点执行一次)
  2. let obj = { hour: 7};
  3. // 同上
  4. let obj = { hour: 7, minute: null};
  5. // 上午7点整执行一次
  6. let obj = { hour: 7, minute: 0};
  7. // 每秒执行一次
  8. let obj = { second: null }
  9. // 每分钟执行一次
  10. let obj = { hour: null }; // 费解,这个不应该是每小时执行一次吗
  11. // 每分钟执行一次
  12. let obj = { minute: null };
  13. // 每小时执行一次
  14. let obj = { hour: null, minute: 0 }

cron风格定时器

  • * * * * * * 每秒执行一次
  • 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的通用定时任务,各种玩法都被人用了多少遍了。

启动定时任务

最后,在 app.js 补上下面的逻辑,node app.js 启动服务,等待定时任务的执行吧。

  1. const runSchedule = require('./schedule');
  2. const crawlerCtrl = require('./controller/crawler');
  3. function listen () {
  4. app.listen('3000', () => {
  5. console.log('listen: 3000');
  6. // 开启自动脚本
  7. runSchedule(function() {
  8. crawlerCtrl.cnblogs();
  9. })
  10. });
  11. }

完整的逻辑去项目里翻代码吧。

【重学Node.js 第4篇】实现一个简易爬虫&启动定时任务的更多相关文章

  1. 【重学Node.js 第5篇】部署项目到腾讯云服务器

    课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https://github.com/hellozhangran ...

  2. 【重学Node.js 第3篇】mongodb以及mongoose的使用

    mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-serve ...

  3. 打算写一个《重学Node.js》系列,希望大家多多支持

    先放上链接吧,项目已经开始2周了:https://github.com/hellozhangran/happy-egg-server 想法 现在是2019年11月24日,还有人要开始学习Node.js ...

  4. 【重学Node.js 第1&2篇】本地搭建Node环境并起RESTful Api服务

    本地搭建Node环境并起RESTful Api服务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https: ...

  5. 学习node.js 第4篇 建立一个最小的web聊天系统

    我们生活在一个实时的世界里,有什么比聊天更加实时吗?那就让我们先写一个基于TCP 的聊天服务器吧,并且支持Telnet 连接.这很容易,而且能够完全用Node来编写.首先,我们需要在Node 中包含T ...

  6. Node.js Stream-基础篇

    Node.js Stream - 基础篇 邹斌 ·2016-07-08 11:51 背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同 ...

  7. 一目了然的 Node.js Windows10 安装篇

    本篇文章 介绍 NodeJS 的安装 及环境变量配置 Node JS 的 了解 1.Node.js简介 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于 ...

  8. 利用Node.js的Net模块实现一个命令行多人聊天室

    1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ...

  9. Node.js简单介绍并实现一个简单的Web MVC框架

    编号:1018时间:2016年6月13日16:06:41功能:Node.js简单介绍并实现一个简单的Web MVC框架URL :https://cnodejs.org/topic/4f16442cca ...

随机推荐

  1. iOS 9 适配系列教程

    http://www.cocoachina.com/ios/20150703/12392.html 本文是投稿文章,作者:ChenYilong(https://github.com/ChenYilon ...

  2. oracle函数 lag()和lead()

    [语法] lag(EXPR,<OFFSET>,<DEFAULT>) LEAD(EXPR,<OFFSET>,<DEFAULT>) [功能]表示根据COL1 ...

  3. mysql把一个表的字段update成另一个表的字段根据id

    mysql把一个表的字段update成另一个表的字段根据id 1.填充activity表里面的creator字段,用org的founderid,其中activity的orgid要和org的id对应,具 ...

  4. PyTorch入门学习(二):Autogard之自动求梯度

    autograd包是PyTorch中神经网络的核心部分,简单学习一下. autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次 ...

  5. webstorm破解教程

    1.下载地址 官网:https://www.jetbrains.com/webstorm/ 下载好之后按照提示安装即可,这里就不再多说了.下面直接说说如何使用补丁破解. 2.使用补丁破解 (http: ...

  6. oracle用EXPLAIN PLAN 分析SQL语句

    EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及 ...

  7. js 过滤富文本标签数据

    var str = '<p><code>uni-app</code> 完整支持 <code>Vue</code> 实例的生命周期,同时还新增 ...

  8. H3C 星型以太网拓扑扩展

  9. 如何学习Python的一些总结

    https://mp.weixin.qq.com/s/w0NoDiYfvtTy8N3BVoIVpw 为什么选择Python 经常会有同学问我为什么选择Python.我很喜欢这门语言,因为它的简洁灵活, ...

  10. H3C ACL的标识