前言
当谈到程序员的时候,可能大数人的印象就是,高薪、直男、不修边幅,死宅,没情趣。但是程序员真的是这样吗?答案显然不是,他们只是感兴趣的点不在这些上面而已,但是只要一出手,就会直击女神的要害。今天小编就给大家带来一个高逼格的示爱程序,读者们可以根据自己的情况进行适当的修改,如果觉得分析的篇幅太长的话,可以直接下滑到底端获取代码。
运行结果
本次程序所需要的包
import requests
from lxml import etree
from bs4 import BeautifulSoup as BS
from selenium import webdriver
import time
import random
import os
import itchat
import datetime复制代码
每天发送的微信消息格式如下:
message = """
亲爱的{}:
早上好,今天是你和 NGU 相恋的第 {} 天~
今天他想对你说的话是:
{}
最后也是最重要的!
""".format("骑摩托的糖", str(inLoveDays), love_word)复制代码
这里需要填写的第一个字段是 ta 的称呼,inLoveDays 为你们相识相恋的天数。
love_word 是每天为 ta 精心准备情话内容,当然如果你的文笔好也可以自己写。
这里小编选取的是网上的情话大全(尴尬)
当然最后也是最重要的!每天不尽相同的【我爱你】图片!
程序思路
本次程序在多个系统平台都可以运行,此次主要用到的库有 selenium、itchat、request。程序主要分为两部分第一数据的抓取,一些情话信息和图片信息。另一部就是利用 itchat 自动发送消息给你的girlfriend。
情话信息
如果对你的文笔有信心,那你可以自己写些情话。当然大部分人的文笔跟我一样是比较差的,所以这时候我们就可以利用网上的资源,比如下面的情话网站。
http://www.binzz.com/yulu2/3588.html复制代码
在抓取这个网站的情话时,如果你利用普通的爬取思路,即利用 request 进行请求,你会发现网页获取的数据是乱码并且不完整。所以在这块为了操作方便,我利用了 Selenium+Chrome 的自动化来抓取,实现可见即可爬,来获取网站的信息。最后把获取到的数据保存到当前目录下的【love_word.txt】方便之后的读取。
表白图片资源
为了配合此次示爱程序,我专门去找了些带有【我爱你】的图片资源。可以在360图片中搜索【我爱你】的关键词,我们就可以获取到大量的这样图片资源。
http://image.so.com/i?q=%E6%88%91%E7%88%B1%E4%BD%A0%E7%94%B5%E5%BD%B1%E5%8F%B0%E8%AF%8D&src=srp复制代码
由于此链接有一定的反爬策略,所以我们还是用Selenium加Chrome进行自动化爬取,并用到了BeautifulSoup库来解析,当然你也也可以用你所熟悉的解析库来解析,并将爬取下来的图片按序号保存在我们的【示爱图片】里。
由于你可能不是第一次运行这个代码,所以我们需要加上判断文件是否存在的语句,如果存在,我们就不需要抓取数据,直接从文件里读取即可,反之,就运行抓取数据的代码。
表白程序源码
此次表白程序主要为 以下几个函数
def crawl_Love_words():
def getimage():
def isexist(path):
def send_news():
def main():
复制代码
crawl_Love_words()
此函数通过 selenium + xpath 来抓取情话网站的资源,并存入到当前目录下的【love_word.txt】文件。
def crawl_Love_words():
"""
抓取情话
:return:
"""
browser = webdriver.Chrome()
print("正在抓取情话...")
url = "http://www.binzz.com/yulu2/3588.html"
browser.get(url)
html = browser.page_source
Selector = etree.HTML(html)
love_words_xpath_str = "//div[@id='content']/p/text()"
love_words = Selector.xpath(love_words_xpath_str)
for i in love_words:
word = i.strip("\n\t\u3000\u3000").strip()
with open(love_word_path, "a") as file:
file.write(word + "\n")
print("情话抓取完成")复制代码
getimage()
此函数用来爬取360图片中带有【我爱你】关键词的图片资源,通过 Selenium+Chrome自动化抓取来实现。
def getimage():
"""
抓取我爱你的图片
:return:
"""
browser = webdriver.Chrome()
url='http://image.so.com/i?q=%E6%88%91%E7%88%B1%E4%BD%A0%E7%94%B5%E5%BD%B1%E5%8F%B0%E8%AF%8D&src=srp'
browser.get(url)
count=1
for i in range(2):
js = "var q=document.documentElement.scrollTop=100000"
browser.execute_script(js)
time.sleep(1)
time.sleep(2)
response=browser.page_source
html=BS(response,'lxml')
imgurls=html.select('img')
isexist(pic_path)
for imgurl in imgurls:
response = requests.get(imgurl['src'])
image_path=str(count)+'.jpg'
count+=1
with open(image_path,'wb') as f:
f.write(response.content)
print(str(count)+' success')复制代码
isexist()
此函数用来判断我们的文件是否存在,如果存在则直接就切换到文件夹目录下,否则,创建文件夹,再切换到文件夹目录下,此函数作用主要是在抓取图片信息时,判断【示爱文件】是否存在。
def isexist(path):
"""
判断文件是否存在
:param path:
:return:
"""
if not os.path.exists(path):
os.makedirs(path)
os.chdir(path)
else:
os.chdir(path)复制代码
send_new()
此函数通过利用 itchat 库,实现给你的微信好友自动发送消息。在这个函数中我利用 datetime 模块来计算你和所输入的ta之间相识相恋的时间。并且在登录的时候我添加了一个【hotReload=True】,也叫做热启动。这样你就可以不用每次运行程序的时候都要登录。
def send_news():
"""
给你心爱的ta发送消息和图片
:return:
"""
# 计算相恋天数
inLoveDate = datetime.datetime(2016, 5, 30) # 相恋的时间
todayDate = datetime.datetime.today()
inLoveDays = (todayDate - inLoveDate).days
Wordsnumber=random.randint(1,120)#随机挑选出情话
# 获取情话
file_path = love_word_path
with open(file_path) as file:
love_word = file.readlines()[Wordsnumber].split(':')[1]
itchat.auto_login(hotReload=True) # 热启动,不需要多次扫码登录
my_friend = itchat.search_friends(name=u'骑摩托的糖')
girlfriend = my_friend[0]["UserName"]
print(girlfriend)
message = """
亲爱的{}:
早上好,今天是你和 NGU 相恋的第 {} 天~
今天他想对你说的话是:
{}
最后也是最重要的!
""".format("骑摩托的糖", str(inLoveDays), love_word)
itchat.send(message, toUserName=girlfriend)
files = os.listdir(pic_path)
print(files)
file = files[Wordsnumber]
print(file)
love_image_file = "./表白图片/" + file
try:
itchat.send_image(love_image_file, toUserName=girlfriend)
except Exception as e:
print(e)复制代码
main()
此函数的作用主要是运行上面的3个函数,并判断我们所需要的资源是否存在,如果存在直接从所在文件中提取即可,反之运行函数。
def main():
if os.path.exists(love_word_path):
print('情话已存在')
else:
crawl_Love_words()
if os.path.exists(pic_path):
print('图片已存在')
else:
getimage()
send_news()复制代码
定时任务
加上定时任务,你可以挑选你想要的时间给你心爱的ta发送甜甜的情话和图片,如果你不需要定时,也可以不需要此段代码,直接运行main()函数即可。
if __name__ == '__main__':
while True:
curr_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
love_time = curr_time.split(" ")[1]
if love_time == "13:14:00":
main()
time.sleep(60)
else:
print("还没到示爱的时间哟,现在时间:" + love_time)复制代码
示爱程序使用教程
首先你需要把相应的源码下载下来,后台回复「表白」即可获取。其次把相应的库先事先安装好,随后运行程序则会显示一个微信网页登录的二维码,扫描登录即可。在上文我已提到程序加入了热启动,所以你可以无需多次扫描二维码,每次运行即可发送信息。
总结
此次的程序还有很多可以扩展的地方,比如你可以加上任何你喜欢的元素进去,并且如果你觉得一直运行在自己的主机上是件很麻烦的事,那么你可以将程序部署到服务器上,总之,代码我给你了,女神的心能不能挽回就看你的了。
文章首发于公众号【TWcoding】,对Python,爬虫,数据分析,算法感兴趣的朋友们,可以加微信公众号【 TWcoding】,我们一起玩转Python。后台回复Python送你2018最新Python全系资源。
If it works for you.Please,star.
自助者,天助之
http://weixin.qq.com/r/Tyo7I4jE3NWjrcxA939d (二维码自动识别)