python办公自动化(三) | 借助服务器定时爬数据发邮件
如果,每天清晨洗漱完毕,都会收到朋友的温柔来信,告诉你今天的天气,并将你喜爱的内容发过来,这一天是不是会特别的劲儿呢?
今天,数据猿就想做一个自动邮件程序,可以将每天的天气、优美诗句,还有带给朋友的祝福,在每天的清晨准时带给他!
当然,也可以作为社畜的工具,比如每天/周给老板汇报工作进度~
本文目录如下:
分析需求
背景:每天8点左右,给朋友的邮箱发送天气情况、拜伦诗句和祝福语~
一般的项目需求可以细分为目标-输入&输出-步骤
三个部分。
经过思考,本项目需要以下内容——
-
目标:定时发邮件
-
输入:str【邮箱号、天气、诗句、祝福】
输出:html【天气、诗句、祝福合成的html】
为什么是html?因为自动发邮件需要调用
smtplib
库,内容需为html
语言格式 -
步骤:
- 爬取今日天气信息
- 提取今日诗句
- 合成html
- 发送邮件
步骤
模块搭建
首先,搭建项目的基本框架
def get_weather():
''' 爬取中国天气网,获取天气信息 '''
pass
def get_poem():
''' 获取拜伦诗句 '''
pass
def sentemail():
''' 合成内容,并发送邮件 '''
pass
if __name__ == '__main__':
''' 主函数,调用函数以上函数 '''
pass
获取天气数据
这里推荐使用中国天气网的免费API,面向个人用户免费单日可调用300次,非常良心。
详见开发指南:
https://www.tianqiapi.com/index/doc?version=v6
请求的API示例:
https://www.tianqiapi.com/api?version=v6&appid=95561987&appsecret=Wb6VbSzq&city=北京
注意需要申请注册开发者账号,获得appid
和appsecret
字段,否则获取不到内容,注册过程非常简单。
以上示例可以得到如下内容:
可以发现,是json
格式储存的天气信息,文档提供了详细的字段说明,可获取api
内容后,自由选择想要的内容。
数据猿根据需要,挑选了date、week、tem2、tem1、city、wea、win_speed、air_level、air_tips字段。
在使用requests.get()
获取了之后,使用.json()
解析,选择以上字段组成内容,返回给主函数。
获取天气数据代码如下:
def getWeather(city):
url = 'https://www.tianqiapi.com/api?version=v6&appid=213751&appsecret=fv5E&city='+city
kv={'user-agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/500.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/500.36"}
r = requests.get(url, headers=kv, timeout=5).json()
value = '亲爱的朋友,早上好!' + '\n'+ \
'今天是' + r['date'] + ' ' + r['week'] + ',\n'+ \
'气温' + r['tem2'] + '到' + r['tem1']+ ',\n'+ \
r['city'] + '今天' + r['wea'] + ', 风力' + r['win_speed'] + ',\n'+ \
'空气质量' + r['air_level'] + ', ' + r['air_tips'] + '\n'
return value
提取诗句
要读取拜伦的诗,首先需要搞到拜伦的诗集文本数据
前不久发现了一个宝藏网站,古登堡项目,网址如下:
http://www.gutenberg.org/
包含了许多电子书资源,而且很多还有txt格式的下载资源,介绍如下:
从古登堡项目里下载拜伦勋爵的诗集,存在本地Byron Poetry Collection.txt
,然后部分读取其中诗句的位置,确保每天都是一段诗句。
获取诗句部分代码如下:
def get_poem():
with open('Byron Poetry Collection.txt','r',encoding='utf-8') as f:
alltext = f.read()
start = alltext.find("Bob Southey! You're a poet, poet laureate,")
final = alltext.find('End of the Project Gutenberg EBook of Don Juan, by Lord Byron.')
# 经测试,start的几个字母会被包含,但是final的几个字母不会,所以可如下使用
alltext1 = alltext[start:final]
alltext_list = alltext1.replace(' ','').replace(' ','').split('\n\n')
while '' in alltext_list:alltext_list.remove('')
return alltext_list
合成html
smtplib
库支持html语言传入内容,这里结合html语言的组合我们的天气、诗句和祝福!
body = '<h1>The poetry of Lord Byron</h1><p>{0}</p>\n下面是您今天的拜伦小诗,请查收~\n<p></p><p>{1}</p><p>数据猿Rigggle祝你度过愉快的一天</p>'.format(wea,text)#img
# 设置邮件正文,这里是支持HTML的
msg = MIMEText(body, 'html')
发送邮件
获取授权码
首先,需要去往邮箱,进入设置-POP3/SMTP/IMAP设置,这里需要确保开启smtp功能。
如果已经开启,则继续向下,找到授权密码管理-新增授权密码,然后记住授权码。
将授权码赋值给本文pwd
变量,host
变量是服务器地址,一般163邮箱是 smtp.163.com,qq邮箱是smtp.qq.com,也可从POP3/SMTP/IMAP设置中找到。port
是发邮箱的端口,一般选择465。
如下变量值可以写出:
host = 'smtp.163.com' # 注意如果是
port = 465
sender = 'mjc_data@163.com' #这里是数据猿邮箱,请替换
pwd = 'PDSUNTQVERPZCEAC'#这里是数据猿邮箱的授权码,请替换
登录smtp并发送
设置邮件主题和收件人,收件人邮箱号赋值给receiver
变量:
msg['subject'] = '拜伦小诗来了,今天元气满满!'
msg['from'] = sender
# 设置发送人
msg['to'] = receiver
然后,使用smtplib库登录邮箱,并发送内容到收件人。将发件人邮箱号、收件人邮箱号、发件内容一同传入sendmail()
函数,即可完成邮件发送。
s = smtplib.SMTP_SSL(host, port)
s.login(sender, pwd)
s.sendmail(sender, receiver, msg.as_string())
本节代码如下:
def sentemail(receiver,city,text_n):
host = 'smtp.163.com' # 注意如果是
port = 465
sender = 'mjc_data@163.com' #替换为自己的邮箱号
pwd = 'PDSUNTQVERPZCEAC'
# 替换为自己邮箱的授权码
wea = getWeather(city)
text = get_poem()[text_n]
print('文本正常,内容为:'+ text )
body = '<h1>The poetry of Lord Byron</h1><p>{0}</p>\n下面是您今天的拜伦小诗,请查收~\n<p></p><p>{1}</p><p>数据猿Rigggle祝你度过愉快的一天</p>'.format(wea,text)#img
# 设置邮件正文,这里是支持HTML的
msg = MIMEText(body, 'html')
# 设置正文为符合邮件格式的HTML内容
msg['subject'] = '拜伦小诗来了,今天元气满满!'
# 设置邮件标题
msg['from'] = sender
# 设置发送人
msg['to'] = receiver
# 设置接收人
try:
s = smtplib.SMTP_SSL(host, port)
# 注意!如果是使用SSL端口,这里就要改为SMTP_SSL
s.login(sender, pwd)
# 登陆邮箱
s.sendmail(sender, receiver, msg.as_string())
# 发送邮件!
print ('邮件发送顺利')
except smtplib.SMTPException:
print('发送失败!请检查配置!')
整体效果如下:
定时发送
定时有两种方式,一种是到固定时间执行代码,一种是间隔一段时间执行代码。
要实现每天发送,数据猿使用time.sleep(86400)来间隔一天,86400是一天的秒数。
同时,根据拜伦诗集的内容长度,每天只获取其中一段。
if __name__ == '__main__':
receiver = ['mjc_data@163.com','myreceiver@qq.com']# 请替换为自己的收件人邮箱
for i,v in enumerate(get_poem()):
for j in receiver:
sentemail(j,'广州',i)
sleep(86400) #休息一天86400
因为需要定时、联网发送,所以最好放在服务器内,比较稳定可靠。
小结
- 本片内容是将自动发邮件、利用API获取数据、文件读写都杂糅一起了,项目难度较大,有兴趣的可多多尝试,欢迎私聊数据猿交流。
- 网络上可免费使用的API有很多,还是比较适合我们这些个人用户玩耍的,走正规途径获取内容更可靠,避免维护爬虫。
- 诗句的呈现目前做的还不好,不能像诗歌那样隔行呈现;获取天气部分目前没有深入使用
city
字段,现在只能手动调整天气的城市。 - 如需要本文代码和文件,请移步公众号后台回复 自动邮件
往期精品:
python办公自动化(一) | chardet库自动读写多编码格式的文件
python办公自动化(二) | 读取.txt、.data、.doc和.docx文档的部分内容
参考资料:
中国天气网开发指南:https://www.tianqiapi.com/index/doc?version=v6
文字编辑:数据猿Riggle
在读新闻与传播专业硕士研究生,正在毕业论文、找工作ing…
首发平台:文科数据员(ID: HSS_data)
- 点赞
- 收藏
- 关注作者
评论(0)