python爬虫爬取监控教务系统的思路详解


Posted in Python onJanuary 08, 2020

这几天考了大大小小几门课,教务系统又没有成绩通知功能,为了急切想知道自己挂了多少门,于是我写下这个脚本。

设计思路:

设计思路很简单,首先对已有的成绩进行处理,变为list集合,然后定时爬取教务系统查成绩的页面,对爬取的成绩也处理成list集合,如果newList的长度增加了,就找出增加的部分,并通过邮件通知我。

脚本运行效果:

服务器:

python爬虫爬取监控教务系统的思路详解

发送邮件通知:

python爬虫爬取监控教务系统的思路详解

代码如下:

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爬虫爬取监控教务系统的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python for Informatics 第11章 正则表达式(一)
Apr 21 Python
Python字符编码判断方法分析
Jul 01 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
Python实现点云投影到平面显示
Jan 18 Python
keras的三种模型实现与区别说明
Jul 03 Python
python中的错误如何查看
Jul 08 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
让你相见恨晚的十个Python骚操作
Nov 18 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
Pytorch实现基于CharRNN的文本分类与生成示例
Jan 08 #Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 #Python
Pytorch实现神经网络的分类方式
Jan 08 #Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 #Python
基于python3抓取pinpoint应用信息入库
Jan 08 #Python
Python PyInstaller安装和使用教程详解
Jan 08 #Python
关于Pytorch的MLP模块实现方式
Jan 07 #Python
You might like
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
Javascript优化技巧(文件瘦身篇)
2008/01/28 Javascript
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
js批量设置样式的三种方法不推荐使用with
2013/02/25 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
js实现自定义路由
2017/02/04 Javascript
angularJS深拷贝详解
2017/03/23 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
vue input实现点击按钮文字增删功能示例
2019/01/29 Javascript
[48:35]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 TNC vs Optic
2018/04/03 DOTA
Django的信号机制详解
2017/05/05 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
python实现图片九宫格分割
2021/03/07 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
C&A巴西网上商店:时尚、衣服、手机和鞋子
2020/06/07 全球购物
广告学专业毕业生自荐信
2013/09/24 职场文书
广告词串烧
2014/03/19 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
导游词之南迦巴瓦峰
2019/11/19 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
Mysql案例刨析事务隔离级别
2021/09/25 MySQL