10分鐘教你用python獲取天氣并發(fā)送郵件提醒

前言

今天沒妹子約陪踩,剛好研究一下杖们。如何用神奇的python打造一個(gè)把妹神器吧〖缈瘢看完這個(gè)摘完,你們就能走向人生巔峰,迎娶白富美啦傻谁。

我知道你們想看看效果

image

當(dāng)然啦孝治,這只是測試版的效果,真正的版本可比這個(gè)厲害多啦审磁。不過作為一個(gè)直男谈飒,另一個(gè)男的給小編發(fā)這個(gè)測試感覺還是有點(diǎn)怪怪的哈。

文:吉柏言

暑假來了态蒂,各位又不得不和男女朋友暫時(shí)分開2個(gè)月了:即搿!長達(dá)兩個(gè)月的時(shí)間里不能相見钾恢,你可知我多想你啊手素,想知道你的城市下雨了嗎,想知道你帶傘了嗎瘩蚪,想知道你長什么樣泉懦,想知道你叫啥,咳咳疹瘦,單身汪小編表示情緒穩(wěn)定崩哩。

沒關(guān)系,雖然不能見面言沐,但是云關(guān)懷還是要到的嘛邓嘹,每天查一查你那里的天氣如何,送上作為男朋友的關(guān)切問候呢灶,再配上一張愛你的圖片吴超,噫~~钉嘹。但是作為絕地雞王那必須每晚吃雞呀鸯乃,早上醒來忘了打卡怎么辦泣矛?株扛? 能讓機(jī)器干的活我們何必自己動手呢?當(dāng)然可以走一波python大法好啦徘铝!

今天的代碼我們要做得就是定點(diǎn)打卡陈辱,每天向親愛的女票送去溫暖的祝福~~奖年,單身汪小編表示情緒穩(wěn)定。

環(huán)境準(zhǔn)備

首先沛贪,安裝我們需要的庫:

import requests
from bs4 import BeautifulSoup
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import os

我們用requests + bs4 庫進(jìn)行爬取當(dāng)日的天氣狀況以及我們需要的圖片陋守,用email庫和smtplib庫來發(fā)郵件震贵,當(dāng)中我們還需要os庫對其他文件進(jìn)行操作。

開始搞事

首先爬取天氣狀況和圖片資源水评,我選擇的是對中國氣象臺和豆瓣上一位名為名為“狼魄乾坤”的網(wǎng)友的豆瓣相冊進(jìn)行爬取猩系,首先本著盜亦有道的原則,先查看robots協(xié)議中燥。


image
image

很好寇甸,中央氣象站沒有robots協(xié)議,豆瓣也沒有對相冊加以限制疗涉,那么我們可以放心大膽地爬取了拿霉。

進(jìn)入網(wǎng)站,查找一下她所在的城市咱扣,本汪沒有女票就以自己所在的城市為例子了绽淘。

http://www.nmc.cn/publish/forecast/AHB/wuhan.html 。分析一下這個(gè)地址闹伪,發(fā)現(xiàn)對于城市的分類命名規(guī)則是A+省份簡寫如湖北(HB)以及城市拼音收恢,對于一些比較模糊的省份簡寫小編附在下圖的代碼中:

def main():
#    print("河北HE 內(nèi)蒙古NM 陜西SN 黑龍江HL 河南HA")
#    province = input("input the province,the big alpha for short:")
#    city = input("input the city you wanna search plz:")
    province = "HB"
    city = "wuhan"
    url = "http://www.nmc.cn/publish/forecast/A" + province + "/" + city + ".html"
    html = getHTMLText(url)
    url = "https://www.douban.com/photos/album/157693223/"
    image = getHTMLText(url)

請忽略小編的辣雞英文。

getHTMLText(url)是自定義方法祭往,為的是獲取網(wǎng)頁的源代碼伦意,返回值為包含整個(gè)源代碼的字符串:

def getHTMLText(url):
    try:
        r = requests.get(url)
        print(r.raise_for_status)
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

我們用requests.get(url)向網(wǎng)站提出爬取申請,用raise_for_status查看狀態(tài)碼硼补,如果為200則說明爬取成功驮肉,然后我們用apparent_encoding替換掉encoding,這是讓程序自己識別編碼方式已骇,保證返回的不是亂碼离钝。倘若爬取過程沒有出錯(cuò),就把爬下來的新鮮的天氣信息素材返回給變量html褪储。用同樣的方法卵渴,我們獲取新鮮的圖片庫的素材也用同樣的方法,返回給變量image鲤竹。

    imagLink = []
    whetherInfo = parserHTMLWeather(html)
    name = 1
    for image in imagLink:
        print(image)
    for image in imagLink:
        downloadPicture(image,name)
        name += 1

回到main方法浪读,我們要聲明一個(gè)imagLink的列表,用來存放每個(gè)圖庫中每個(gè)圖的地址辛藻,whetherInfo用來存儲解析后的html的信息碘橘。打印image確定地址返回?zé)o誤,因?yàn)樵趫D庫的源碼中有豆瓣自己的大圖地址和圖片的地址吱肌,我們需要的是圖片地址痘拆,確定無誤后就可以逐個(gè)進(jìn)行下載圖片資源了。

先來看解析天氣信息的parserHTMLWeather方法:

def parserHTMLWeather(html):
    try:
        dirt = {}
        soup = BeautifulSoup(html,"html.parser")
        place = soup.find(name = "head").find("title")
        dirt["place"] = str(place.string).split("-")[0]
        AnnoceTime = soup.find(name = 'div', attrs = {"class":"btitle"}).find("span")
        dirt["AnnoceTime"] = str(AnnoceTime.string)
        Everyday = AnnoceTime.find_parent().find_next_sibling().find_all(name = "div",class_ = "detail")
        for eachday in Everyday:
            info = eachday.find(name = "div",class_ = "day")
            thisDay = {}
            date = str(info.find(name = "div",class_ = "date").string)
            week = str(info.find(name = "div",class_ = "week").string)
            wdesc = str(info.find(name = "div",class_ = "wdesc").string)
            temp = str(info.find(name = "div",class_ = "temp").string)
            direct = str(info.find(name = "div",class_ = "direct").string)
            wind = str(info.find(name = "div",class_ = "wind").string)

            thisDay["date"] = date
            thisDay["week"] = week
            thisDay["wdesc"] = wdesc
            thisDay["temp"] = temp
            thisDay["direct"] = direct
            thisDay["wind"] = wind
            dirt[thisDay["date"]] = thisDay

        return dirt
    except:
        return {}

首先先聲明dirt為一個(gè)字典氮墨,然后把html用beautifulSoup庫對其進(jìn)行解析纺蛆,解析后的soup對象可以調(diào)用它的find方法和find_all方法開始尋找我們需要的信息所對應(yīng)的標(biāo)簽吐葵。至于哪個(gè)信息對應(yīng)哪個(gè)標(biāo)簽,可以在瀏覽器中用ctrl + F的快捷鍵調(diào)出搜索框桥氏。獲取到我們需要的信息后折联,我們可以把它進(jìn)行加工保存在每天的thisDay字典里,然后再把7天的thisDay字典加入dirt字典里识颊,最后返回dirt字典诚镰。具體的加工方法就是用split方法切片、提取祥款。當(dāng)然也可以選擇正則表達(dá)式清笨,需要額外再引用re庫。

然后是解析圖片:

def parserHTMLPicture(imag,imagLink):
    try:
        soup = BeautifulSoup(imag,"html.parser")
#        next_url = soup.find(name = 'link',rel = 'next')['href']
#        next_page = getHTMLText(next_url)
        imagAddress = soup.find(name='div',class_ = 'photolst clearfix').find_all(name = 'img')
        for image in imagAddress:
            imagLink.append(image['src'])
        
        return imagLink
    except:
        return []

解析圖片我們只需要把圖片的地址獲取到imagLink列表中即可刃跛。然后我們遍歷這個(gè)列表抠艾,并且下載這些圖片:

def downloadPicture(url,name):
    root = 'C:\\Users\\10990\\Pictures\\'#這里填保存的路徑
    path = root + str(name) + '.jpg'
    try:
        if not os.path.exists(root):
            os.mkdir(root)
        if not os.path.exists(path):
            r = requests.get(url)
            with open(path,'wb') as f:
                f.write(r.content)
                f.close()
                print("文件保存成功")
        else:
            print("文件已存在")
    except:
        print("爬取失敗")

在下載前我們要注意判斷路徑是否存在,若不存在要建立一個(gè)桨昙,在開始爬之前要留意是否已經(jīng)爬取過检号,若已經(jīng)存在則跳過。命名我是以數(shù)字順序命名的蛙酪,在后續(xù)調(diào)用中也更方便齐苛。

然后我們需要新建一個(gè)txt文件,用來保存本次發(fā)送的照片名字桂塞,注意該文件應(yīng)該和代碼的py文件保存在同一路徑下凹蜂。

回到main()方法

with open('pictureName.txt','r') as f:
        name = eval(f.read())
        f.close()
    with open('pictureName.txt','w') as f:
        newName = str(name + 1)
        f.write(newName)
        f.close()
    msgRoot = makeMessage(whetherInfo,name)
sendMsg(msgRoot)

然后我們讀取當(dāng)前的圖片名,賦給name阁危,再把name名加一后重新保存下來玛痊,這樣每天發(fā)給女票的就是一張新的圖片了。然后要把我們的天氣信息和我們每天想說的話以及圖片打包成一個(gè)email對象發(fā)送出去就行啦狂打。

def makeMessage(dirt,image):
    #編輯消息
    print(dirt)
    message = dirt["place"]+' 今天 '
    items = {'wdesc','temp','direct','wind'}
    for item in items:
        message += dirt["\n        今天\n       "][item].strip('\n        ')+" "
    for temp in message.split(" "):
        if temp.find("℃") != -1:
            if eval(temp.split("℃")[0]) > 25:
                message += "今天很熱,盡量別出門啦"
            elif eval(temp.split("℃")[0]) < 12:
                message += "今天很冷,注意保暖"
    if message.find("雨") != -1:
        message += " 出門的話記得帶傘"
    print(message)
    
    #生成郵件對象
    msgRoot = MIMEMultipart('related')
    msgRoot['From'] = Header("我是發(fā)信人","utf-8")
    msgRoot['To'] = Header('我是收信人','utf-8')
    subject = '赴戍登程口占示家人'
    msgRoot['Subject'] = Header(subject,'utf-8')

    msgAlternative = MIMEMultipart('alternative')
    msgRoot.attach(msgAlternative)
    
    mail_msg = '''
    <p> 力微任重久神疲擂煞,再竭衰庸定不支。
        茍利國家生死以趴乡,豈因禍福避趨之对省?
        謫居正是君恩厚,養(yǎng)拙剛于戍卒宜浙宜。
        戲與山妻談故事官辽,試吟斷送老頭皮。
    </p>
    <p>'''+message+'''</p>
    <p><img src = "cid:image1"></p>
'''
    msgAlternative.attach(MIMEText(mail_msg,'html','utf-8'))
    
    catalog = 'C:\\Users\\10990\\Pictures\\' + str(image) + ".jpg"
    #指定圖片為當(dāng)前目錄
    with open(catalog,'rb') as fp:
        msgImage = MIMEImage(fp.read())
        fp.close()

    #定義圖片在ID,在HTML文本中引用
    msgImage.add_header('Content-ID','<image1>')
    msgRoot.attach(msgImage)
    return msgRoot

def sendMsg(message):
    mail_host = "smtp.qq.com"#要使用的smtp服務(wù)器
    mail_user = "*******"#用戶名和密碼
    mail_pass = "********"
    sender = '********'#發(fā)送者
    receivers = ['*******']#收信者粟瞬,注意這里是一個(gè)列表,就是說可以群發(fā)萤捆,當(dāng)然勸君莫浪~~
    try:
        smtpObj = smtplib.SMTP()
        smtpObj.connect(mail_host)
        smtpObj.ehlo()
        smtpObj.starttls()
        smtpObj.login(mail_user,mail_pass)
        smtpObj.sendmail(sender,receivers,message.as_string())
        print("郵件發(fā)送成功")
        smtpObj.quit()
    except smtplib.SMTPException:
        print("Error:無法發(fā)送郵件")

往后都是可以從網(wǎng)上找到的代碼裙品,當(dāng)然了各位也可以更進(jìn)一步俗批,從網(wǎng)上爬取各種騷話,用同樣的方式解析并加入email對象中市怎,為了不吃狗糧小編決定交給各位自己發(fā)掘(其實(shí)就是懶)需要注意岁忘,圖片我們只爬取了一頁的圖片,各位還可以自行添加代碼区匠,完成自動換頁之后的爬取干像,因?yàn)閳D片有限,當(dāng)我們的txt文件數(shù)大于18驰弄,即自動發(fā)送18天后麻汰,需要另外爬取第二頁的圖片。

另外戚篙,推薦把程序掛到服務(wù)器上面五鲫,做個(gè)定時(shí)發(fā)送。每天準(zhǔn)點(diǎn)發(fā)送岔擂。這樣妹子就可以天天收到你的云關(guān)懷啦位喂。

記得讓女票把你加入白名單,否則你發(fā)過去的郵件都會被投進(jìn)垃圾箱的乱灵。

完整代碼

欲獲取代碼塑崖,請關(guān)注我們的微信公眾號【程序猿聲】,在后臺回復(fù):pylove痛倚。即可下載弃舒。

推薦文章:10分鐘教你用Python做個(gè)打飛機(jī)小游戲超詳細(xì)教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市状原,隨后出現(xiàn)的幾起案子聋呢,更是在濱河造成了極大的恐慌,老刑警劉巖颠区,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件削锰,死亡現(xiàn)場離奇詭異,居然都是意外死亡毕莱,警方通過查閱死者的電腦和手機(jī)器贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朋截,“玉大人蛹稍,你說我怎么就攤上這事〔糠” “怎么了唆姐?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長廓八。 經(jīng)常有香客問我奉芦,道長赵抢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任声功,我火速辦了婚禮烦却,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘先巴。我一直安慰自己其爵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布伸蚯。 她就那樣靜靜地躺著摩渺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朝卒。 梳的紋絲不亂的頭發(fā)上证逻,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音抗斤,去河邊找鬼囚企。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瑞眼,可吹牛的內(nèi)容都是我干的龙宏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伤疙,長吁一口氣:“原來是場噩夢啊……” “哼银酗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起徒像,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黍特,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锯蛀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灭衷,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年旁涤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翔曲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劈愚,死狀恐怖瞳遍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菌羽,我是刑警寧澤掠械,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響份蝴,放射性物質(zhì)發(fā)生泄漏犁功。R本人自食惡果不足惜氓轰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一婚夫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧署鸡,春花似錦案糙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炉抒,卻和暖如春奢讨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焰薄。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工拿诸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人塞茅。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓亩码,卻偏偏與公主長得像,于是被迫代替她去往敵國和親野瘦。 傳聞我的和親對象是個(gè)殘疾皇子描沟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一惰许、愛情使人忘記了時(shí)間席覆,時(shí)間也使人忘記愛情。 二啡省、甜蜜的愛情娜睛,幸福握手中;不止是浪漫卦睹,責(zé)任比山重畦戒;甘苦同面對,風(fēng)雨...
    慕容鈺靈閱讀 376評論 0 0
  • 摘錄:人與人之間并不是通過頭腦來彼此信任的结序,我們得從心底真的互相信賴障斋。人類的大腦產(chǎn)生的是抽象的思維和概念,大腦總是...
    清文雅書閱讀 126評論 0 0
  • 2019年5月9日 星期四 今天我們利用班級時(shí)間在操場上練習(xí)Diamonds這首歌的時(shí)候,突然發(fā)現(xiàn)學(xué)校的東南...
    TT天天開心閱讀 135評論 0 0