爬虫获取天气,定时邮件

课余小玩意儿

Posted by Cfeng on April 10, 2019

在黑马程序员学习,免费教程,感谢!(还不是因为没钱)

环境配置Node下载

Node.js下载

项目依赖包

依赖包名称 | 功能描述 ———- | ————- superagent | HTTP请求 cheerio | 解析HTML art-template| 模板引擎 nodemailer|发送邮件 node-schedule|定时任务

初始化项目+包

npm init -y
npm install superagent cheerio art-template nodemailer node-schedule

邮件功能

创建main.js

日期计算

当前时间-认识时间,再转换成天数

// 计算认识的天数与获取当前日期 并返回到html
function getDayData(){
    return new Promise((resolve,reject)=>{
        // 现在的时间
        const today = new Date();
        // 认识的时间2019-03-06
        const meet = new Date('2019-03-06');
        const count = Math.ceil((today - meet) / 1000 / 60 / 60 / 24);
        const format = today.getFullYear() + '/' + (today.getMonth() + 1) + '/' +today.getDate();
        const dayDate = {
            count,format
        }
    })
}

爬虫获取天气数据

爬去墨迹天气的数据

// 引入superagent 包,用于服务器发送http请求
const superagent = require('superagent');
// 引入cheerio,把字符串解析为html
const cheerio = require('cheerio');
// 请求墨迹天气获取数据
function getMojiData(){
    superagent.get('https://tianqi.moji.com/weather/china/zhejiang/cixi').end((err,res)=>{
        if(err) return console.log("数据请求失败,请检查路径");
        const $ = cheerio.load(res.text);
        const temperature = $('.wea_weather em').text();
        const icon = $('.wea_weather span img').attr('src');
        const weather = $('.wea_weather b').text();
        const tips = $('.wea_tips em').text();
        const mojiData = {
            temperature,icon,weather,tips
        }
        console.log(mojiData);
    });
}

爬虫获取One页面的数据

function getOneData(){
    superagent.get('wufazhuce.com').end((err,res)=>{
        if(err) return console.log("数据请求失败,请检查路径");
        const $ = cheerio.load(res.text);
        const img = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(0).attr('src');
        const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(0).text();
        const OneData = {
            img,text
        }
        console.log(OneData);
    })
}

用模板引擎替换html数据

引入模板,获取所有数据 要使用await,等待获取数据完毕再进行下一步操作 await需要与Promise配合使用

html钟替换的数据格式为 例如”,

// 引入模板引擎
const template = require('art-template');
// 引入path模块处理路径问题
const path = require('path');
// 通过模板引擎替换html数据
async function renderTemplate(){
    // 获取各种信息
    const dayData = await getDayData();
    const mojiData = await getMojiData();
    const oneData = await getOneData();
    // 用模板引擎进行数据替换
    const html = template(path.join(__dirname,'./love.html'),{
        dayData,mojiData,oneData
    });
}

引入发送邮件模块

// 引入发送邮件模块
"use strict";
const nodemailer = require("nodemailer");

// async..await is not allowed in global scope, must use a wrapper
async function sendEmail(){
    const html = await renderTemplate();
    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
        host: "smtp.163.com",
        port: 465,
        secure: true, // true for 465, false for other ports
        auth: {
            user: "zhjcezh@163.com", // 邮箱账号
            pass: "******" // 客户端授权密码
        }
    });

    // send mail with defined transport object
    let mailOptions = await transporter.sendMail({
        from: '"宇宙无敌第一大帅比" <zhjcezh@163.com>', // sender address
        to: "zhjcezh@163.com", // list of receivers
        subject: "hulalalala", // Subject line
        html: html // html body
    });
    transporter.sendMail(mailOptions,(error,info={})=>{
        if(error){
            console.log("失败");
            sendEmail();
        }
        console.log("邮件发送成功");
    })
}

每天定时发送

// 定时每天发送
// 引入模块,创建定时器任务
var schedule = require('node-schedule');
var j = schedule.scheduleJob('14 13 20 5 * *', function(){
    sendEmail();
    console.log('邮件发送成功');
})