用Python實現校園通知更新提醒功能
前言
這個專案實已經在一個月前已經完成了,一直都想寫一篇部落格來總結這個過程中遇到的一些問題。但最近一個月來都比較忙,所以一直拖到了現在。
首先說說起因吧,我沒事的時候,總喜歡依次點開學校主頁、教務處、圖書館以及學院的網站,看看有沒有什麼新通知,雖然大多與我無關。恰逢最近正在學Python,經常聽到別人說用Python寫爬蟲很簡單,但自己尚未接觸過爬蟲。於是抱著試一試的心態看了幾篇關於Python爬蟲的部落格,發現實現起來的確很簡單。於是,便一邊看著官方的文件說明,一邊看著別人的部落格,終於完成了自己的第一次爬蟲。
簡介
使用urllib.request庫獲取到目標url(各個網站的'更多通知'頁)的原始碼,然後利用Python的re庫進行正則匹配,提取到通知相關資訊後,與檔案中存取的上一次爬取到的資訊進行對比。
若檢測到有新的通知,則利用twilio庫向指定手機號碼傳送SMS,利用smtplib庫向指定郵箱傳送提醒資訊。
此外,還具有傳送日誌以及異常日誌的功能。
目前僅支援本校的通知提醒,後續會逐步提高專案的通用性。
原始碼:
Github地址:School_Notice
準備工作
安裝twilio庫:pip install twilio
註冊twilio賬號:Twilio
驗證手機號:用來接收簡訊提醒的號碼必須在twilio上進行驗證
遇到的問題
郵件傳送
若用名為msg的變數來儲存郵件文字,則msg['From']以及msg['To']必須為實際的發件人地址,否則可能會出現異常:SMTPDataError(code,resp).如必須寫作:msg['From'] = '[email protected]'.我是使用的QQ郵箱來發郵件,至於其他郵箱需不需要這樣寫還不清楚。
原本想用一個for迴圈來實現多人傳送,後來發現smtplib庫的sendmail方法支援多人傳送,但引數應為一個list,故可用str.split(',')將字串轉為list。
我使用的是Windows下的Python,若計算機名為中文,則有可能會導致出現異常,可通過右擊此電腦->屬性,修改計算機名。
程式程式碼中使用的郵箱密碼不是QQ密碼,應在郵箱設定->賬戶->SMTP服務處,獲取授權碼。
其他問題
有時候會接收不到Twilio傳送的簡訊,給10086打電話也沒問出個所以然,可能是因為簡訊中有敏感詞(如:學校名),修改簡訊內容後就可以了
對上述幾個網站的原始碼使用re.findall後返回的列表中的每個元組中的元素的順序均為時間、標題、連結,但對學生處網站的原始碼正則匹配後的元素順序並不是按照上述順序的。所以應單獨進行調整,但直接修改一個元組中的元素,會出現異常: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函式是自動換行的,若不需要自動換行,則可寫作:print(str,end='')
不同網站的編碼格式可能不同,應按照各自的編碼方式進行解碼。若均採用utf-8的方式,則可能會出現各種編碼問題,如:
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xc9 in position 167
解決方法是:
if find1 == -1 & find2 == -1: Coding = 'utf-8' else: # 教務處網頁原始碼編碼格式為為gbk # 學生處網頁原始碼編碼格式為gb2312 Coding = 'gbk' data = response.read().decode(Coding)
Python程式打包為exe(Pyinstaller)
安裝及使用
使用pip install pywin32安裝pywin32
使用pip install PyInstaller安裝Pyinstaller
使用pyinstaller -F main.py即可將Python程式打包為exe程式
注意事項
打包之前應將用到的第三方庫(此專案僅用到Twilio)複製到與要打包的py檔案同一目錄下。
可使用pyinstaller -F -i logo.ico main.py,為生成的exe程式新增圖示
使用的ico檔案畫素不能過小,否則有可能出現:打包後的程式圖示只有在資源管理器中設定為以小圖示檢視的情況下才顯示的是自己的圖示,其他情況仍未預設圖示
使用截圖
以上這篇用Python實現校園通知更新提醒功能就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。