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中给List添加元素的4种方法分享
Nov 28 Python
编写Python的web框架中的Model的教程
Apr 29 Python
Python字符串拼接的几种方法整理
Aug 02 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
pandas实现将dataframe满足某一条件的值选出
Jun 12 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Python Numpy,mask图像的生成详解
Feb 19 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
Apr 25 Python
用Python实现职工信息管理系统
Dec 30 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简单实现加减乘除计算器
2014/01/06 PHP
PHP中addslashes()和stripslashes()实现字符串转义和还原用法实例
2016/01/07 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
学习YUI.Ext第五日--做拖放Darg&Drop
2007/03/10 Javascript
javascript iframe内的函数调用实现方法
2009/07/19 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
JS实现带阴历的日历功能详解
2019/01/24 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
python矩阵的转置和逆转实例
2018/12/12 Python
Django自定义模板过滤器和标签的实现方法
2019/08/21 Python
Python中关于浮点数的冷知识
2019/09/22 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
python 变量初始化空列表的例子
2019/11/28 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
运行时异常与一般异常有何异同?
2014/01/05 面试题
2015年清明节扫墓演讲稿
2015/03/18 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书
国庆放假通知怎么写
2015/07/30 职场文书
护理心得体会范文
2016/01/22 职场文书