Python3 網(wǎng)絡(luò)爬蟲開(kāi)發(fā)實(shí)戰(zhàn)] 1.4.3-Redis 的安裝">[Python3 網(wǎng)絡(luò)爬蟲開(kāi)發(fā)實(shí)戰(zhàn)] 1.4.3-Redis 的安裝
846
2025-04-11
如果,每天清晨洗漱完畢,都會(huì)收到朋友的溫柔來(lái)信,告訴你今天的天氣,并將你喜愛(ài)的內(nèi)容發(fā)過(guò)來(lái),這一天是不是會(huì)特別的勁兒呢?
今天,數(shù)據(jù)猿就想做一個(gè)自動(dòng)郵件程序,可以將每天的天氣、優(yōu)美詩(shī)句,還有帶給朋友的祝福,在每天的清晨準(zhǔn)時(shí)帶給他!
當(dāng)然,也可以作為社畜的工具,比如每天/周給老板匯報(bào)工作進(jìn)度~
本文目錄如下:
分析需求
步驟
模塊搭建
獲取天氣數(shù)據(jù)
提取詩(shī)句
合成html
發(fā)送郵件
獲取授權(quán)碼
登錄smtp并發(fā)送
定時(shí)發(fā)送
小結(jié)
分析需求
背景:每天8點(diǎn)左右,給朋友的郵箱發(fā)送天氣情況、拜倫詩(shī)句和祝福語(yǔ)~
一般的項(xiàng)目需求可以細(xì)分為目標(biāo)-輸入&輸出-步驟三個(gè)部分。
經(jīng)過(guò)思考,本項(xiàng)目需要以下內(nèi)容——
目標(biāo):定時(shí)發(fā)郵件
輸入:str【郵箱號(hào)、天氣、詩(shī)句、祝福】
輸出:html【天氣、詩(shī)句、祝福合成的html】
為什么是html?因?yàn)樽詣?dòng)發(fā)郵件需要調(diào)用smtplib庫(kù),內(nèi)容需為html語(yǔ)言格式
步驟:
爬取今日天氣信息
提取今日詩(shī)句
合成html
發(fā)送郵件
步驟
首先,搭建項(xiàng)目的基本框架
def get_weather(): ''' 爬取中國(guó)天氣網(wǎng),獲取天氣信息 ''' pass def get_poem(): ''' 獲取拜倫詩(shī)句 ''' pass def sentemail(): ''' 合成內(nèi)容,并發(fā)送郵件 ''' pass if __name__ == '__main__': ''' 主函數(shù),調(diào)用函數(shù)以上函數(shù) ''' pass
這里推薦使用中國(guó)天氣網(wǎng)的免費(fèi)API,面向個(gè)人用戶免費(fèi)單日可調(diào)用300次,非常良心。
詳見(jiàn)開(kāi)發(fā)指南:
https://www.tianqiapi.com/index/doc?version=v6
請(qǐng)求的API示例:
https://www.tianqiapi.com/api?version=v6&appid=95561987&appsecret=Wb6VbSzq&city=北京
注意需要申請(qǐng)注冊(cè)開(kāi)發(fā)者賬號(hào),獲得appid和appsecret字段,否則獲取不到內(nèi)容,注冊(cè)過(guò)程非常簡(jiǎn)單。
以上示例可以得到如下內(nèi)容:
可以發(fā)現(xiàn),是json格式儲(chǔ)存的天氣信息,文檔提供了詳細(xì)的字段說(shuō)明,可獲取api內(nèi)容后,自由選擇想要的內(nèi)容。
數(shù)據(jù)猿根據(jù)需要,挑選了date、week、tem2、tem1、city、wea、win_speed、air_level、air_tips字段。
在使用requests.get()獲取了之后,使用.json()解析,選擇以上字段組成內(nèi)容,返回給主函數(shù)。
獲取天氣數(shù)據(jù)代碼如下:
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 = '親愛(ài)的朋友,早上好!' + '\n'+ \ '今天是' + r['date'] + ' ' + r['week'] + ',\n'+ \ '氣溫' + r['tem2'] + '到' + r['tem1']+ ',\n'+ \ r['city'] + '今天' + r['wea'] + ', 風(fēng)力' + r['win_speed'] + ',\n'+ \ '空氣質(zhì)量' + r['air_level'] + ', ' + r['air_tips'] + '\n' return value
要讀取拜倫的詩(shī),首先需要搞到拜倫的詩(shī)集文本數(shù)據(jù)
前不久發(fā)現(xiàn)了一個(gè)寶藏網(wǎng)站,古登堡項(xiàng)目,網(wǎng)址如下:
http://www.gutenberg.org/
包含了許多電子書資源,而且很多還有txt格式的下載資源,介紹如下:
從古登堡項(xiàng)目里下載拜倫勛爵的詩(shī)集,存在本地Byron Poetry Collection.txt,然后部分讀取其中詩(shī)句的位置,確保每天都是一段詩(shī)句。
獲取詩(shī)句部分代碼如下:
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.') # 經(jīng)測(cè)試,start的幾個(gè)字母會(huì)被包含,但是final的幾個(gè)字母不會(huì),所以可如下使用 alltext1 = alltext[start:final] alltext_list = alltext1.replace(' ','').replace(' ','').split('\n\n') while '' in alltext_list:alltext_list.remove('') return alltext_list
smtplib庫(kù)支持html語(yǔ)言傳入內(nèi)容,這里結(jié)合html語(yǔ)言的組合我們的天氣、詩(shī)句和祝福!
body = '
{0}
\n下面是您今天的拜倫小詩(shī),請(qǐng)查收~\n{1}
數(shù)據(jù)猿Rigggle祝你度過(guò)愉快的一天
'.format(wea,text)#img # 設(shè)置郵件正文,這里是支持HTML的 msg = MIMEText(body, 'html')首先,需要去往郵箱,進(jìn)入設(shè)置-POP3/SMTP/IMAP設(shè)置,這里需要確保開(kāi)啟smtp功能。
如果已經(jīng)開(kāi)啟,則繼續(xù)向下,找到授權(quán)密碼管理-新增授權(quán)密碼,然后記住授權(quán)碼。
將授權(quán)碼賦值給本文pwd變量,host變量是服務(wù)器地址,一般163郵箱是 smtp.163.com,qq郵箱是smtp.qq.com,也可從POP3/SMTP/IMAP設(shè)置中找到。port是發(fā)郵箱的端口,一般選擇465。
如下變量值可以寫出:
host = 'smtp.163.com' # 注意如果是 port = 465 sender = 'mjc_data@163.com' #這里是數(shù)據(jù)猿郵箱,請(qǐng)?zhí)鎿Q pwd = 'PDSUNTQVERPZCEAC'#這里是數(shù)據(jù)猿郵箱的授權(quán)碼,請(qǐng)?zhí)鎿Q
設(shè)置郵件主題和收件人,收件人郵箱號(hào)賦值給receiver變量:
msg['subject'] = '拜倫小詩(shī)來(lái)了,今天元?dú)鉂M滿!' msg['from'] = sender # 設(shè)置發(fā)送人 msg['to'] = receiver
然后,使用smtplib庫(kù)登錄郵箱,并發(fā)送內(nèi)容到收件人。將發(fā)件人郵箱號(hào)、收件人郵箱號(hào)、發(fā)件內(nèi)容一同傳入sendmail()函數(shù),即可完成郵件發(fā)送。
s = smtplib.SMTP_SSL(host, port) s.login(sender, pwd) s.sendmail(sender, receiver, msg.as_string())
本節(jié)代碼如下:
def sentemail(receiver,city,text_n): host = 'smtp.163.com' # 注意如果是 port = 465 sender = 'mjc_data@163.com' #替換為自己的郵箱號(hào) pwd = 'PDSUNTQVERPZCEAC' # 替換為自己郵箱的授權(quán)碼 wea = getWeather(city) text = get_poem()[text_n] print('文本正常,內(nèi)容為:'+ text ) body = '
{0}
\n下面是您今天的拜倫小詩(shī),請(qǐng)查收~\n{1}
數(shù)據(jù)猿Rigggle祝你度過(guò)愉快的一天
'.format(wea,text)#img # 設(shè)置郵件正文,這里是支持HTML的 msg = MIMEText(body, 'html') # 設(shè)置正文為符合郵件格式的HTML內(nèi)容 msg['subject'] = '拜倫小詩(shī)來(lái)了,今天元?dú)鉂M滿!' # 設(shè)置郵件標(biāo)題 msg['from'] = sender # 設(shè)置發(fā)送人 msg['to'] = receiver # 設(shè)置接收人 try: s = smtplib.SMTP_SSL(host, port) # 注意!如果是使用SSL端口,這里就要改為SMTP_SSL s.login(sender, pwd) # 登陸郵箱 s.sendmail(sender, receiver, msg.as_string()) # 發(fā)送郵件! print ('郵件發(fā)送順利') except smtplib.SMTPException: print('發(fā)送失敗!請(qǐng)檢查配置!')整體效果如下:
定時(shí)有兩種方式,一種是到固定時(shí)間執(zhí)行代碼,一種是間隔一段時(shí)間執(zhí)行代碼。
要實(shí)現(xiàn)每天發(fā)送,數(shù)據(jù)猿使用time.sleep(86400)來(lái)間隔一天,86400是一天的秒數(shù)。
同時(shí),根據(jù)拜倫詩(shī)集的內(nèi)容長(zhǎng)度,每天只獲取其中一段。
if __name__ == '__main__': receiver = ['mjc_data@163.com','myreceiver@qq.com']# 請(qǐng)?zhí)鎿Q為自己的收件人郵箱 for i,v in enumerate(get_poem()): for j in receiver: sentemail(j,'廣州',i) sleep(86400) #休息一天86400
因?yàn)樾枰〞r(shí)、聯(lián)網(wǎng)發(fā)送,所以最好放在服務(wù)器內(nèi),比較穩(wěn)定可靠。
小結(jié)
本片內(nèi)容是將自動(dòng)發(fā)郵件、利用API獲取數(shù)據(jù)、文件讀寫都雜糅一起了,項(xiàng)目難度較大,有興趣的可多多嘗試,歡迎私聊數(shù)據(jù)猿交流。
網(wǎng)絡(luò)上可免費(fèi)使用的API有很多,還是比較適合我們這些個(gè)人用戶玩耍的,走正規(guī)途徑獲取內(nèi)容更可靠,避免維護(hù)爬蟲。
詩(shī)句的呈現(xiàn)目前做的還不好,不能像詩(shī)歌那樣隔行呈現(xiàn);獲取天氣部分目前沒(méi)有深入使用city字段,現(xiàn)在只能手動(dòng)調(diào)整天氣的城市。
如需要本文代碼和文件,請(qǐng)移步公眾號(hào)后臺(tái)回復(fù) 自動(dòng)郵件
往期精品:
Python辦公自動(dòng)化(一) | chardet庫(kù)自動(dòng)讀寫多編碼格式的文件
Python辦公自動(dòng)化(二) | 讀取.txt、.data、.doc和.docx文檔的部分內(nèi)容
參考資料:
中國(guó)天氣網(wǎng)開(kāi)發(fā)指南:https://www.tianqiapi.com/index/doc?version=v6
文字編輯:數(shù)據(jù)猿Riggle
在讀新聞與傳播專業(yè)碩士研究生,正在畢業(yè)論文、找工作ing…
首發(fā)平臺(tái):文科數(shù)據(jù)員(ID: HSS_data)
API HTML Python 云速郵箱 自動(dòng)化測(cè)試
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。