获取PM2.5数值并发送到邮箱
功能说明
从http://www.pm25.com/city/beijing.html
获取北京市空气污染数据,发送到指定邮箱,一上班就可以看到空气污染情况,这样就可以更好地为人民服雾啦 O(∩_∩)O~
效果
![](https://img.haomeiwen.com/i3991150/d00ab095e47ceefe.png)
代码片段及说明
引入模块:
BeautifulSoup,是一个能够用简单的方式解析网页内容的第三方库
requests,一个比urllib简单好用且强大的处理http和抓取url内容的库
email,用于构造电子邮件内容
smtplib,负责发送电子邮件
re,正则表达式
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
import requests
import smtplib
import re
获取数据:
定义一个函数get_data()
,用于从网页中过滤出所需数据
分析网页结果会发现,指需要通过特定的class
名称就可以过滤出城市,更新时间,AQI数值,pm2.5数值和空气质量等级数据
温馨提示信息是通过查找span
标签的父标签的形式过滤出来的
所有的数据都存到了列表data
中
最后将data
返回给调用者
def get_data(url):
res = requests.get(url).content
soup = BeautifulSoup(res, 'lxml')
data = []
data.append(soup.find(class_="city_name").get_text())
data.append(soup.find(class_="citydata_updatetime").get_text())
data.append(soup.find(class_="cbol_aqi_num").get_text())
data.append(soup.find(class_="cbol_nongdu_num_1").get_text())
data.append(soup.find(class_=re.compile("cbor_gauge_level")).get_text())
data.append((soup.find('span', text='温馨提示:')).parent.get_text(strip=True))
return data
发送邮件:
定义一个函数send_mail()
,用于发送邮件
出于安全考虑我将邮件地址和密码中的部分字段使用*号替代了,请大家自行替换为有效信息
第一部分是发件和收件邮箱信息,请根据你的实际情况设置,记得要打开邮箱的SMTP服务
第二部门是邮件正文,发件人,收件人和邮件标题信息,我们使用HTML代码将正文进行了简单的格式化
第三部分是发信操作
发送成功后打印mail has been sent!
提示
def send_mail(data):
from_addr = 'cod***@163.com'
password = 'a123***'
to_addr = '3066***@qq.com'
smtp_server = 'smtp.163.com'
msg = MIMEText('<html><body>' +
'<h1>' + data[0] + '空气质量' + '</h1>' +
'<p>' + data[1] + '</p>' +
'<p>' + '空气质量AQI:' + data[2] + '</p>' +
'<p>' + 'PM2.5浓度(μg/m³):' + data[3] + '</p>' +
'<p>' + '空气质量等级:' + data[4] + '</p>' +
'<p>' + data[5] + '</p>' +
'</body></html>',
'html', 'utf-8')
msg['From'] = 'BlueSky<cod***@163.com>'
msg['To'] = 'Dir<3066***@qq.com>'
msg['Subject'] = '空气质量'
server = smtplib.SMTP(smtp_server, 25)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
print('mail has been sent!')
调用函数:
填写好对应城市的url
,作为函数get_data()
的参数
函数get_data()
的返回值作为函数send_mail()
的参数
成功运行后就可以收到效果图所示的邮件了(可能会在垃圾邮件中哦)
url = 'http://www.pm25.com/city/beijing.html'
send_mail(get_data(url))
完整代码
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
from email.mime.text import MIMEText
import requests
import smtplib
import re
def get_data(url):
res = requests.get(url).content
soup = BeautifulSoup(res, 'lxml')
data = []
data.append(soup.find(class_="city_name").get_text())
data.append(soup.find(class_="citydata_updatetime").get_text())
data.append(soup.find(class_="cbol_aqi_num").get_text())
data.append(soup.find(class_="cbol_nongdu_num_1").get_text())
data.append(soup.find(class_=re.compile("cbor_gauge_level")).get_text())
data.append((soup.find('span', text='温馨提示:')).parent.get_text(strip=True))
return data
def send_mail(data):
from_addr = 'cod***@163.com'
password = 'a123***'
to_addr = '3066***@qq.com'
smtp_server = 'smtp.163.com'
msg = MIMEText('<html><body>' +
'<h1>' + data[0] + '空气质量' + '</h1>' +
'<p>' + data[1] + '</p>' +
'<p>' + '空气质量AQI:' + data[2] + '</p>' +
'<p>' + 'PM2.5浓度(μg/m³):' + data[3] + '</p>' +
'<p>' + '空气质量等级:' + data[4] + '</p>' +
'<p>' + data[5] + '</p>' +
'</body></html>',
'html', 'utf-8')
msg['From'] = 'BlueSky<cod***@163.com>'
msg['To'] = 'Dir<3066***@qq.com>'
msg['Subject'] = '空气质量'
server = smtplib.SMTP(smtp_server, 25)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
print('mail has been sent!')
url = 'http://www.pm25.com/city/beijing.html'
send_mail(get_data(url))
存在的问题
有的网络下会报smtplib.SMTPDataError
错误,我没有找到原因,连公司网络是正常的,连家里的网络就报错,连上手机热点又是正常的。有知道的同学可以留言告诉我解决方法,感谢。
完整错误代码如下:
smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp11,D8CowACXm6nIdHVYvRMKHg--.12373S2 1484092616,please see http://mail.163.com/help/help_spam_16.htm?ip=1.180.212.115&hostid=smtp11&time=1484092616')