封尘网

让学习成为一种习惯!

python3获取搜狐天气情况并发邮件提醒

听说Python2可能会在2020年就不再提供技术维护了,所以当时直接学Python3是明智的。学习最好的方法就是贴近生活,所以在工作上,生活上能把学习到的知道应用上来那肯定是很容易记住,也会大大的增加学习的兴趣。

这里记录一下Python3下获取搜狐天气的情况,并通过外部smtp邮件发送提醒功能。

Pycharm:4.0.7
Python:3.5.2

直接上代码:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# @Time    : 2018/1/21 0021 14:34 
# @Author  : Swper 
# @Site    : http://www.58jb.com/ 
# @File    : getWeather.py 
# @Software: PyCharm 
#python 获取搜狐天气情况 

import requests 
from bs4 import BeautifulSoup 
from email.mime.text import MIMEText 
from email.header import Header 
from email.utils import formataddr 
import smtplib 

def get_weather(city): 
    headers=("User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36" 
        "(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36") 

    url = 'http://m.sohu.com/weather/?city={0}'.format(city) 
    r = requests.get(url,headers={"User-Agent":headers}) 
    html = r.text 
    soup = BeautifulSoup(html,'html.parser')    #使用哪个解析器 
    city = soup.find('b').string 
    current = soup.find('p',{"class":"cur"}).string 
    lowest = soup.find('em',{"class":"lowest"}).string 
    highest = soup.find('em',{"class":"highest"}).string 
    stat = soup.find('em',{"class":"stat"}).string 
    pm = soup.find("div",class_="pm")        #class_ 默认class是python里的一个内置函数 
    pm_25,air_stat = map(lambda x:x.string,pm) 
    lifeNumBg = soup.find('div',class_="lifeNumBg").text 

    return ("{0} {1}\n当前气温:{2}\n最低温:{3}\n最高温:{4}\n空气气量:{5}\npm 2.5:{6}\n\n生活指数:{7}".format( 
        city,stat,current,lowest,highest,air_stat,pm_25,lifeNumBg)) 


def send_mail(result): 
    sender='XXXXXX'    # 发件人邮箱账号 
    my_pass = 'XXXXXX'              # 发件人邮箱密码(当时申请smtp给的口令) 
    receivers='XXXXXX'      # 收件人邮箱账号,我这边发送给自己 
    try: 
        msg=MIMEText(result,'plain','utf-8') 
        msg['From']=formataddr(['发件人别名',sender])          # 括号里的对应发件人邮箱昵称、发件人邮箱账号 
        msg['To']=formataddr(['收件人别名',receivers])         # 括号里的对应收件人邮箱昵称、收件人邮箱账号 
        msg['Subject']="邮件主题-测试"                         # 邮件的主题,也可以说是标题 

        # server=smtplib.SMTP_SSL("smtp.163.com", 25)        # 发件人邮箱中的SMTP服务器,如果使用ssl加密端口是465 
        server=smtplib.SMTP("smtp.163.com", 25)              # 发件人邮箱中的SMTP服务器,端口是25 
        server.login(sender, my_pass)                        # 括号中对应的是发件人邮箱账号、邮箱密码 
        server.sendmail(sender,[receivers],msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 
        server.quit()# 关闭连接 
        return True 
    except Exception as e:      # 如果 try 中的语句没有执行,就捕获异常,并返回False
        print (str(e)) 
        return False 


if __name__ == '__main__': 
    result = get_weather("东莞") 
    send_mail(result)

效果图:

这里的发邮件代码里可以不使用:formataddr 效果就是少了收、发件人的别名:

# msg['From']=Header(sender) # 括号里的对应发件人邮箱  
# msg['To']=Header(receivers)  # 括号里的对应收件人邮箱

提醒:本文最后更新于 544 天前,文中所描述的信息可能已发生改变,请谨慎使用。