python爬蟲爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解
這幾天考了大大小小幾門課,教務(wù)系統(tǒng)又沒有成績(jī)通知功能,為了急切想知道自己掛了多少門,于是我寫下這個(gè)腳本。
設(shè)計(jì)思路:
設(shè)計(jì)思路很簡(jiǎn)單,首先對(duì)已有的成績(jī)進(jìn)行處理,變?yōu)閘ist集合,然后定時(shí)爬取教務(wù)系統(tǒng)查成績(jī)的頁面,對(duì)爬取的成績(jī)也處理成list集合,如果newList的長(zhǎng)度增加了,就找出增加的部分,并通過郵件通知我。
腳本運(yùn)行效果:
服務(wù)器:

發(fā)送郵件通知:

代碼如下:
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
#但我們學(xué)校后臺(tái)將用戶名和密碼進(jìn)行了加密
#通過觀察瀏覽器的請(qǐng)求數(shù)據(jù)跟頁面源碼猜出學(xué)校后臺(tái)的加密方式
data={
#出于學(xué)校安全考慮,這里就不給出加密方式了
'encoded':'xxxxxxxxxxxxxxxxxxx'
}
session = requests.Session()
session.post('http://jwc.sgu.edu.cn/jsxsd/xk/LoginToXk',data=data)
#請(qǐng)求2019-2020-1學(xué)期的所有成績(jī)
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)
#對(duì)爬回來數(shù)據(jù)進(jìn)行封裝
soup = BeautifulSoup(r.text, 'html.parser')
#返回已有的成績(jī)列表
oldList = toList(soup)
max = len(oldList)
#這里用死循環(huán)定時(shí)爬取成績(jī)頁面分析是否分布新成績(jī)
while (True):
#post跟get方式不能亂用,不然數(shù)據(jù)會(huì)出錯(cuò)
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):
#查詢新出的成績(jī)列表
newlist = toList(soup)
#獲取兩個(gè)列表不同之處,不同的就是新成績(jī)
diflist = compareTwoList(oldList, newlist)
oldList=newlist
if diflist=='':
send("unkowned Error","unkowned Error")
else:
#有新成績(jī)了,發(fā)送郵件通知我
send('you have new course sorce!!', diflist)
max = length
print('last running time was:',datetime.datetime.now())
#定時(shí)作用,500s查一次
time.sleep(500)
else:
# 發(fā)送郵件斷開連接了 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'
# 密碼(部分郵箱為授權(quán)碼)
mail_pass = '授權(quán)碼'
# 郵件發(fā)送方郵箱地址
sender = '發(fā)送方郵箱地址'
# 郵件接受方郵箱地址,注意需要[]包裹,這意味著你可以寫多個(gè)郵件地址群發(fā)
receivers = ['yoletpig@qq.com']
# 設(shè)置email信息
# 郵件內(nèi)容設(shè)置
message = MIMEText(msg, 'plain', 'utf-8')
# 郵件主題
message['Subject'] = Header(title,'utf-8')
# 發(fā)送方信息
message['From'] = sender
# 接受方信息
message['To'] = receivers[0]
# 登錄并發(fā)送郵件
try:
# smtpObj = smtplib.SMTP()
# # 連接到服務(wù)器
# smtpObj.connect(mail_host, 25)
smtpObj = smtplib.SMTP_SSL(mail_host)
# 登錄到服務(wù)器
smtpObj.login(mail_user, mail_pass)
# 發(fā)送
smtpObj.sendmail(
sender,receivers,message.as_string())
# 退出
smtpObj.quit()
print('success')
except smtplib.SMTPException as e:
print('error', e) # 打印錯(cuò)誤
def toList(soup):
flag = True
list = []
strs = ''
#對(duì)tr標(biāo)簽下的td進(jìn)行遍歷并取值
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()
這個(gè)腳本不出意外的話要運(yùn)行到我所有成績(jī)出來為止,但我電腦肯定不會(huì)這么多天不關(guān)機(jī)呀,于是我就將這個(gè)腳本放到服務(wù)器上運(yùn)行,如何在ubuntu下運(yùn)行python文件,大家可以看一下我的另一篇文章:
yoletPig的博客:Ubuntu下運(yùn)行python文件
總結(jié)
以上所述是小編給大家介紹的python爬蟲爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
Python可變參數(shù)函數(shù)用法實(shí)例
這篇文章主要介紹了Python可變參數(shù)函數(shù)用法,實(shí)例分析了Python可變參數(shù)函數(shù)的定義與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了用python實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
python 內(nèi)置庫wsgiref的使用(WSGI基礎(chǔ)入門)
WSGI(web服務(wù)器網(wǎng)關(guān)接口)主要規(guī)定了服務(wù)器端和應(yīng)用程序之間的接口,即規(guī)定了請(qǐng)求的URL到后臺(tái)處理函數(shù)之間的映射該如何實(shí)現(xiàn)。wsgiref是一個(gè)幫助開發(fā)者開發(fā)測(cè)試的Python內(nèi)置庫,程序員可以通過這個(gè)庫了解WSGI的基本運(yùn)行原理,但是不能把它用在生產(chǎn)環(huán)境上。2021-06-06
Python實(shí)現(xiàn)自動(dòng)識(shí)別并批量轉(zhuǎn)換文本文件編碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)自動(dòng)識(shí)別并批量轉(zhuǎn)換文本文件編碼的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
解決pytorch 數(shù)據(jù)類型報(bào)錯(cuò)的問題
這篇文章主要介紹了解決pytorch 數(shù)據(jù)類型報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03
pycharm如何設(shè)置自動(dòng)生成作者信息
這篇文章主要介紹了pycharm如何設(shè)置自動(dòng)生成作者信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Tensorflow: 從checkpoint文件中讀取tensor方式
今天小編就為大家分享一篇Tensorflow: 從checkpoint文件中讀取tensor方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
我們?yōu)槭裁匆獪p少Python中循環(huán)的使用
這篇文章主要介紹了我們?yōu)槭裁匆獪p少Python中循環(huán)的使用,我將闡述 Python 提供的一些簡(jiǎn)單但是非常有用的結(jié)構(gòu),一些小技巧以及一些我在數(shù)據(jù)科學(xué)工作中遇到的案例。我將討論 Python 中的 for 循環(huán),以及如何盡量避免使用它們,需要的朋友可以參考下2019-07-07

