使用python實(shí)現(xiàn)定時(shí)報(bào)天氣的示例代碼
前言
如果你和我一樣偶爾看看股票,看看自己關(guān)注的股票是漲了還是跌了,或者想快速獲取到想看的頭條新聞,我們不必把過(guò)多的注意力放在去尋找上面,我們只需要讓爬蟲(chóng)程序每天自動(dòng)為你發(fā)送你想要了解的信息就可以了,這樣就能掌控我們的注意力,更好的去享受生活。
一.分析爬取目標(biāo)
這里就不爬取股票的信息,我來(lái)爬一個(gè)天氣預(yù)報(bào)的信息,然后實(shí)現(xiàn)每天定時(shí)發(fā)送。打開(kāi)下面的鏈接就能跳轉(zhuǎn)到中國(guó)氣象網(wǎng)
http://www.weather.com.cnnn/
點(diǎn)擊溫度那個(gè)位置就可以進(jìn)入下面的圖
我們可以看到7天的天氣和8-15天的天氣,再往后對(duì)我們來(lái)說(shuō)就沒(méi)必要了。我們查看七日的天氣預(yù)報(bào),直接爬11日的天氣,鼠標(biāo)右鍵->檢查->Network->刷新網(wǎng)頁(yè)->查看列表第一個(gè),再點(diǎn)擊preview
可以看到數(shù)據(jù)在HTML里面,然后回到element
可以發(fā)現(xiàn),溫度數(shù)據(jù)放在<p class="tem">
之下?!岸嘣啤彼诘奈恢檬?code><p title="晴" class="wea">晴</p>。
import requests headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'} # 封裝headers #這里對(duì)應(yīng)的是我選的城市,可以換自己所在城市 url = 'http://www.weather.com.cn/weather/101010100.shtml' # 把URL鏈接賦值到變量url上 res = requests.get(url, headers=headers) # 發(fā)送requests請(qǐng)求,并把響應(yīng)的內(nèi)容賦值到變量res中。 print(res.text) # 打印出res對(duì)象的網(wǎng)頁(yè)源代碼 print(res.status_code) # 檢查響應(yīng)狀態(tài)是否正常
看結(jié)果可以看到是響應(yīng)是正常的,但是出現(xiàn)了亂碼。但是莫慌。加上一句res.encoding='utf-8'
就行了。
接下來(lái)就可以寫(xiě)完整的爬取信息的代碼了
import requests from bs4 import BeautifulSoup headers={'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36'} #封裝headers url='http://www.weather.com.cn/weather/101010100.shtml' #把URL鏈接賦值到變量url上 res=requests.get(url,headers=headers) #發(fā)送requests請(qǐng)求,并把響應(yīng)的內(nèi)容賦值到變量res中 res.encoding='utf-8' bsdata=BeautifulSoup(res.text,'html.parser') #使用bs模塊解析獲取到的數(shù)據(jù) data_temperature= bsdata.find(class_='tem') #使用find()取出天氣的溫度數(shù)據(jù) data_weather= bsdata.find(class_='wea') #使用find()取出天氣的文字描述 print(data_temperature.text) #取出變量data_temperature中的字符串內(nèi)容,并打印 print(data_weather.text) #取出變量data_weather中的字符串內(nèi)容,并打印
可以成功的得到需要的數(shù)據(jù)。
其實(shí)最難的不是爬蟲(chóng),爬這種信息新手應(yīng)該都會(huì),接下里才是重頭戲。
二.信息的發(fā)送
如果我們想要實(shí)現(xiàn)發(fā)送郵件,這里以qq郵件為例要經(jīng)過(guò)以下的步驟:
- 連接郵件服務(wù)器
- 使用郵箱賬號(hào)密碼登錄
- 填寫(xiě)收件人,主題,正文等
- 發(fā)送郵件
所以連接服務(wù)器要用到用到smtplib庫(kù),填寫(xiě)主題和撰寫(xiě)正文,需要用到email庫(kù)(python真的是yyds)
1.連接服務(wù)器
SMTP代表簡(jiǎn)單郵件傳輸協(xié)議,相當(dāng)于一種計(jì)算機(jī)之間發(fā)郵件的約定
smtplib是不需要安裝的,smtplib是python的一個(gè)內(nèi)置庫(kù),有興趣的小伙伴可以看看官方文檔
看下面的代碼
import smtplib mailhost='smtp.qq.com' #把qq郵箱的服務(wù)器地址賦值到變量mailhost上,地址需要是字符串的格式。 qqmail = smtplib.SMTP() #實(shí)例化一個(gè)smtplib模塊里的SMTP類(lèi)的對(duì)象,這樣就可以SMTP對(duì)象的方法和屬性了 qqmail.connect(mailhost,25) #連接服務(wù)器,第一個(gè)參數(shù)是服務(wù)器地址,第二個(gè)參數(shù)是SMTP端口號(hào)
**mailhost=‘smtp.qq.com'**這句是qq郵箱的服務(wù)器地址,這個(gè)是可以查得到的
用SMTP對(duì)象的connect()方法連接服務(wù)器,第一個(gè)參數(shù)是獲取到的服務(wù)器地址,第二個(gè)參數(shù)是SMTP端口號(hào)——25。端口號(hào)的選擇不是唯一的,但是25是一個(gè)最簡(jiǎn)單、最基礎(chǔ)的端口號(hào),所以我們填25。
2.獲取賬號(hào)和密碼
此密碼非彼密碼,這個(gè)密碼需要我們?nèi)サ竭@里獲?。篽ttps://mail.qq.com/,登錄你的郵箱。然后點(diǎn)擊位于頂部的【設(shè)置】按鈕,選擇【賬戶(hù)設(shè)置】。
下拉到這個(gè)位置
點(diǎn)擊開(kāi)啟第一個(gè),然后得到授權(quán)碼,如果以前獲取過(guò)但是忘了,就需要發(fā)送短信重新獲取,這個(gè)碼一定不要外漏?。。?br />
import smtplib mailhost='smtp.qq.com' #把qq郵箱的服務(wù)器地址賦值到變量mailhost上 qqmail = smtplib.SMTP() #實(shí)例化一個(gè)smtplib模塊里的SMTP類(lèi)的對(duì)象,這樣就可以SMTP對(duì)象的方法和屬性了 qqmail.connect(mailhost,25) #連接服務(wù)器,第一個(gè)參數(shù)是服務(wù)器地址,第二個(gè)參數(shù)是SMTP端口號(hào)。 sender = input('請(qǐng)輸入你的郵箱:') #獲取郵箱賬號(hào) password = input('請(qǐng)輸入你的密碼:') #獲取郵箱密碼 qqmail.login(sender,password) #登錄郵箱,第一個(gè)參數(shù)為郵箱賬號(hào),第二個(gè)參數(shù)為郵箱密碼 receiver=input('請(qǐng)輸入收件人的郵箱:') #獲取收件人的郵箱
所填密碼就是剛才獲取的授權(quán)碼
3.填寫(xiě)主題和撰寫(xiě)正文
在這里就需要用到email庫(kù)。
from email.mime.text import MIMEText from email.header import Header content=input('請(qǐng)輸入郵件正文:') #輸入你的郵件正文 message = MIMEText(content, 'plain', 'utf-8') #實(shí)例化一個(gè)MIMEText郵件對(duì)象,該對(duì)象需要寫(xiě)進(jìn)三個(gè)參數(shù),分別是郵件正文,文本格式和編碼 subject = input('請(qǐng)輸入你的郵件主題:') #用input()獲取郵件主題 message['Subject'] = Header(subject, 'utf-8')
我們還需要引入了email庫(kù)中的MIMEText模塊和Header模塊
最后一行代碼:在等號(hào)的右邊,是實(shí)例化了一個(gè)Header郵件頭對(duì)象,該對(duì)象需要寫(xiě)入兩個(gè)參數(shù),分別是郵件主題和編碼,然后賦值給等號(hào)左邊的變量message[‘Subject'],message[‘Subject']就代表著根據(jù)MIMEText類(lèi)里面的Subject的屬性名取到該屬性
代碼有注釋還不明白的話(huà)可以去看看文檔,
4.發(fā)送郵件和退出郵箱
將前面的代碼整合以下
from email.mime.text import MIMEText from email.header import Header #引入Header和MIMEText模塊 content=input('請(qǐng)輸入郵件正文:') #輸入你的郵件正文 message = MIMEText(content, 'plain', 'utf-8') #實(shí)例化一個(gè)MIMEText郵件對(duì)象,該對(duì)象需要寫(xiě)進(jìn)三個(gè)參數(shù),分別是郵件正文,文本格式和編碼 subject = input('請(qǐng)輸入你的郵件主題:') #用input()獲取郵件主題 message['Subject'] = Header(subject, 'utf-8') qqmail.sendmail(sender, receiver, message.as_string()) qqmail.quit() #退出郵箱
sendmail() 發(fā)送郵件,括號(hào)里面有三個(gè)參數(shù),第1個(gè)是發(fā)件人的郵箱地址,第2個(gè)是收件人的郵箱地址,第3個(gè)是正文,但必須是字符串格式,所以用as_string()函數(shù)轉(zhuǎn)換了一下。
但是我們希望發(fā)送成功后能顯示“郵件發(fā)送成功”,失敗的時(shí)候能提示我們“郵件發(fā)送失敗”,可以使用try語(yǔ)句來(lái)實(shí)現(xiàn)。
try: qqmail.sendmail(sender, receiver, message.as_string()) print ('郵件發(fā)送成功') except: print ('郵件發(fā)送失敗') qqmail.quit()
三.定時(shí)發(fā)送
關(guān)于時(shí)間,其實(shí)Python有兩個(gè)內(nèi)置的標(biāo)準(zhǔn)庫(kù)——time和datetime,但是我們不用,誒,就是玩,我們可以用第三方庫(kù)schedule其實(shí)是有原因的:對(duì)于我們需要的定時(shí)功能,time和datetime當(dāng)然能實(shí)現(xiàn),但操作邏輯會(huì)相對(duì)復(fù)雜;而schedule就是可以直接解決定時(shí)功能,代碼比較簡(jiǎn)單,這是我們選擇schedule的原因。
官方文檔鏈接:https://pypi.org/project/schedule/
根據(jù)文檔我們做一個(gè)每3秒運(yùn)行一次的程序
import schedule import time #引入schedule和time模塊 def job(): print("Working in progress...") #定義一個(gè)叫job的函數(shù),函數(shù)的功能是打印'I'm working...' schedule.every(3).seconds.do(job) while True: schedule.run_pending() time.sleep(1)
也可以設(shè)置在某個(gè)時(shí)間發(fā)送,用法很多,這里就不展開(kāi)。最后把這些代碼全部合并整合一下,下面看效果
四.效果
這里我定的下午三點(diǎn)四十六,然后發(fā)送成功,我打開(kāi)我的郵箱確實(shí)能收到
這個(gè)功能我放在服務(wù)器上用了很久了,爬一些平時(shí)自己必看的信息,然后發(fā)送,減少了自己被其他東西吸引注意力的幾率。
這篇文章不在于爬取天氣信息這塊,而是通過(guò)這種方式去實(shí)現(xiàn)定時(shí)發(fā)送郵件,只要用的好能為自己省下很多的時(shí)間和精力去在信息大海里面查找自己想要的信息。
到此這篇關(guān)于使用python實(shí)現(xiàn)定時(shí)報(bào)天氣的示例代碼的文章就介紹到這了,更多相關(guān)python 定時(shí)報(bào)天氣內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django通過(guò)dwebsocket實(shí)現(xiàn)websocket的例子
今天小編就為大家分享一篇Django通過(guò)dwebsocket實(shí)現(xiàn)websocket的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11使用Python分析文本數(shù)據(jù)的詞頻并詞云圖可視化
這篇文章主要給大家介紹了關(guān)于如何使用Python分析文本數(shù)據(jù)的詞頻并詞云圖可視化,文章中有詳細(xì)的圖文介紹和代碼示例,對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-09-09Python中使用kitti數(shù)據(jù)集實(shí)現(xiàn)自動(dòng)駕駛(繪制出所有物體的行駛軌跡)
這篇文章主要介紹了Python中使用kitti數(shù)據(jù)集實(shí)現(xiàn)自動(dòng)駕駛——繪制出所有物體的行駛軌跡,本次內(nèi)容主要是畫(huà)出kitti車(chē)的行駛的軌跡,需要的朋友可以參考下2022-06-06Pandas實(shí)現(xiàn)dataframe和np.array的相互轉(zhuǎn)換
今天小編就為大家分享一篇Pandas實(shí)現(xiàn)dataframe和np.array的相互轉(zhuǎn)換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Python3.6安裝卸載、執(zhí)行命令、執(zhí)行py文件的方法詳解
這篇文章主要介紹了Python3.6之安裝卸載、執(zhí)行命令、執(zhí)行py文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Python+Pillow+Pytesseract實(shí)現(xiàn)驗(yàn)證碼識(shí)別
這篇文章主要為大家詳細(xì)介紹了如何利用pillow和pytesseract來(lái)實(shí)現(xiàn)驗(yàn)證碼的識(shí)別,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05十一個(gè)案例帶你吃透Python函數(shù)參數(shù)
這篇文章主要通過(guò)十一個(gè)案例帶大家一起了解一下Python中的函數(shù)參數(shù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-08-08