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


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

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

Pycharm:4.0.7  

Python:3.5.2

直接上代码:

  1. #!/usr/bin/env python 
  2. # -*- coding: utf-8 -*- 
  3. # @Time    : 2018/1/21 0021 14:34 
  4. # @Author  : Swper 
  5. # @Site    : http://www.58jb.com/ 
  6. # @File    : getWeather.py 
  7. # @Software: PyCharm 
  8. #python 获取搜狐天气情况 
  9.  
  10. import requests 
  11. from bs4 import BeautifulSoup 
  12. from email.mime.text import MIMEText 
  13. from email.header import Header 
  14. from email.utils import formataddr 
  15. import smtplib 
  16.  
  17. def get_weather(city): 
  18.     headers=("User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36" 
  19.         "(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36") 
  20.  
  21.     url = 'http://m.sohu.com/weather/?city={0}'.format(city) 
  22.     r = requests.get(url,headers={"User-Agent":headers}) 
  23.     html = r.text 
  24.     soup = BeautifulSoup(html,'html.parser')    #使用哪个解析器 
  25.     city = soup.find('b').string 
  26.     current = soup.find('p',{"class":"cur"}).string 
  27.     lowest = soup.find('em',{"class":"lowest"}).string 
  28.     highest = soup.find('em',{"class":"highest"}).string 
  29.     stat = soup.find('em',{"class":"stat"}).string 
  30.     pm = soup.find("div",class_="pm")        #class_ 默认class是python里的一个内置函数 
  31.     pm_25,air_stat = map(lambda x:x.string,pm) 
  32.     lifeNumBg = soup.find('div',class_="lifeNumBg").text 
  33.  
  34.     return ("{0} {1}\n当前气温:{2}\n最低温:{3}\n最高温:{4}\n空气气量:{5}\npm 2.5:{6}\n\n生活指数:{7}".format( 
  35.         city,stat,current,lowest,highest,air_stat,pm_25,lifeNumBg)) 
  36.  
  37.  
  38. def send_mail(result): 
  39.     sender='XXXXXX'    # 发件人邮箱账号 
  40.     my_pass = 'XXXXXX'              # 发件人邮箱密码(当时申请smtp给的口令) 
  41.     receivers='XXXXXX'      # 收件人邮箱账号,我这边发送给自己 
  42.     try: 
  43.         msg=MIMEText(result,'plain','utf-8') 
  44.         msg['From']=formataddr(['发件人别名',sender])          # 括号里的对应发件人邮箱昵称、发件人邮箱账号 
  45.         msg['To']=formataddr(['收件人别名',receivers])         # 括号里的对应收件人邮箱昵称、收件人邮箱账号 
  46.         msg['Subject']="邮件主题-测试"                 # 邮件的主题,也可以说是标题 
  47.  
  48.         # server=smtplib.SMTP_SSL("smtp.163.com", 25)   # 发件人邮箱中的SMTP服务器,如果使用ssl加密端口是465 
  49.         server=smtplib.SMTP("smtp.163.com", 25)   # 发件人邮箱中的SMTP服务器,端口是25 
  50.         server.login(sender, my_pass)   # 括号中对应的是发件人邮箱账号、邮箱密码 
  51.         server.sendmail(sender,[receivers],msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件 
  52.         server.quit()# 关闭连接 
  53.         return True 
  54.     except Exception as e:      # 如果 try 中的语句没有执行,就捕获异常,并返回False
  55.         print (str(e)) 
  56.         return False 
  57.  
  58.  
  59. if __name__ == '__main__': 
  60.     result = get_weather("东莞") 
  61.     send_mail(result) 

 效果图:

 

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

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