zoukankan      html  css  js  c++  java
  • nodejs实现新闻爬虫

    作为费德勒的铁杆粉丝,每天早上都会在新浪体育里面的网球频道浏览费德勒新闻。由于只关注费德勒的新闻,所以每次都要在网页中大量的新闻中筛选相关信息,感觉效率好低,所以用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(https://nodemailer.com/是一个关于邮件发送的库,只要安装nodemailer模块,按照规则配置好发送信息即可,代码如下:

    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点半直接看邮件就行了。

  • 相关阅读:
    Python作业之分页显示内容
    Codeforces Round #368 (Div. 2)
    数论专项测试——约数个数和(lucas的数论)
    数论专题测试——逆元
    数论专题测试——幸运数字
    bzoj2219: 数论之神
    bzoj3283: 运算器
    梅森素数
    后缀数组
    Hash_1014: [JSOI2008]火星人prefix
  • 原文地址:https://www.cnblogs.com/caizhenbo/p/7234521.html
Copyright © 2011-2022 走看看