本篇文章給大家分享的是有關(guān)如何給用Python每天定時(shí)給女神發(fā)一句情話,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)建站專注于企業(yè)營銷型網(wǎng)站、網(wǎng)站重做改版、冷水灘網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為冷水灘等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
我的日記 4月23日 晴
你三天沒回我的消息,在我孜孜不倦地騷擾下你終于舍得回我了,你說‘nmsl’我想這一定是有什么含義吧!噢!我恍然大悟,原來是尼美舒利顆粒。
她知道我關(guān)節(jié)炎,讓我吃尼美舒利顆粒,她還是關(guān)心我的但是又不想顯現(xiàn)的那么熱情的。
天??!她好高冷,我好像更喜歡她了呢!
你看,雖然女神經(jīng)常不理我,但是還是會(huì)偷偷地關(guān)心我,雖然她不直說,但是我都懂。
唯一的問題就是,我最近很忙,忙到都沒有時(shí)間去給女神發(fā)“早安”了。不可以!“早安”絕對(duì)不能斷,這是我對(duì)女神誠摯的愛,女神雖然不會(huì)回復(fù)我,但是她肯定都記在心里,不回復(fù)我肯定是在考驗(yàn)我!
作為一名無所不能的程序猿,我立刻就想到為什么不用Python爬取情話,然后每天定時(shí)發(fā)送給她呢?
爬取情話
選取情話資源
首先我們需要去網(wǎng)上找到合適的情話資源
分析網(wǎng)頁資源
1. 定位情話資源
鼠標(biāo)放在我們要爬取的情話上快速按下右鍵+檢查(元素)。
先在就可以看到我們的情話在頁面中是什么位置了。
2. 定位標(biāo)簽
在開發(fā)者工具中,我們輕松的舊定位到了我們的情話的標(biāo)簽,就是上圖紅框里的內(nèi)容。
3. 分析請(qǐng)求方式
在剛才的界面(不要退出開發(fā)者模式)下刷新:
在Network欄目下找到我們請(qǐng)求的那個(gè)資源,在他的Headers中找到這個(gè)資源請(qǐng)求的方式,這里是GET。
使用urllib庫獲取資源
1、安裝urllib庫
這一步是怕你 htmlText = html.decode(charset, errors='ignore')
return htmlText
解析網(wǎng)頁資源
解析網(wǎng)頁的話,需要第三方插件Beautiful Soup來提取 xml 和 HTML 中的數(shù)據(jù)。
獲取content節(jié)點(diǎn)內(nèi)容
我們想要的資源都在一個(gè)class為”content“的div節(jié)點(diǎn)下,我們現(xiàn)在先獲取這個(gè)節(jié)點(diǎn)的所有內(nèi)容。
部分代碼:
soup = BeautifulSoup(htmlText,"html.parser")
"獲取content節(jié)點(diǎn)的內(nèi)容"
div_node = soup.find('div', class_='content')
print(div_node.get_text)
結(jié)果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/spider/Spider.py
1、將你放進(jìn)我心里最重要的位置,用心來刻你的名字。
2、愛是踏破紅塵望穿秋水;愛是一生一世冥冥輪回;愛你,我不問理由。
3、拽你入懷,予你一世相伴,擁你入懷,護(hù)你一世平安。
4、何止是野心,我預(yù)謀了一輩子的念想,從遇見你開始,不見黃土不死心。
5、我后來想了想,我不耽誤你,還會(huì)有別人耽誤你,那我不甘心,還是我來耽誤你吧。
......
本文地址:下一頁
2.4.3. 獲取p節(jié)點(diǎn)內(nèi)容
上一步我們已經(jīng)獲取到了我們的主要內(nèi)容,然后總結(jié)可以看出我們想要的文本內(nèi)容在P節(jié)點(diǎn)中,那么現(xiàn)在就來獲取它。
部分代碼:
soup = BeautifulSoup(htmlText,"html.parser")
"獲取div節(jié)點(diǎn)的內(nèi)容"
div_node = soup.find('div', class_='content')
"獲取P節(jié)點(diǎn)內(nèi)容"
p_node = div_node.find_all('p')
for content in p_node:
print(content.get_text())
結(jié)果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/spider/Spider.py
1、將你放進(jìn)我心里最重要的位置,用心來刻你的名字。
2、愛是踏破紅塵望穿秋水;愛是一生一世冥冥輪回;愛你,我不問理由。
3、拽你入懷,予你一世相伴,擁你入懷,護(hù)你一世平安。
4、何止是野心,我預(yù)謀了一輩子的念想,從遇見你開始,不見黃土不死心。
5、我后來想了想,我不耽誤你,還會(huì)有別人耽誤你,那我不甘心,還是我來耽誤你吧。
......
69、有時(shí),愛也是種傷害,殘忍的人句子大全http://Www.1juzI.coM/,選擇傷害別人,善良的人,選擇傷害自己。
......
Process finished with exit code 0
4、處理數(shù)據(jù)
注意一下第69劇,這里面有網(wǎng)站的鏈接,把這個(gè)一起發(fā)給女神不就露餡了么,現(xiàn)在得想辦法給她刪掉。同時(shí)情話前面的編號(hào)也得刪掉。
刪除特定標(biāo)簽
我們會(huì)查看一下數(shù)據(jù)就會(huì)發(fā)現(xiàn),所有的鏈接都是在U標(biāo)簽里的,那我們可以直接在獲取到div標(biāo)簽內(nèi)容后就把u標(biāo)簽刪掉
"刪除特定標(biāo)簽u"
[s.extract() for s in div_node('u')]
刪除序號(hào)
我們發(fā)現(xiàn),序號(hào)與情話之間是用頓號(hào)分割的,那么我們可以將每個(gè)P標(biāo)簽下的內(nèi)容用split分割并且取出第二個(gè)元素就好了。
部分代碼:
"獲取P節(jié)點(diǎn)內(nèi)容"
p_node = div_node.find_all('p')
for content in p_node:
"以’、‘分割,并且取出第2個(gè)元素"
text = content.get_text().split("、",1)[1]
print(text)
結(jié)果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/spider/Spider.py
將你放進(jìn)我心里最重要的位置,用心來刻你的名字。
愛是踏破紅塵望穿秋水;愛是一生一世冥冥輪回;愛你,我不問理由。
拽你入懷,予你一世相伴,擁你入懷,護(hù)你一世平安。
何止是野心,我預(yù)謀了一輩子的念想,從遇見你開始,不見黃土不死心。
我后來想了想,我不耽誤你,還會(huì)有別人耽誤你,那我不甘心,還是我來耽誤你吧。
......
Process finished with exit code 0
nice啊,到這一步你已經(jīng)把我們需要的情話都提取出來了!?。?/p>
封裝數(shù)據(jù)備用
這樣一句一句的也不好處理??!不如把它放到list里,等下定時(shí)任務(wù)的時(shí)候可以用的時(shí)候取出來就好。
部分代碼:
sentenceList = list()
......
"獲取P節(jié)點(diǎn)內(nèi)容"
p_node = div_node.find_all('p')
for content in p_node:
"以’、‘分割,并且取出第2個(gè)元素"
text = content.get_text().split("、", 1)[1]
"追加到list尾部"
sentenceList.append(text)
print(sentenceList):
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/spider/Spider.py
['將你放進(jìn)我心里最重要的位置,用心來刻你的名字。', '愛是踏破紅塵望穿秋水;愛是一生一世冥冥輪回;愛你,我不問理由。', '拽你入懷,予你一世相伴,擁你入懷,護(hù)你一世平安。', '何止是野心,我預(yù)謀了一輩子的念想,從遇見你開始,不見黃土不死心。', ......]
Process finished with exit code 0
5、封裝(爬蟲代碼最終)
爬蟲是做好了,但是總覺得乖乖的,我等下還得在其他地方用,不如這里以面向?qū)ο蟮乃枷氚雅老x封裝一下。
import urllib.request
from bs4 import BeautifulSoup
import chardet
def __getHtml(url):
"""
私有方法:獲取網(wǎng)頁html文本資源
:param url: 網(wǎng)頁鏈接
:return: 網(wǎng)頁文本資源
"""
html = urllib.request.urlopen(url).read()
charset = chardet.detect(html).get("encoding")
htmlText = html.decode(charset, errors='ignore')
return htmlText
def __sloveHtml(htmlText):
"""
私有方法:解析HtmlText
:param htmlText: 傳入的資源
"""
sentenceList = list()
soup = BeautifulSoup(htmlText, "html.parser")
"獲取content節(jié)點(diǎn)的內(nèi)容"
div_node = soup.find('div', class_='content')
"刪除特定標(biāo)簽u"
[s.extract() for s in div_node('u')]
"獲取P節(jié)點(diǎn)內(nèi)容"
p_node = div_node.find_all('p')
for content in p_node:
"以’、‘分割,并且取出第2個(gè)元素"
text = content.get_text().split("、", 1)[1]
"追加到list尾部"
sentenceList.append(text)
return sentenceList
def getSentenceList(url):
"""
Spider提供的公用方法,提供情話list
:param url: 獲取情話的地址
:return: 情話list
"""
return __sloveHtml(__getHtml(url))
爬蟲總結(jié)
這一部分主要用到的類庫有:BeautifulSoup,urllib,chardet。
主要思想:封裝
手機(jī)短信發(fā)送發(fā)送
本來想用微信或者QQ發(fā)送來著,但是時(shí)隔兩年,qqbot、itchat、wxpy等第三方庫都失效了,沒辦法就來用手機(jī)短信發(fā)送好了。
1. Twilio
Twilio是一個(gè)做成開放插件的電話跟蹤服務(wù)(call-tracking service)
Twilio公司致力于幫助開發(fā)者在其應(yīng)用里融入電話、短信等功能,該公司周二又推出了一項(xiàng)稱為Twilio Client的新服務(wù),可幫助開發(fā)者整合靈活而低成本的網(wǎng)絡(luò)電話(VoIP)功能。
VoIP即Skype和谷歌電話等服務(wù)使用的技術(shù),要提供VoIP服務(wù)通常需要準(zhǔn)備相應(yīng)的基礎(chǔ)設(shè)備,而Twilio Client免除了開發(fā)者的這一麻煩,可讓他們便捷地在應(yīng)用里加入網(wǎng)絡(luò)電話元素。
安裝
安裝過程比較簡單,直接pip就好:
sudo pip3 install twilio
等待安裝完成
Successfully built twilio
Installing collected packages: PyJWT, twilio
Successfully installed PyJWT-1.7.1 twilio-6.38.1
注冊(cè)并獲取三個(gè)重要參數(shù)
參考文章:https://zhuanlan.zhihu.com/p/67716042
簡單代碼實(shí)現(xiàn)發(fā)送短信實(shí)驗(yàn)
代碼:
from twilio.rest import Client # 導(dǎo)包
account_sid = '你的account_sid'
auth_token = '你的auth_token'
client = Client(account_sid, auth_token)
message = client.messages.create(
from_='+×××××××××',
body='親愛的H,以后我每天都會(huì)給你發(fā)送一條信息哦?。?!',
to='你要發(fā)送到的手機(jī)號(hào)(以+86開頭)'
)
print(message.sid)
控制臺(tái)輸出:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/qqsend/Send.py
SMfe64f40f2ac24b8ca82121d57147312c
Process finished with exit code 0
手機(jī)接收短信:
OK!到這里我們已經(jīng)簡單實(shí)現(xiàn)了發(fā)送短信的功能,現(xiàn)在要去把這個(gè)功能封裝一下。
實(shí)現(xiàn)發(fā)送短信的功能
封裝代碼:
from twilio.rest import Client # 導(dǎo)包
def sendSMSMsg(content, tel):
"""
向某個(gè)手機(jī)號(hào)發(fā)送短信內(nèi)容
:param content: 短信內(nèi)容
:param tel: 手機(jī)號(hào)
"""
account_sid = '你的account_sid'
auth_token = '你的auth_token'
client = Client(account_sid, auth_token)
client.messages.create(
from_='+18634171608',
body=content,
to=tel
)
print('Send :', content, 'to tel:', tel, 'syccessfully!!!')
if __name__ == '__main__':
sendSMSMsg("Hello?" ,"+×××××××××")
測試結(jié)果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/qqsend/Send.py
Send : Hello? to tel: +8618436354553 syccessfully!!!
Process finished with exit code 0
手機(jī)接收短信:
發(fā)送短信總結(jié)
注冊(cè)twilio
獲取三個(gè)參數(shù):account_sid,auth_token,TRIAL NUMBER
引入twilio
設(shè)置你要發(fā)送到的手機(jī)號(hào)和內(nèi)容
操作還算是比較簡單的,這部分主要用到twilio庫。
定時(shí)發(fā)送短信
這一步算是我們的主程序了,在這一部分里,我們要使用之前的代碼先獲取情話list,再設(shè)置定時(shí)任務(wù),每天固定的時(shí)間點(diǎn)把短信發(fā)到女神手機(jī)上。
Python定時(shí)任務(wù)
Python 中的定時(shí)任務(wù)框架還挺多的,我們現(xiàn)在的需求是每天早上8點(diǎn)鐘執(zhí)行一個(gè)任務(wù),在不到這個(gè)時(shí)間的時(shí)候不發(fā)送信息,為了簡便理解,我打算直接循環(huán)掃描系統(tǒng)當(dāng)前時(shí)間,如果到了我們需要的那個(gè)時(shí)間點(diǎn),就發(fā)送,不到的時(shí)候就一直掃描
代碼實(shí)現(xiàn)
import time
while True:
# 刷新
time_now = time.strftime("%H:%M:%S", time.localtime())
# 此處設(shè)置每天定時(shí)的時(shí)間
if time_now == "15:29:00":
# 需要執(zhí)行的動(dòng)作
print('定時(shí)任務(wù)執(zhí)行一次')
time.sleep(2) # 因?yàn)橐悦攵〞r(shí),所以暫停2秒,使之不會(huì)在1秒內(nèi)執(zhí)行多次
結(jié)果:
/usr/bin/python3.7 /home/baldwin/PycharmProjects/IAmADog/DoWork.py
定時(shí)任務(wù)執(zhí)行一次
Traceback (most recent call last):
File "/home/baldwin/PycharmProjects/IAmADog/DoWork.py", line 7, in
time_now = time.strftime("%H:%M:%S", time.localtime())
KeyboardInterrupt
Process finished with exit code 1
我是15:28:00的時(shí)候運(yùn)行程序的,在設(shè)置時(shí)刻確實(shí)是執(zhí)行了程序。
下面的異常是因?yàn)槲沂謩?dòng)退出了程序,這里不用管他。
具體實(shí)現(xiàn)發(fā)送情話
我們這里整理一下具體需求:
1.定時(shí)間點(diǎn)發(fā)送(上面已經(jīng)實(shí)現(xiàn)了)
2.每次發(fā)送的時(shí)候從list中取出一個(gè)句子,下一次取出下一條,不能重復(fù)
3.list中的句子發(fā)送完畢之后要發(fā)短信通知我
取句子
思路:設(shè)置一個(gè)全局變量index,代表著下一條要發(fā)送的句子的下標(biāo),每次發(fā)送短信后,下標(biāo)要增加1
發(fā)送完畢通知管理員
思路:每次進(jìn)入任務(wù)但是發(fā)送短信之前都要比較index的值與list的長度(現(xiàn)在想起來,設(shè)計(jì)程序的時(shí)候用棧來儲(chǔ)存數(shù)據(jù)會(huì)更好),如果index已經(jīng)越界,直接給管理員發(fā)短信通知。
實(shí)現(xiàn)
from spider import Spider
from send import Send
import time
TIME_TO_DO = '08:30:00' # 發(fā)送時(shí)間點(diǎn)
MSG_SUFFIX = '\n來自你的小可愛——Baldwin' # 短信后綴
SOURCE_URL = 'http://www.1juzi.com/new/150542.html' # 情話資源地址
SEND_TO_TEL = '+8618436354553' # 女神的手機(jī)號(hào)
SEND_TO_ME = '舔狗,給女神發(fā)的短信已經(jīng)用光了,快來更新?。?!'
MY_TEL = '+8618436354553' # 舔狗手機(jī)號(hào)
index = 0 # 下一條短信的下標(biāo)
sentenceList = Spider.getSentenceList(SOURCE_URL) # 情話列表
while True:
# 刷新
time_now = time.strftime("%H:%M:%S", time.localtime())
# 此處設(shè)置每天定時(shí)的時(shí)間
if time_now == TIME_TO_DO:
# 需要執(zhí)行的動(dòng)作
# 判斷當(dāng)前l(fā)ist有沒有用光
if index >= len(sentenceList):
# 用光了就短信通知我
Send.sendSMSMsg(SEND_TO_ME, MY_TEL)
# 跳出
break
# 給女神發(fā)短信
content = sentenceList[index] + MSG_SUFFIX
Send.sendSMSMsg(content, SEND_TO_TEL)
# 下標(biāo)加一
index += 1
# 因?yàn)橐悦攵〞r(shí),所以暫停2秒,使之不會(huì)在1秒內(nèi)執(zhí)行多次
time.sleep(2)
debug模式下的各項(xiàng)測試:
短信發(fā)送測試
在idea debug模式下可以對(duì)time_now參數(shù)進(jìn)行設(shè)置,把它設(shè)置成我們?cè)谇懊嬉l(fā)送短信的那個(gè)時(shí)間點(diǎn),成功進(jìn)行了短信發(fā)送:
管理員通知測試
同樣的在debug模式下,設(shè)置index的值為len(sentenceList),程序進(jìn)入通知管理員模塊中,這里不再演示。
封裝
from spider import Spider
from send import Send
import time
TIME_TO_DO = '08:30:00' # 發(fā)送時(shí)間點(diǎn)
MSG_SUFFIX = '\n來自你的小可愛——Baldwin' # 短信后綴
SOURCE_URL = 'http://www.1juzi.com/new/150542.html' # 情話資源地址
SEND_TO_TEL = '+8618436354553' # 女神的手機(jī)號(hào)
SEND_TO_ME = '舔狗,給女神發(fā)的短信已經(jīng)用光了,快來更新?。?!'
MY_TEL = '+8618436354553' # 舔狗手機(jī)號(hào)
def doSend():
index = 0 # 下一條短信的下標(biāo)
sentenceList = Spider.getSentenceList(SOURCE_URL) # 情話列表
while True:
# 刷新
time_now = time.strftime("%H:%M:%S", time.localtime())
# 此處設(shè)置每天定時(shí)的時(shí)間
if time_now == TIME_TO_DO:
# 需要執(zhí)行的動(dòng)作
# 判斷當(dāng)前l(fā)ist有沒有用光
if index >= len(sentenceList):
# 用光了就短信通知我
Send.sendSMSMsg(SEND_TO_ME, MY_TEL)
# 跳出
break
# 給女神發(fā)短信
content = sentenceList[index] + MSG_SUFFIX
Send.sendSMSMsg(content, SEND_TO_TEL)
# 下標(biāo)加一
index += 1
# 因?yàn)橐悦攵〞r(shí),所以暫停2秒,使之不會(huì)在1秒內(nèi)執(zhí)行多次
time.sleep(2)
# 主程序入口
if __name__ == '__main__':
doSend()
小總結(jié)
這部分主要用到的模塊:time,然后記得要把前兩個(gè)我們自己做的模塊導(dǎo)入進(jìn)來。
總結(jié)
這個(gè)程序相對(duì)來說還算是比較容易的,只要跟著文章一步步來基本上不互出問題。
最后只要運(yùn)行我們最后一個(gè)模塊中主程序入口就好了,你也可以按照自己需求修改配置達(dá)到不同的效果。
我現(xiàn)在就去告訴女神去。
嘿嘿!女神秒回的,開心!
以上就是如何給用Python每天定時(shí)給女神發(fā)一句情話,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。