今天沒妹子約,恰好研究一下。如何用神奇的python打造一個把妹神器吧。看完這個,大家就能走向人生巔峯,迎娶白富美啦。html
固然啦,這只是測試版的效果,真正的版本可比這個厲害多啦。不過做爲一個直男,另外一個男的給小編髮這個測試感受仍是有點怪怪的哈。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協議。測試
很好,中央氣象站沒有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。便可下載。