前言
今天沒妹子約陪踩,剛好研究一下杖们。如何用神奇的python打造一個(gè)把妹神器吧〖缈瘢看完這個(gè)摘完,你們就能走向人生巔峰,迎娶白富美啦傻谁。
我知道你們想看看效果
當(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é)議中燥。
很好寇甸,中央氣象站沒有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痛倚。即可下載弃舒。