Python爬虫自动监控教务系统成绩更新并邮件通知的实现方案
本文介绍一种基于Python的自动化脚本,用于监控教务系统成绩更新。通过模拟登录获取加密数据,定时爬取成绩页面并将结果转化为列表进行比对。一旦发现新成绩,脚本立即通过邮件发送通知。该方案解决了教务系统无主动推送功能的痛点,支持将脚本部署在Ubuntu服务器上长期运行,确保用户及时获知成绩发布情况。
背景与需求分析
近期经历了多门课程的考试,由于所在学校的教务系统缺乏成绩发布后的主动通知功能,为了能够第一时间掌握自己的挂科情况,我决定编写一个自动化脚本来解决这个问题。
系统设计与逻辑
核心设计思路如下:
整体逻辑较为直观:首先对已存在的成绩数据进行预处理,将其转换为列表集合;随后,脚本会定期访问教务系统的成绩查询页面进行爬取,并将获取到的新成绩同样处理为列表集合。通过对比新旧列表的长度,如果新列表长度增加,脚本将识别出新增的成绩条目,并通过邮件方式向用户发送通知。
运行效果展示
脚本的实际运行效果展示如下:
服务器端配置情况:

邮件发送通知的具体表现:

代码实现与部署
具体实现代码如下:
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 = ['yoletpig@qq.com']
# 设置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爬虫监控教务系统成绩更新的思路与实现方法,希望能对大家有所帮助。如有任何疑问,欢迎留言,我会及时回复。同时,非常感谢大家对本网站的支持! 如果您觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













