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矩阵常见运算操作实例总结
Sep 29 Python
详解Python map函数及Python map()函数的用法
Nov 16 Python
Python中文件的读取和写入操作
Apr 27 Python
基于python实现简单日历
Jul 28 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
python 实现dict转json并保存文件
Dec 05 Python
Pyqt5自适应布局实例
Dec 13 Python
Python with标签使用方法解析
Jan 17 Python
Pytest参数化parametrize使用代码实例
Feb 22 Python
call在Python中改进数列的实例讲解
Dec 09 Python
python小程序之飘落的银杏
Apr 17 Python
Python 数据可视化之Matplotlib详解
Nov 02 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
实用函数3
2007/11/08 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
php从字符串创建函数的方法
2015/03/16 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
javascript编程起步(第一课)
2007/01/10 Javascript
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
div移动 输入框不能输入的问题
2009/11/19 Javascript
JavaScript 学习技巧
2010/02/17 Javascript
ASP 过滤数组重复数据函数(加强版)
2010/05/31 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
nodejs实现发出蜂鸣声音(系统报警声)的方法
2017/01/18 NodeJs
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
Python字符串中查找子串小技巧
2015/04/10 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
Pandas实现dataframe和np.array的相互转换
2019/11/30 Python
Tensorflow 模型转换 .pb convert to .lite实例
2020/02/12 Python
python画图常规设置方式
2020/03/05 Python
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
办公室打字员岗位职责
2014/04/16 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
数控专业毕业生求职信
2014/06/12 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
部队反四风对照检查材料
2014/09/26 职场文书
全国法制宣传日活动总结2014
2014/11/01 职场文书
2014年生产部工作总结
2014/12/17 职场文书
小学国庆节活动总结
2015/03/23 职场文书
计划生育责任书
2015/05/09 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript