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的else子句使用指南
Feb 27 Python
python urllib爬取百度云连接的实例代码
Jun 19 Python
python中numpy包使用教程之数组和相关操作详解
Jul 30 Python
Python中常用信号signal类型实例
Jan 25 Python
python爬虫爬取网页表格数据
Mar 07 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
Jul 27 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
Django objects的查询结果转化为json的三种方式的方法
Nov 07 Python
解决pycharm运行程序出现卡住scanning files to index索引的问题
Jun 27 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
Python xlrd excel文件操作代码实例
Mar 10 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 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
PHP+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP学习笔记 IIS7下安装配置php环境
2012/10/29 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
PHP 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
学习JavaScript的最佳方法分享
2011/10/21 Javascript
JS中setTimeout()的用法详解
2013/04/14 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
2016/05/17 Javascript
js中的面向对象入门
2017/03/06 Javascript
Vue CLI 3.x 自动部署项目至服务器的方法
2019/04/02 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
[01:24:34]2014 DOTA2华西杯精英邀请赛5 24 DK VS LGD
2014/05/25 DOTA
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
Python序列操作之进阶篇
2016/12/08 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
python selenium 弹出框处理的实现
2019/02/26 Python
python3.7 sys模块的具体使用
2019/07/22 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
利用 CSS3 实现的无缝轮播功能代码
2017/09/25 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
大学生物业管理求职信
2013/10/24 职场文书
长辈证婚人证婚词
2014/01/09 职场文书
高三家长寄语
2014/04/03 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
大学生自我评价范文
2015/03/03 职场文书
总账会计岗位职责
2015/04/02 职场文书
员工年度工作总结2015
2015/05/18 职场文书
教师培训简讯
2015/07/20 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
团支部组织委员竞选稿
2015/11/21 职场文书