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打开url并按指定块读取网页内容的方法
Apr 29 Python
详解Python3.6的py文件打包生成exe
Jul 13 Python
python2 与 pyhton3的输入语句写法小结
Sep 10 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
python3+pyqt5+itchat微信定时发送消息的方法
Feb 20 Python
Python中的pathlib.Path为什么不继承str详解
Jun 23 Python
PyCharm 2019.3发布增加了新功能一览
Dec 08 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
python实现数学模型(插值、拟合和微分方程)
Nov 13 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
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
Firefox和IE浏览器兼容JS脚本写法小结
2008/07/07 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
javascript 按回车键相应按钮提交事件
2009/11/02 Javascript
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
玩转jQuery按钮 请告诉我你最喜欢哪些?
2012/01/08 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
jQuery防止click双击多次提交及传递动态函数或多参数
2014/04/02 Javascript
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
ECMAScript 5中的属性描述符详解
2015/03/02 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JSON与XML的区别对比及案例应用
2016/11/11 Javascript
Vue键盘事件用法总结
2017/04/18 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
Three.js中矩阵和向量的使用教程
2019/03/19 Javascript
[02:01]2018完美盛典-开场舞《双子星》
2018/12/16 DOTA
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
python下的opencv画矩形和文字注释的实现方法
2019/07/09 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
Chupi官网:在爱尔兰手工制作的订婚、结婚戒指和精美珠宝
2020/09/28 全球购物
詹天佑教学反思
2014/04/30 职场文书
党性分析材料格式
2014/12/19 职场文书
党员带头倡议书
2015/04/29 职场文书
检讨书怎么写?
2019/06/21 职场文书
导游词之昭君岛
2020/01/17 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python