背景
今天发现了一个第三方库yagmail,该库可以帮助我们用Python实现发送邮件这个功能,只需要两行就可以发送文本内容哟,大大减少了我们的代码量。但是单纯亮代码感觉没啥意思,所以就做个小案例:爬取天气预报,并将数据发送给自己的QQ邮箱,Let’s go~
数据来源
这里有一个天气预报的接口:
http://wthrcdn.etouch.cn/weather_mini?city=龙岩
返回的数据是json格式的,这样我们就能很轻易的提取数据啦
安装所需要的库
- requests:是一个第三方库,用于向服务器发送请求以及获取响应
- yagmail:也是第三方库,用于发送邮件
- re:第三方库,用于提取数据
使用pip包管理器进行安装:pip install 模块名
下载原始数据
使用第三方库>>requests来下载json数据,使用前需要提前安装好哦~
import requests
def WeatherSpider():
"""
下载天气预报的数据
"""
url = 'http://wthrcdn.etouch.cn/weather_mini?city=龙岩'
response = requests.get(url)
data = response.json()
print(data)
return data
- 使用get()方法下载数据,需要传入要访问的url
- get获取到的数据是文本格式,我们要将其转化为json格式的数据,方便后期提取数据
这样子看起来很乱,所以我们将它格式化一下,这里使用:https://www.json.cn/# 对json进行美化
提取数据
通过美化后的json数据,我们可以看到以下信息以及对应的位置:
- 查询的城市:data —> city
- 天气情况:data —> forecast —> date / high / low / fengli / type
- 注意事项:data —> ganmao
- 当前温度:data —> wendu
知道了数据的具体位置,我们就可以着手通过代码将所需数据提取出来,并通过正则将不需要的部分进行剔除
import re
def getData(data):
"""
提取数据
"""
city = data['data']['city']
forecast = data['data']['forecast']
s = f'城市:{city}\n'
for i in forecast:
date = i['date']
temp_high = i['high']
temp_high = re.findall('高温\s(.*)', temp_high)[0]
temp_low = i['low']
temp_low = re.findall('低温\s(.*)', temp_low)[0]
fengli = i['fengli']
fengli = re.findall('<!\[CDATA\[(.*)\]\]>', fengli)[0]
s += date + f' ==> 温度:{temp_high} ~ {temp_low}, 风力:{fengli}\n'
tip = data['data']['ganmao']
s += f'建议:{tip}'
print(s)
return s
正则部分我就不详细解释了我们将所有数据都拼接成了一行字符串,作为邮件的正文,来看看拼接后的结果吧
发送邮件
这里就要使用yagmail这个库啦
import yagmail
def sendEmail(subject, content):
"""
发送邮件
"""
user= 'xxxxxxx@qq.com'
password = 'yyyyyyyyyyy'
host = 'smtp.qq.com'
# 连接SMTP服务器
yag = yagmail.SMTP(user=user, password=password, host=host)
# 邮件主题
subject = subject
# 邮件正文
content = content
# 接收方,这里是发送给自己
reciever = user
# 发送邮件
yag.send(to=reciever, subject=subject, contents=content)
print('发送邮件成功')
-
使用yagmail的SMTP()方法连接SMTP服务器,需要提供QQ邮箱账号、授权码以及stmp服务器等参数,记住是授权码,而不是邮箱登录密码哟,那么授权码如何获得呢?点击下面的url就知道咯
https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256 -
使用send()方法发送邮件给对方,需要传入接受方的QQ邮箱账号,主题以及正文内容
是不是很方便呢哈哈~ 只要两步就可以发送邮件了
整合代码
import yagmail
import re
import requests
def weatherSpider():
"""
获取天气数据
"""
url = 'http://wthrcdn.etouch.cn/weather_mini?city=龙岩'
data = requests.get(url).json()
return data
def getData(data):
"""
提取数据
"""
city = data['data']['city']
forecast = data['data']['forecast']
s = f'城市:{city}\n'
for i in forecast:
date = i['date']
temp_high = i['high']
temp_high = re.findall('高温\s(.*)', temp_high)[0]
temp_low = i['low']
temp_low = re.findall('低温\s(.*)', temp_low)[0]
fengli = i['fengli']
fengli = re.findall('<!\[CDATA\[(.*)\]\]>', fengli)[0]
s += date + f' ==> 温度:{temp_high} ~ {temp_low}, 风力:{fengli}\n'
tip = data['data']['ganmao']
s += f'建议:{tip}'
return s
def sendEmail(subject, content):
"""
发送邮件
"""
user= 'xxxxxxxx@qq.com'
password = 'yyyyyyyy'
host = 'smtp.qq.com'
yag = yagmail.SMTP(user=user, password=password, host=host)
subject = subject
content = content
yag.send(to=user, subject=subject, contents=content)
print('发送邮件成功')
data = weatherSpider()
s = getData(data)
sendEmail('未来5天的天气预报', s)
接下来就是见证奇迹的时候, 来看看能否成功哦那个发送吧~
好啦, 今天的分享就到这咯 ~