python爬虫Codez.python我的Python自学之路

获取PM2.5数值并发送到邮箱

2017-01-10  本文已影响93人  _weber_
功能说明

http://www.pm25.com/city/beijing.html获取北京市空气污染数据,发送到指定邮箱,一上班就可以看到空气污染情况,这样就可以更好地为人民服雾啦 O(∩_∩)O~

效果
邮件截图
代码片段及说明
引入模块:

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')

上一篇 下一篇

猜你喜欢

热点阅读