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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 Python
python生成验证码图片代码分享
Jan 28 Python
基于Python的关键字监控及告警
Jul 06 Python
机器学习10大经典算法详解
Dec 07 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
基于python调用psutil模块过程解析
Dec 20 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
对Pytorch 中的contiguous理解说明
Mar 03 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中文字符串截断无乱码解决方法
2016/10/10 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
Chrome中模态对话框showModalDialog返回值问题的解决方法
2010/05/25 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
JavaScript File分段上传
2016/03/10 Javascript
js实现增加数字显示的环形进度条效果
2017/02/05 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
微信小程序template模板与component组件的区别和使用详解
2019/05/22 Javascript
微信小程序国际化探索实现(附源码地址)
2020/05/20 Javascript
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
python抓取网页中图片并保存到本地
2015/12/01 Python
把pandas转换int型为str型的方法
2019/01/29 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
详解Python3 pickle模块用法
2019/09/16 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
2020/03/16 Python
python与js主要区别点总结
2020/09/13 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
美国护肤咨询及美容产品电商:Askderm
2017/02/24 全球购物
妇科医生自荐信
2013/11/05 职场文书
党校培训思想汇报
2014/01/03 职场文书
学校文明单位申报材料
2014/05/06 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
端午节寄语2015
2015/03/23 职场文书
退伍军人感言
2015/08/01 职场文书
会议室使用管理制度
2015/08/06 职场文书
2016公务员年度考核评语
2015/12/01 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书