做为费德勒的铁杆粉丝,天天早上都会在新浪体育里面的网球频道浏览费德勒新闻。因为只关注费德勒的新闻,因此每次都要在网页中大量的新闻中筛选相关信息,感受效率好低,因此用node写了一个简单的爬虫程序经过天天定时发送邮件的方式来通知。html
这个需求仔细看有3个功能点,信息爬虫,定时发送,邮件通知node
信息爬虫jquery
信息爬虫创建在对页面结构的分析,从页面内容中抽取符合咱们须要的信息,因此咱们在得到网页信息后,须要对dom结构进行分析,得到相关信息,组装成数据。ios
Axios(https://github.com/mzabriskie/axios) 是一个基于 promise 的 HTTP 库,能够用在浏览器和 node.js 中发送请求,获取数据,因此咱们经过能够axios来获取html页面内容git
接下来,咱们须要分析html内容中,cheerio(https://github.com/cheeriojs/cheerio)这个库能够帮咱们像jquery的API同样分析获取dom结构,进行数据的筛选。github
因此对于网页的爬虫,咱们实现思路,axios获取数据,cheerio获取整个页面的A的标签,在对A标签的内容进行正则匹配筛选,存储到数组中,具体代码以下:npm
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); })
邮件通知json
nodemailer(https://nodemailer.com/)是一个关于邮件发送的库,只要安装nodemailer模块,按照规则配置好发送信息便可,代码以下:axios
const configData = require('./config.json'); //生成发送字符串 function formStr(arr) { let html = ''; for (let data of arr) { html += `<p><a target="_blank" href="${data.href}">${data.title}</a></p>` // 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邮箱为例,请点击:http://jingyan.baidu.com/article/fedf0737af2b4035ac8977ea.html数组
定时发送
定时发送咱们能够经过简单的setInterval来实现,可是这样写的扩展性不高。到node社区搜了一下,发现了一个定时脚本库:node-schedule(https://www.npmjs.com/package/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点半直接看邮件就好了。