nodejs實現新聞爬蟲

做爲費德勒的鐵桿粉絲,天天早上都會在新浪體育裏面的網球頻道瀏覽費德勒新聞。因爲只關注費德勒的新聞,因此每次都要在網頁中大量的新聞中篩選相關信息,感受效率好低,因此用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)這個庫能夠幫咱們像jqueryAPI同樣分析獲取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點半直接看郵件就好了。

相關文章
相關標籤/搜索