今天没妹子约,恰好研究一下。如何用神奇的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。便可下载。