前言
當談到程式設計師的時候,可能大數人的印象就是,高薪、直男、不修邊幅,死宅,沒情趣。但是程式設計師真的是這樣嗎?答案顯然不是,他們只是感興趣的點不在這些上面而已,但是隻要一出手,就會直擊女神的要害。今天小編就給大家帶來一個高逼格的示愛程式,讀者們可以根據自己的情況進行適當的修改,如果覺得分析的篇幅太長的話,可以直接下滑到底端獲取程式碼。
執行結果
本次程式所需要的包
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 (二維碼自動識別)