前言
這個項目實已經(jīng)在一個月前已經(jīng)完成了,一直都想寫一篇博客來總結(jié)這個過程中遇到的一些問題。但最近一個月來都比較忙,所以一直拖到了現(xiàn)在。
首先說說起因吧,我沒事的時候,總喜歡依次點開學(xué)校主頁、教務(wù)處、圖書館以及學(xué)院的網(wǎng)站,看看有沒有什么新通知,雖然大多與我無關(guān)。恰逢最近正在學(xué)Python,經(jīng)常聽到別人說用Python寫爬蟲很簡單,但自己尚未接觸過爬蟲。于是抱著試一試的心態(tài)看了幾篇關(guān)于Python爬蟲的博客,發(fā)現(xiàn)實現(xiàn)起來的確很簡單。于是,便一邊看著官方的文檔說明,一邊看著別人的博客,終于完成了自己的第一次爬蟲。
簡介
使用urllib.request庫獲取到目標url(各個網(wǎng)站的'更多通知'頁)的源代碼,然后利用Python的re庫進行正則匹配,提取到通知相關(guān)信息后,與文件中存取的上一次爬取到的信息進行對比。
若檢測到有新的通知,則利用twilio庫向指定手機號碼發(fā)送SMS,利用smtplib庫向指定郵箱發(fā)送提醒信息。
此外,還具有發(fā)送日志以及異常日志的功能。
目前僅支持本校的通知提醒,后續(xù)會逐步提高項目的通用性。
源碼:
Github地址:School_Notice
準備工作
安裝twilio庫:pip install twilio
注冊twilio賬號:Twilio
驗證手機號:用來接收短信提醒的號碼必須在twilio上進行驗證
遇到的問題
郵件發(fā)送
若用名為msg的變量來保存郵件文本,則msg['From']以及msg['To']必須為實際的發(fā)件人地址,否則可能會出現(xiàn)異常:SMTPDataError(code, resp).如必須寫作:msg['From'] = 'xxxxx@qq.com'.我是使用的QQ郵箱來發(fā)郵件,至于其他郵箱需不需要這樣寫還不清楚。
原本想用一個for循環(huán)來實現(xiàn)多人發(fā)送,后來發(fā)現(xiàn)smtplib庫的sendmail方法支持多人發(fā)送,但參數(shù)應(yīng)為一個list,故可用str.split(',')將字符串轉(zhuǎn)為list。
我使用的是Windows下的Python,若計算機名為中文,則有可能會導(dǎo)致出現(xiàn)異常,可通過右擊此電腦->屬性,修改計算機名。
程序代碼中使用的郵箱密碼不是QQ密碼,應(yīng)在郵箱設(shè)置->賬戶->SMTP服務(wù)處,獲取授權(quán)碼。
其他問題
有時候會接收不到Twilio發(fā)送的短信,給10086打電話也沒問出個所以然,可能是因為短信中有敏感詞(如:學(xué)校名),修改短信內(nèi)容后就可以了
對上述幾個網(wǎng)站的源碼使用re.findall后返回的列表中的每個元組中的元素的順序均為時間、標題、鏈接,但對學(xué)生處網(wǎng)站的源碼正則匹配后的元素順序并不是按照上述順序的。所以應(yīng)單獨進行調(diào)整,但直接修改一個元組中的元素,會出現(xiàn)異常:error:tuple' object does not support item assignment。
解決方法是:
if(subject_EN == 'snnu_xsc'): new_data = [] for item in data: temp = (item[1], item[2], item[0]) new_data.append(temp) data = new_data
Python3中的print函數(shù)是自動換行的,若不需要自動換行,則可寫作:print(str,end='')
不同網(wǎng)站的編碼格式可能不同,應(yīng)按照各自的編碼方式進行解碼。若均采用utf-8的方式,則可能會出現(xiàn)各種編碼問題,如:
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xc9 in position 167
解決方法是:
if find1 == -1 & find2 == -1: Coding = 'utf-8'else: # 教務(wù)處網(wǎng)頁源碼編碼格式為為gbk # 學(xué)生處網(wǎng)頁源碼編碼格式為gb2312 Coding = 'gbk'data = response.read().decode(Coding)
Python程序打包為exe(Pyinstaller)
新聞熱點
疑難解答