python 实现自动定时爬取天气预报发送邮件

自动定时爬取天气预报发送邮件

【定时】+【发邮件】+【爬虫】

#爬取天气,需要用到爬虫里面requests模块
#引用模块
import smtplib      #发邮件
from email.mime.text import MIMEText    #用于构建内容文本
from email.header import Header    #用于构建邮件头
import schedule      #定时模块
import time          #时间模块
import requests      #请求网页信息模块
from bs4 import BeautifulSoup   #用来解析和提取网页中的数据的模块

# 爬取天气
def weather():  #定义函数
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
    r=requests.get('http://www.weather.com.cn/weather/101281601.shtml',headers=headers)  #跟网站要数据赋值给r
    r.encoding='utf-8'    #重申r的编码为'utf-8'
    bs=BeautifulSoup(r.text,'html.parser')  #解码,'html.parser'是解析器
    a=bs.find('li',class_="sky skyid lv1")   #提取数据
    b=a.find('h1').text        
    c=a.find('p').text
    d=a.find('p',class_="tem").text[-7:]
    return'今天%s\n天气:%s\n温度:%s' % (b,c,d)


# 发送邮件
def Email(weathers):     #定义函数Email(),一旦调用将会执行下面的功能,参数为weathers
    #服务器,端口
    host='smtp.qq.com'
    port=465
    #我方账户,授权码
    username='************@qq.com'
    password='***********'
    #对方账户
    to_addr=['******@live.com','*******@qq.com']  #添加多个账户采用列表形式


    #要发送的内容
    moment=weathers
    #构建纯文本的邮件内容
    msg = MIMEText(moment,'plain','utf-8') 
    #构建邮件头
    msg['From'] = Header('丁丁')       #2.from来自哪里,指发件人的名称或地址
    msg['To'] = Header('我的小可爱')         #3.to发件人邮箱地址
    msg['Subject'] = Header('天气预报')    #4.主题
    try:
        # 开启发信服务
        server = smtplib.SMTP_SSL(host)         
        server.connect(host, port)  
        # 登录发信邮箱
        server.login(username, password)
        # 发送邮件
        server.sendmail(username, to_addr, msg.as_string())
        # 关闭服务器
        server.quit() 
        print('发送成功')
    except:
        print('发送失败')   
         
# 确定任务
def job():
    weathers=weather()   #调用函数weather(),返回的值赋值给weathers
    Email(weathers)      #调用函数Email(weathers),参数为weathers
# 定时
schedule.every().day.at("7:30").do(job) #每天早上7点半执行一次

# 监听定时任务
while True:
    schedule.run_pending()     #检查上面的任务部署情况,如果任务已经准备就绪,就去启动执行。
    time.sleep(1)
    #让程序按1秒来检查