【python】10分鐘教你用python如何正確把妹

前言

今天沒妹子約,恰好研究一下。如何用神奇的python打造一個把妹神器吧。看完這個,大家就能走向人生巔峯,迎娶白富美啦。html

我知道大家想看看效果

imageimage

固然啦,這只是測試版的效果,真正的版本可比這個厲害多啦。不過做爲一個直男,另外一個男的給小編髮這個測試感受仍是有點怪怪的哈。python

文:吉柏言

暑假來了,各位又不得不和男女友暫時分開2個月了!!長達兩個月的時間裏不能相見,你可知我多想你啊,想知道你的城市下雨了嗎,想知道你帶傘了嗎,想知道你長什麼樣,想知道你叫啥,咳咳,單身汪小編表示情緒穩定。正則表達式

不要緊,雖然不能見面,可是雲關懷仍是要到的嘛,天天查一查你那裏的天氣如何,送上做爲男友的關切問候,再配上一張愛你的圖片,噫~~。可是做爲絕地雞王那必須每晚吃雞呀,早上醒來忘了打卡怎麼辦?? 能讓機器乾的活咱們何須本身動手呢?固然能夠走一波python大法好啦!瀏覽器

今天的代碼咱們要作得就是定點打卡,天天向親愛的女票送去溫暖的祝福~~,單身汪小編表示情緒穩定。服務器

環境準備

首先,安裝咱們須要的庫:微信

1import requests
2from bs4 import BeautifulSoup
3from email.mime.image import MIMEImage
4from email.mime.multipart import MIMEMultipart
5from email.mime.text import MIMEText
6from email.header import Header
7import smtplib
8import os

咱們用requests + bs4 庫進行爬取當日的天氣情況以及咱們須要的圖片,用email庫和smtplib庫來發郵件,當中咱們還須要os庫對其餘文件進行操做。app

開始搞事

首先爬取天氣情況和圖片資源,我選擇的是對中國氣象臺和豆瓣上一位名爲名爲「狼魄乾坤」的網友的豆瓣相冊進行爬取,首先本着盜亦有道的原則,先查看robots協議。測試

imageimage imageimage

很好,中央氣象站沒有robots協議,豆瓣也沒有對相冊加以限制,那麼咱們能夠放心大膽地爬取了。網站

進入網站,查找一下她所在的城市,本汪沒有女票就以本身所在的城市爲例子了。ui

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

 1def main():
2#    print("河北HE 內蒙古NM 陝西SN 黑龍江HL 河南HA")
3#    province = input("input the province,the big alpha for short:")
4#    city = input("input the city you wanna search plz:")
5    province = "HB"
6    city = "wuhan"
7    url = "http://www.nmc.cn/publish/forecast/A" + province + "/" + city + ".html"
8    html = getHTMLText(url)
9    url = "https://www.douban.com/photos/album/157693223/"
10    image = getHTMLText(url)

請忽略小編的辣雞英文。

getHTMLText(url)是自定義方法,爲的是獲取網頁的源代碼,返回值爲包含整個源代碼的字符串:

1def getHTMLText(url):
2    try:
3        r = requests.get(url)
4        print(r.raise_for_status)
5        r.encoding = r.apparent_encoding
6        return r.text
7    except:
8        return ""

咱們用requests.get(url)向網站提出爬取申請,用raise_for_status查看狀態碼,若是爲200則說明爬取成功,而後咱們用apparent_encoding替換掉encoding,這是讓程序本身識別編碼方式,保證返回的不是亂碼。假若爬取過程沒有出錯,就把爬下來的新鮮的天氣信息素材返回給變量html。用一樣的方法,咱們獲取新鮮的圖片庫的素材也用一樣的方法,返回給變量image。

1    imagLink = []
2    whetherInfo = parserHTMLWeather(html)
3    name = 1
4    for image in imagLink:
5        print(image)
6    for image in imagLink:
7        downloadPicture(image,name)
8        name += 1

回到main方法,咱們要聲明一個imagLink的列表,用來存放每一個圖庫中每一個圖的地址,whetherInfo用來存儲解析後的html的信息。打印image肯定地址返回無誤,由於在圖庫的源碼中有豆瓣本身的大圖地址和圖片的地址,咱們須要的是圖片地址,肯定無誤後就能夠逐個進行下載圖片資源了。

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

 1def parserHTMLWeather(html):
2    try:
3        dirt = {}
4        soup = BeautifulSoup(html,"html.parser")
5        place = soup.find(name = "head").find("title")
6        dirt["place"] = str(place.string).split("-")[0]
7        AnnoceTime = soup.find(name = 'div', attrs = {"class":"btitle"}).find("span")
8        dirt["AnnoceTime"] = str(AnnoceTime.string)
9        Everyday = AnnoceTime.find_parent().find_next_sibling().find_all(name = "div",class_ = "detail")
10        for eachday in Everyday:
11            info = eachday.find(name = "div",class_ = "day")
12            thisDay = {}
13            date = str(info.find(name = "div",class_ = "date").string)
14            week = str(info.find(name = "div",class_ = "week").string)
15            wdesc = str(info.find(name = "div",class_ = "wdesc").string)
16            temp = str(info.find(name = "div",class_ = "temp").string)
17            direct = str(info.find(name = "div",class_ = "direct").string)
18            wind = str(info.find(name = "div",class_ = "wind").string)
19
20            thisDay["date"] = date
21            thisDay["week"] = week
22            thisDay["wdesc"] = wdesc
23            thisDay["temp"] = temp
24            thisDay["direct"] = direct
25            thisDay["wind"] = wind
26            dirt[thisDay["date"]] = thisDay
27
28        return dirt
29    except:
30        return {}

首先先聲明dirt爲一個字典,而後把html用beautifulSoup庫對其進行解析,解析後的soup對象能夠調用它的find方法和find_all方法開始尋找咱們須要的信息所對應的標籤。至於哪一個信息對應哪一個標籤,能夠在瀏覽器中用ctrl + F的快捷鍵調出搜索框。獲取到咱們須要的信息後,咱們能夠把它進行加工保存在天天的thisDay字典裏,而後再把7天的thisDay字典加入dirt字典裏,最後返回dirt字典。具體的加工方法就是用split方法切片、提取。固然也能夠選擇正則表達式,須要額外再引用re庫。

而後是解析圖片:

 1def parserHTMLPicture(imag,imagLink):
2    try:
3        soup = BeautifulSoup(imag,"html.parser")
4#        next_url = soup.find(name = 'link',rel = 'next')['href']
5#        next_page = getHTMLText(next_url)
6        imagAddress = soup.find(name='div',class_ = 'photolst clearfix').find_all(name = 'img')
7        for image in imagAddress:
8            imagLink.append(image['src'])
9
10        return imagLink
11    except:
12        return []

解析圖片咱們只須要把圖片的地址獲取到imagLink列表中便可。而後咱們遍歷這個列表,而且下載這些圖片:

 1def downloadPicture(url,name):
2    root = 'C:\\Users\\10990\\Pictures\\'#這裏填保存的路徑
3    path = root + str(name) + '.jpg'
4    try:
5        if not os.path.exists(root):
6            os.mkdir(root)
7        if not os.path.exists(path):
8            r = requests.get(url)
9            with open(path,'wb'as f:
10                f.write(r.content)
11                f.close()
12                print("文件保存成功")
13        else:
14            print("文件已存在")
15    except:
16        print("爬取失敗")

在下載前咱們要注意判斷路徑是否存在,若不存在要創建一個,在開始爬以前要留意是否已經爬取過,若已經存在則跳過。命名我是以數字順序命名的,在後續調用中也更方便。

而後咱們須要新建一個txt文件,用來保存本次發送的照片名字,注意該文件應該和代碼的py文件保存在同一路徑下。

回到main()方法

1with open('pictureName.txt','r'as f:
2        name = eval(f.read())
3        f.close()
4    with open('pictureName.txt','w'as f:
5        newName = str(name + 1)
6        f.write(newName)
7        f.close()
8    msgRoot = makeMessage(whetherInfo,name)
9sendMsg(msgRoot)

而後咱們讀取當前的圖片名,賦給name,再把name名加一後從新保存下來,這樣天天發給女票的就是一張新的圖片了。而後要把咱們的天氣信息和咱們天天想說的話以及圖片打包成一個email對象發送出去就行啦。

 1def makeMessage(dirt,image):
2    #編輯消息
3    print(dirt)
4    message = dirt["place"]+' 今天 '
5    items = {'wdesc','temp','direct','wind'}
6    for item in items:
7        message += dirt["\n        今天\n       "][item].strip('\n        ')+" "
8    for temp in message.split(" "):
9        if temp.find("℃") != -1:
10            if eval(temp.split("℃")[0]) > 25:
11                message += "今天很熱,儘可能別出門啦"
12            elif eval(temp.split("℃")[0]) < 12:
13                message += "今天很冷,注意保暖"
14    if message.find("雨") != -1:
15        message += " 出門的話記得帶傘"
16    print(message)
17
18    #生成郵件對象
19    msgRoot = MIMEMultipart('related')
20    msgRoot['From'] = Header("我是發信人","utf-8")
21    msgRoot['To'] = Header('我是收信人','utf-8')
22    subject = '赴戍登程口占示家人'
23    msgRoot['Subject'] = Header(subject,'utf-8')
24
25    msgAlternative = MIMEMultipart('alternative')
26    msgRoot.attach(msgAlternative)
27
28    mail_msg = '''
29    <p> 力微任重久神疲,再竭衰庸定不支。
30        苟利國家生死以,豈因禍福避趨之?
31        謫居正是君恩厚,養拙剛於戍卒宜。
32        戲與山妻談故事,試吟斷送老頭皮。
33    </p>
34    <p>'''
+message+'''</p>
35    <p><img src = "cid:image1"></p>
36'''

37    msgAlternative.attach(MIMEText(mail_msg,'html','utf-8'))
38
39    catalog = 'C:\\Users\\10990\\Pictures\\' + str(image) + ".jpg"
40    #指定圖片爲當前目錄
41    with open(catalog,'rb'as fp:
42        msgImage = MIMEImage(fp.read())
43        fp.close()
44
45    #定義圖片在ID,在HTML文本中引用
46    msgImage.add_header('Content-ID','<image1>')
47    msgRoot.attach(msgImage)
48    return msgRoot
49
50def sendMsg(message):
51    mail_host = "smtp.qq.com"#要使用的smtp服務器
52    mail_user = "*******"#用戶名和密碼
53    mail_pass = "********"
54    sender = '********'#發送者
55    receivers = ['*******']#收信者,注意這裏是一個列表,就是說能夠羣發,固然勸君莫浪~~
56    try:
57        smtpObj = smtplib.SMTP()
58        smtpObj.connect(mail_host)
59        smtpObj.ehlo()
60        smtpObj.starttls()
61        smtpObj.login(mail_user,mail_pass)
62        smtpObj.sendmail(sender,receivers,message.as_string())
63        print("郵件發送成功")
64        smtpObj.quit()
65    except smtplib.SMTPException:
66        print("Error:沒法發送郵件")

日後都是能夠從網上找到的代碼,固然了各位也能夠更進一步,從網上爬取各類騷話,用一樣的方式解析並加入email對象中,爲了避免吃狗糧小編決定交給各位本身發掘(其實就是懶)須要注意,圖片咱們只爬取了一頁的圖片,各位還能夠自行添加代碼,完成自動換頁以後的爬取,由於圖片有限,當咱們的txt文件數大於18,即自動發送18天后,須要另外爬取第二頁的圖片。

另外,推薦把程序掛到服務器上面,作個定時發送。天天準點發送。這樣妹子就能夠每天收到你的雲關懷啦。

記得讓女票把你加入白名單,不然你發過去的郵件都會被投進垃圾箱的。

完整代碼

欲獲取代碼,請關注咱們的微信公衆號【程序猿聲】,在後臺回覆:pylove。便可下載。

微信公衆號微信公衆號

推薦文章:10分鐘教你用Python作個打飛機小遊戲超詳細教程

相關文章
相關標籤/搜索