特別的程式,給你最愛的人

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

執行結果


特別的程式,給你最愛的人


本次程式所需要的包

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 (二維碼自動識別)


相關文章