【python】10分钟教你用python如何正确把妹

前言

今天没妹子约,刚好朋友研究一下python。让他教大家如何用神奇的python打造一个把妹神器吧。看完这个,你们就能走向人生巅峰,迎娶白富美啦。

我知道你们想看看效果

当然啦,这只是测试版的效果,真正的版本可比这个厉害多啦。不过作为一个直男,另一个男的给小编发这个测试感觉还是有点怪怪的哈。

文:吉柏言

暑假来了,各位又不得不和男女朋友暂时分开2个月了!!长达两个月的时间里不能相见,你可知我多想你啊,想知道你的城市下雨了吗,想知道你带伞了吗,想知道你长什么样,想知道你叫啥,咳咳,单身汪小编表示情绪稳定。

没关系,虽然不能见面,但是云关怀还是要到的嘛,每天查一查你那里的天气如何,送上作为男朋友的关切问候,再配上一张爱你的图片,噫~~。但是作为绝地鸡王那必须每晚吃鸡呀,早上醒来忘了打卡怎么办?? 能让机器干的活我们何必自己动手呢?当然可以走一波python大法好啦!

今天的代码我们要做得就是定点打卡,每天向亲爱的女票送去温暖的祝福~~,单身汪小编表示情绪稳定。

环境准备

首先,安装我们需要的库:

1import requests2from bs4 import BeautifulSoup3from email.mime.image import MIMEImage4from email.mime.multipart import MIMEMultipart5from email.mime.text import MIMEText6from email.header import Header7import smtplib8import os

我们用requests + bs4 库进行爬取当日的天气状况以及我们需要的图片,用email库和smtplib库来发邮件,当中我们还需要os库对其他文件进行操作。

开始搞事

首先爬取天气状况和图片资源,我选择的是对中国气象台和豆瓣上一位名为名为“狼魄乾坤”的网友的豆瓣相册进行爬取,首先本着盗亦有道的原则,先查看robots协议。

很好,中央气象站没有robots协议,豆瓣也没有对相册加以限制,那么我们可以放心大胆地爬取了。

进入网站,查找一下她所在的城市,本汪没有女票就以自己所在的城市为例子了。

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_encoding6        return r.text7    except:8        return ""

我们用requests.get(url)向网站提出爬取申请,用raise_for_status查看状态码,如果为200则说明爬取成功,然后我们用apparent_encoding替换掉encoding,这是让程序自己识别编码方式,保证返回的不是乱码。倘若爬取过程没有出错,就把爬下来的新鲜的天气信息素材返回给变量html。用同样的方法,我们获取新鲜的图片库的素材也用同样的方法,返回给变量image。

1    imagLink = []2    whetherInfo = parserHTMLWeather(html)3    name = 14    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)1920            thisDay["date"] = date21            thisDay["week"] = week22            thisDay["wdesc"] = wdesc23            thisDay["temp"] = temp24            thisDay["direct"] = direct25            thisDay["wind"] = wind26            dirt[thisDay["date"]] = thisDay2728        return dirt29    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‘]) 910        return imagLink11    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)1718    #生成邮件对象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‘)2425    msgAlternative = MIMEMultipart(‘alternative‘)26    msgRoot.attach(msgAlternative)2728    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‘))3839    catalog = ‘C:\\Users\\10990\\Pictures\\‘ + str(image) + ".jpg"40    #指定图片为当前目录41    with open(catalog,‘rb‘) as fp:42        msgImage = MIMEImage(fp.read())43        fp.close()4445    #定义图片在ID,在HTML文本中引用46    msgImage.add_header(‘Content-ID‘,‘<image1>‘)47    msgRoot.attach(msgImage)48    return msgRoot4950def 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天后,需要另外爬取第二页的图片。

另外,推荐把程序挂到服务器上面,做个定时发送。每天准点发送。这样妹子就可以天天收到你的云关怀啦。

记得让女票把你加入白名单,否则你发过去的邮件都会被投进垃圾箱的。

完整代码

  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  9def getHTMLText(url): 10    try: 11        r = requests.get(url) 12        print(r.raise_for_status) 13        r.encoding = r.apparent_encoding 14        return r.text 15    except: 16        return "" 17 18def parserHTMLWeather(html): 19    try: 20        dirt = {} 21        soup = BeautifulSoup(html,"html.parser") 22        place = soup.find(name = "head").find("title") 23        dirt["place"] = str(place.string).split("-")[0] 24        AnnoceTime = soup.find(name = ‘div‘, attrs = {"class":"btitle"}).find("span") 25        dirt["AnnoceTime"] = str(AnnoceTime.string) 26        Everyday = AnnoceTime.find_parent().find_next_sibling().find_all(name = "div",class_ = "detail") 27        for eachday in Everyday: 28            info = eachday.find(name = "div",class_ = "day") 29            thisDay = {} 30            date = str(info.find(name = "div",class_ = "date").string) 31            week = str(info.find(name = "div",class_ = "week").string) 32            wdesc = str(info.find(name = "div",class_ = "wdesc").string) 33            temp = str(info.find(name = "div",class_ = "temp").string) 34            direct = str(info.find(name = "div",class_ = "direct").string) 35            wind = str(info.find(name = "div",class_ = "wind").string) 36 37            thisDay["date"] = date 38            thisDay["week"] = week 39            thisDay["wdesc"] = wdesc 40            thisDay["temp"] = temp 41            thisDay["direct"] = direct 42            thisDay["wind"] = wind 43            dirt[thisDay["date"]] = thisDay 44 45        return dirt 46    except: 47        return {} 48 49def parserHTMLPicture(imag,imagLink): 50    try: 51        soup = BeautifulSoup(imag,"html.parser") 52        imagAddress = soup.find(name=‘div‘,class_ = ‘photolst clearfix‘).find_all(name = ‘img‘) 53        for image in imagAddress: 54            imagLink.append(image[‘src‘]) 55 56        return imagLink 57    except: 58        return [] 59 60def downloadPicture(url,name): 61    root = ‘C:\\Users\\10990\\Pictures\\‘#这里填保存的路径 62    path = root + str(name) + ‘.jpg‘ 63    try: 64        if not os.path.exists(root): 65            os.mkdir(root) 66        if not os.path.exists(path): 67            r = requests.get(url) 68            with open(path,‘wb‘) as f: 69                f.write(r.content) 70                f.close() 71                print("文件保存成功") 72        else: 73            print("文件已存在") 74    except: 75        print("爬取失败") 76 77def makeMessage(dirt,image): 78    #编辑消息 79    print(dirt) 80    message = dirt["place"]+‘ 今天 ‘ 81    items = {‘wdesc‘,‘temp‘,‘direct‘,‘wind‘} 82    for item in items: 83        message += dirt["\n        今天\n       "][item].strip(‘\n        ‘)+" " 84    for temp in message.split(" "): 85        if temp.find("℃") != -1: 86            if eval(temp.split("℃")[0]) > 25: 87                message += "今天很热,尽量别出门啦" 88            elif eval(temp.split("℃")[0]) < 12: 89                message += "今天很冷,注意保暖" 90    if message.find("雨") != -1: 91        message += " 出门的话记得带伞" 92    print(message) 93 94    #生成邮件对象 95    msgRoot = MIMEMultipart(‘related‘) 96    msgRoot[‘From‘] = Header("我是发信人","utf-8") 97    msgRoot[‘To‘] = Header(‘我是收信人‘,‘utf-8‘) 98    subject = ‘赴戍登程口占示家人‘ 99    msgRoot[‘Subject‘] = Header(subject,‘utf-8‘)100101    msgAlternative = MIMEMultipart(‘alternative‘)102    msgRoot.attach(msgAlternative)103104    mail_msg = ‘‘‘105    <p> 力微任重久神疲,再竭衰庸定不支。106        苟利国家生死以,岂因祸福避趋之?107        谪居正是君恩厚,养拙刚于戍卒宜。108        戏与山妻谈故事,试吟断送老头皮。109    </p>110    <p>‘‘‘+message+‘‘‘</p>111    <p><img src = "cid:image1"></p>112‘‘‘113    msgAlternative.attach(MIMEText(mail_msg,‘html‘,‘utf-8‘))114115    catalog = ‘C:\\Users\\10990\\Pictures\\‘ + str(image) + ".jpg"116    #指定图片为当前目录117    with open(catalog,‘rb‘) as fp:118        msgImage = MIMEImage(fp.read())119        fp.close()120121    #定义图片在ID,在HTML文本中引用122    msgImage.add_header(‘Content-ID‘,‘<image1>‘)123    msgRoot.attach(msgImage)124    return msgRoot125126def sendMsg(message):127    mail_host = "smtp.qq.com"#要使用的smtp服务器128    mail_user = "*******"#用户名和密码129    mail_pass = "********"130    sender = ‘********‘#发送者131    receivers = [‘*******‘]#收信者,注意这里是一个列表,就是说可以群发,当然劝君莫浪~~132    try:133        smtpObj = smtplib.SMTP()134        smtpObj.connect(mail_host)135        smtpObj.ehlo()136        smtpObj.starttls()137        smtpObj.login(mail_user,mail_pass)138        smtpObj.sendmail(sender,receivers,message.as_string())139        print("邮件发送成功")140        smtpObj.quit()141    except smtplib.SMTPException:142        print("Error:无法发送邮件")143def main():144#    print("河北HE 内蒙古NM 陕西SN 黑龙江HL 河南HA")145#    province = input("input the province,the big alpha for short:")146#    city = input("input the city you wanna search plz:")147    province = "HB"148    city = "wuhan"149    url = "http://www.nmc.cn/publish/forecast/A" + province + "/" + city + ".html"150    html = getHTMLText(url)151    url = "https://www.douban.com/photos/album/157693223/"152image = getHTMLText(url)153imagLink = []154    whetherInfo = parserHTMLWeather(html)155    name = 1156    for image in imagLink:157        print(image)158    for image in imagLink:159        downloadPicture(image,name)160        name += 1161with open(‘pictureName.txt‘,‘r‘) as f:162        name = eval(f.read())163        f.close()164    with open(‘pictureName.txt‘,‘w‘) as f:165        newName = str(name + 1)166        f.write(newName)167        f.close()168    msgRoot = makeMessage(whetherInfo,name)169sendMsg(msgRoot)170main()

欲获取代码,请关注我们的微信公众号【程序猿声】,在后台回复:pylove。即可下载。

推荐文章:10分钟教你用Python做个打飞机小游戏超详细教程

推荐文章:10分钟教你用python下载和拼接微信好友头像图片

推荐文章:10分钟教你用python一行代码搞点大新闻

推荐文章:10分钟教你用python打造贪吃蛇超详细教程

原文地址:https://www.cnblogs.com/infroad/p/9278934.html

时间: 2024-08-13 11:42:59

【python】10分钟教你用python如何正确把妹的相关文章

10分钟教你用python打造贪吃蛇超详细教程

10分钟教你用python打造贪吃蛇超详细教程 在家闲着没妹子约, 刚好最近又学了一下python,听说pygame挺好玩的.今天就在家研究一下, 弄了个贪吃蛇出来.希望大家喜欢. 先看程序效果: 01 整体框架 平台:pycharm 关于pygame的安装这里就不在赘述,大家自行上网找合适自己的版本的安装即可.关于pygame模块知识会穿插在下面代码中介绍,用到什么就介绍什么.这里就不统一介绍了. 整个程序由于是调用了大量的pygame里面的库函数,所以也非常简单(卧槽你这不是调包侠嘛).也就

10分钟教你用Python玩转微信之抓取好友个性签名制作词云

01 前言+展示 各位小伙伴我又来啦.今天带大家玩点好玩的东西,用Python抓取我们的微信好友个性签名,然后制作词云.怎样,有趣吧~好了,下面开始干活.我知道你们还是想先看看效果的. 后台登录: 词云: 02 环境准备 Python版本:3.6.0系统平台:Windows 10 X64IDE:pycharm 相关模块:re模块:itchat模块:jieba模块:import matplotlib.pyplot模块:wordcloud模块:以及一些Python自带的模块. 03 获取个性签名 首

【python】10分钟教你用python一行代码搞点大新闻

准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python.像下面一样. 1> python2Python 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)] on win323Type "help", "copyright&q

10分钟教你用Python做个打飞机小游戏超详细教程

更多精彩尽在微信公众号[程序猿声] 我知道你们一定想先看效果如何 00 目录 整体框架 开始之前-精灵类Sprite 子弹类class Bullet 玩家飞机类class Player 敌机类class Enemy 游戏主体循环以及帧率设置 让子弹飞 刷出敌机 打怪 把飞机敌机子弹都画出来 处理键盘事件 分数显示 和 GameOver 最终代码 01 前言 这次还是用python的pygame库来做的游戏.关于这个库的内容,读者可以上网了解一下.本文只讲解用到的知识.代码参考自网上,自己也做了一

“猜你喜欢”的背后揭秘--10分钟教你用Python打造推荐系统

欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 话说,最近的瓜实在有点多,从我科校友李雨桐怒锤某男.陈羽凡吸毒被捕.蒋劲夫家暴的三连瓜,到不知知网翟博士,再到邓紫棋解约蜂鸟.王思聪花千芳隔空互怼. 而最近的胜利夜店.张紫妍巨瓜案.最强大脑选手作弊丑闻,更是让吃瓜群众直呼忙不过来:瓜来的太快就像龙卷风,扶我起来,我还能吃! 说到底,这其实是一个信息过载的时代:公众号每天数十条的推送.朋友圈的晒娃晒旅游.各种新闻报道扑面而来令人眼花缭乱.目不暇接-- 那么问题来了,怎么找到自己的关注点呢

【数据结构】10分钟教你用栈求解迷宫老鼠问题超详细教程附C++源代码

问题描述 给定一张迷宫地图和一个迷宫入口,然后进入迷宫探索找到一个出口.如下图所示: 该图是一个矩形区域,有一个入口和出口.迷宫内部包含不能穿越的墙壁或者障碍物.这些障碍物沿着行和列放置,与迷宫的边界平行.迷宫的入口在左上角,出口在右下角. 问题分析 首先要有一张迷宫地图,地图由两部分组成: (1)一是迷宫中各处的位置坐标, (2)二是迷宫各位置处的状态信息,即该处是墙还是路 所以,该迷宫地图可由一个二维数组来表示.数组的横纵坐标表示迷宫各处的位置坐标,数组元素表示各位置处的状态信息. 2.在这

10分钟教你拥有可编程QQ机器人

10分钟教你拥有可编程QQ机器人 --酷Q Air教程 --BY dudujerry 要想阅读本篇教程,读者需要基本的C++知识以及Visual Studio 2010/2015/2017 首先,需要从官方网站下载软件 https://cqp.cc/t/23253 .下载后从"下载"/"Download"文件夹中找到其压缩包.解压. 然后,我们从Github中下载酷Q的SDK. https://github.com/CoolQ/cqsdk-vc 解压发现.sln,是

Python:10分钟搞定不写代码的爬虫

代码自己敲 使用 Chrome 浏览器插件 Web Scraper 可以轻松实现网页数据的爬取,不写代码,鼠标操作,点哪爬哪,还不用考虑爬虫中的登陆.验证码.异步加载等复杂问题. Web Scraper插件 Web Scraper 官网中的简介: Web Scraper Extension (Free!)Using our extension you can create a plan (sitemap) how a web site should be traversed and what s

10分钟教你理解反射

什么是反射? 反射反射,程序员的快乐,在.Net领域程序设计中,反射是无处不在的,MVC.ASP.Net.各种ORM.IOC.AOP几乎所有的框架都离不开反射.反编译工具使用的底层技术用的不是反射,是一种逆向工程. 反射(Reflection.System.Reflection),是.Net Framework提供的一个帮助类库,可以读取并使用Metadata中描述的数据信息.元数据(Metadata),描述了dll/exe里面的各种信息,又称中介数据.中继数据,为描述数据的数据(data ab