python爬蟲爬取監控教務系統的思路詳解
阿新 • • 發佈:2020-01-09
這幾天考了大大小小几門課,教務系統又沒有成績通知功能,為了急切想知道自己掛了多少門,於是我寫下這個指令碼。
設計思路:
設計思路很簡單,首先對已有的成績進行處理,變為list集合,然後定時爬取教務系統查成績的頁面,對爬取的成績也處理成list集合,如果newList的長度增加了,就找出增加的部分,並通過郵件通知我。
指令碼執行效果:
伺服器:
傳送郵件通知:
程式碼如下:
import datetime import time from email.header import Header import requests import re import smtplib from email.mime.text import MIMEText from bs4 import BeautifulSoup def listener(): #在這裡我通過模擬登陸的方式登陸 #一般來說這裡填寫的是username跟password #但我們學校後臺將使用者名稱和密碼進行了加密 #通過觀察瀏覽器的請求資料跟頁面原始碼猜出學校後臺的加密方式 data={ #出於學校安全考慮,這裡就不給出加密方式了 'encoded':'xxxxxxxxxxxxxxxxxxx' } session = requests.Session() session.post('http://jwc.sgu.edu.cn/jsxsd/xk/LoginToXk',data=data) #請求2019-2020-1學期的所有成績 r_data = { 'kksj': '2019-2020-1','kcxz': '','kcmc': '','xsfs': 'all' } r = session.post('http://jwc.sgu.edu.cn/jsxsd/kscj/cjcx_list',data=r_data) #對爬回來資料進行封裝 soup = BeautifulSoup(r.text,'html.parser') #返回已有的成績列表 oldList = toList(soup) max = len(oldList) #這裡用死迴圈定時爬取成績頁面分析是否分佈新成績 while (True): #post跟get方式不能亂用,不然資料會出錯 r = session.post('http://jwc.sgu.edu.cn/jsxsd/kscj/cjcx_list',data=r_data) soup = BeautifulSoup(r.text,'lxml') #print(soup.prettify()) length = len(soup.find_all(string=re.compile('2019-2020-1')))-1 print("course_length: ",length) if (r.status_code == 200 and length != 0): if (length > max): #查詢新出的成績列表 newlist = toList(soup) #獲取兩個列表不同之處,不同的就是新成績 diflist = compareTwoList(oldList,newlist) oldList=newlist if diflist=='': send("unkowned Error","unkowned Error") else: #有新成績了,傳送郵件通知我 send('you have new course sorce!!',diflist) max = length print('last running time was:',datetime.datetime.now()) #定時作用,500s查一次 time.sleep(500) else: # 傳送郵件斷開連線了 print("had disconnected...") send("your server is disconnected!!!","your server is disconnected!!!") break def send(title,msg): mail_host = 'smtp.qq.com' # 你的qq郵箱名,沒有.com mail_user = '你的qq郵箱名,沒有.com' # 密碼(部分郵箱為授權碼) mail_pass = '授權碼' # 郵件傳送方郵箱地址 sender = '傳送方郵箱地址' # 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個郵件地址群發 receivers = ['[email protected]'] # 設定email資訊 # 郵件內容設定 message = MIMEText(msg,'plain','utf-8') # 郵件主題 message['Subject'] = Header(title,'utf-8') # 傳送方資訊 message['From'] = sender # 接受方資訊 message['To'] = receivers[0] # 登入併發送郵件 try: # smtpObj = smtplib.SMTP() # # 連線到伺服器 # smtpObj.connect(mail_host,25) smtpObj = smtplib.SMTP_SSL(mail_host) # 登入到伺服器 smtpObj.login(mail_user,mail_pass) # 傳送 smtpObj.sendmail( sender,receivers,message.as_string()) # 退出 smtpObj.quit() print('success') except smtplib.SMTPException as e: print('error',e) # 列印錯誤 def toList(soup): flag = True list = [] strs = '' #對tr標籤下的td進行遍歷並取值 for tr in soup.find_all('tr'): if flag: flag = False; continue i = 1 for td in tr.stripped_strings: if (i == 1 or i == 2): i += 1 continue strs += "_" + td i += 1 list.append(strs) strs = '' return list def compareTwoList(oldList,newList): diflist='' for sub in newList: #判斷是否唯一 if(oldList.count(sub)==0): diflist = sub break return diflist if __name__ == '__main__': listener()
這個指令碼不出意外的話要執行到我所有成績出來為止,但我電腦肯定不會這麼多天不關機呀,於是我就將這個指令碼放到伺服器上執行,如何在ubuntu下執行python檔案,大家可以看一下我的另一篇文章:
yoletPig的部落格:Ubuntu下執行python檔案
總結
以上所述是小編給大家介紹的python爬蟲爬取監控教務系統的思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!