博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs实现新闻爬虫
阅读量:4587 次
发布时间:2019-06-09

本文共 2356 字,大约阅读时间需要 7 分钟。

作为费德勒的铁杆粉丝,每天早上都会在新浪体育里面的网球频道浏览费德勒新闻。由于只关注费德勒的新闻,所以每次都要在网页中大量的新闻中筛选相关信息,感觉效率好低,所以用node写了一个简单的爬虫程序通过每天定时发送邮件的方式来通知。

这个需求仔细看有3个功能点,信息爬虫,定时发送,邮件通知

信息爬虫

信息爬虫建立在对页面结构的分析,从页面内容中抽取符合我们需要的信息,所以我们在获得网页信息后,需要对dom结构进行分析,获得相关信息,组装成数据。

Axios(https://github.com/mzabriskie/axios) 是一个基于 promise HTTP 库,可以用在浏览器和 node.js 发送请求,获取数据,所以我们通过可以axios来获取html页面内容

接下来,我们需要分析html内容中,cheerio(https://github.com/cheeriojs/cheerio)这个库可以帮我们像jqueryAPI一样分析获取dom结构,进行数据的筛选。

所以对于网页的爬虫,我们实现思路,axios获取数据,cheerio获取整个页面的A的标签,在对A标签的内容进行正则匹配筛选,存储到数组中,具体代码如下:

const KEYWORD = '费德勒';const KEYWORD_REG = new RegExp(KEYWORD, 'i');let newsArry = [];function spider() {  return axios.get('http://sports.sina.com.cn/tennis/').then(response => {    if (response.status === 200) {      let $ = cheerio.load(response.data, {        decodeEntities: false      });      let newsList = $('a[href]');      newsArry = [];      for (let i = 0; i < newsList.length; ++i) {        let obj = $(newsList[i]);        let text = $(newsList[i]).text();        //收集数据        if (KEYWORD_REG.test(text)) {          newsArry.push({            'title': text.trim(),            'href': obj.attr('href')          })        }      }    }  }).catch(e => {    console.log('爬虫失败了');    console.log(error);  })

邮件通知

nodemailer()是一个关于邮件发送的库,只要安装nodemailer模块,按照规则配置好发送信息即可,代码如下:

const configData = require('./config.json');//生成发送字符串function formStr(arr) {  let html = '';  for (let data of arr) {    html += `

${data.title}

` // red green blue } return html;}//邮件发送函数function sendEmail(opts) { let transporter = nodemailer.createTransport({ service: 'QQ', auth: configData.auth }, { from: configData.auth.user }) var message = { //收件人用逗号间隔 to: opts.to, //信息主题 subject: opts.subject, //内容 html: opts.html };

 

auth 中的 pass,是指“邮箱第三方登录授权码,如何获取授权码,以QQ邮箱为例,请点击:

定时发送

定时发送我们可以通过简单的setInterval来实现,但是这样写的扩展性不高。到node社区搜了一下,发现了一个定时脚本库:node-schedule()

const schedule = require('node-schedule');const SCHEDULE_RULE = '1 30 10 * * *'; //每天10点30分发送schedule.scheduleJob(SCHEDULE_RULE, () => {  spider().then(() => {    sendEmail({      to: configData.recipients.join(','),      subject: `${KEYWORD}新闻`,      html: formStr(newsArry)    })  });});

这个库的使用和简单,指定匹配规则,然后添加定时执行函数就可以了。

我们这里指定规则每天10点半发送邮件,这样我们也完成了定时发送的任务

我们来看一下发送到我们邮箱数据:

大功告成,这样我们以后每天10点半直接看邮件就行了。

转载于:https://www.cnblogs.com/caizhenbo/p/7234521.html

你可能感兴趣的文章
2017.2.28 activiti实战--第七章--Spring容器集成应用实例(五)普通表单
查看>>
读书笔记第一章
查看>>
Android 操作SQLite基本用法
查看>>
iis7 发布mvc3 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容...
查看>>
(vue.js)element ui 表单验证 this$refs[formName]validate里面的内容死活不执行
查看>>
启动多个appium服务(同时运行多台设备)
查看>>
Java大数相乘-hdu1063
查看>>
mysql-mmm 部署高可用集群
查看>>
solaris启动过程详解 分类: arm-linux-Ubuntu ...
查看>>
while循环和递归
查看>>
Linux下yum安装Redis
查看>>
.Net 下未捕获异常的处理
查看>>
[机器学习]-Adaboost提升算法从原理到实践
查看>>
AOP概念
查看>>
memset函数详细用法说明【转】
查看>>
php解析xml字符串
查看>>
SFTP客户端与服务端
查看>>
Modbus协议
查看>>
复位自动ID的问题有兩種方法
查看>>
CentOS 5.5 Samba服务器安装总结
查看>>