教你用python爬虫监控教务系统,查成绩快人一步!
这几天考了大大小小几门课,教务系统又没有成绩通知功能,为了急切想知道自己挂了多少门,于是我写下这个脚本。

设计思路:
设计思路很简单,首先对已有的成绩进行处理,变为list集合,然后定时爬取教务系统查成绩的页面,对爬取的成绩也处理成list集合,如果newList的长度增加了,就找出增加的部分,并通过邮件通知我。

脚本运行效果:
服务器:

发送邮件通知:

代码如下:

  1. import datetime
  2. import time
  3. from email.header import Header
  4. import requests
  5. import re
  6. import smtplib
  7. from email.mime.text import MIMEText
  8. from bs4 import BeautifulSoup
  9.  
  10. def listener():
  11. #在这里我通过模拟登陆的方式登陆
  12. #一般来说这里填写的是username跟password
  13. #但我们学校后台将用户名和密码进行了加密
  14. #通过观察浏览器的请求数据跟页面源码猜出学校后台的加密方式
  15. data={
  16. #出于学校安全考虑,这里就不给出加密方式了
  17. 'encoded':'xxxxxxxxxxxxxxxxxxx'
  18. }
  19. session = requests.Session()
  20. session.post('http://jwc.sgu.edu.cn/jsxsd/xk/LoginToXk',data=data)
  21. #请求2019-2020-1学期的所有成绩
  22. r_data = {
  23. 'kksj': '2019-2020-1',
  24. 'kcxz': '',
  25. 'kcmc': '',
  26. 'xsfs': 'all'
  27. }
  28. r = session.post('http://jwc.sgu.edu.cn/jsxsd/kscj/cjcx_list', data=r_data)
  29. #对爬回来数据进行封装
  30. soup = BeautifulSoup(r.text, 'html.parser')
  31. #返回已有的成绩列表
  32. oldList = toList(soup)
  33. max = len(oldList)
  34. #这里用死循环定时爬取成绩页面分析是否分布新成绩
  35. while (True):
  36. #post跟get方式不能乱用,不然数据会出错
  37. r = session.post('http://jwc.sgu.edu.cn/jsxsd/kscj/cjcx_list',data=r_data)
  38. soup = BeautifulSoup(r.text, 'lxml')
  39. #print(soup.prettify())
  40. length = len(soup.find_all(string=re.compile('2019-2020-1')))-1
  41. print("course_length: ",length)
  42. if (r.status_code == 200 and length != 0):
  43. if (length > max):
  44. #查询新出的成绩列表
  45. newlist = toList(soup)
  46. #获取两个列表不同之处,不同的就是新成绩
  47. diflist = compareTwoList(oldList, newlist)
  48. oldList=newlist
  49. if diflist=='':
  50. send("unkowned Error","unkowned Error")
  51. else:
  52. #有新成绩了,发送邮件通知我
  53. send('you have new course sorce!!', diflist)
  54. max = length
  55. print('last running time was:',datetime.datetime.now())
  56. #定时作用,500s查一次
  57. time.sleep(500)
  58. else:
  59. # 发送邮件断开连接了 print("had disconnected...")
  60. send("your server is disconnected!!!","your server is disconnected!!!")
  61. break
  62.  
  63. def send(title,msg):
  64. mail_host = 'smtp.qq.com'
  65. # 你的qq邮箱名,没有.com
  66. mail_user = '你的qq邮箱名,没有.com'
  67. # 密码(部分邮箱为授权码)
  68. mail_pass = '授权码'
  69. # 邮件发送方邮箱地址
  70. sender = '发送方邮箱地址'
  71. # 邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
  72. receivers = ['yoletpig@qq.com']
  73.  
  74. # 设置email信息
  75. # 邮件内容设置
  76. message = MIMEText(msg, 'plain', 'utf-8')
  77. # 邮件主题
  78. message['Subject'] = Header(title,'utf-8')
  79. # 发送方信息
  80. message['From'] = sender
  81. # 接受方信息
  82. message['To'] = receivers[0]
  83.  
  84. # 登录并发送邮件
  85. try:
  86. # smtpObj = smtplib.SMTP()
  87. # # 连接到服务器
  88. # smtpObj.connect(mail_host, 25)
  89. smtpObj = smtplib.SMTP_SSL(mail_host)
  90. # 登录到服务器
  91. smtpObj.login(mail_user, mail_pass)
  92. # 发送
  93. smtpObj.sendmail(
  94. sender,receivers,message.as_string())
  95. # 退出
  96. smtpObj.quit()
  97. print('success')
  98. except smtplib.SMTPException as e:
  99. print('error', e) # 打印错误
  100.  
  101. def toList(soup):
  102. flag = True
  103. list = []
  104. strs = ''
  105. #对tr标签下的td进行遍历并取值
  106. for tr in soup.find_all('tr'):
  107. if flag:
  108. flag = False;
  109. continue
  110. i = 1
  111. for td in tr.stripped_strings:
  112. if (i == 1 or i == 2):
  113. i += 1
  114. continue
  115. strs += "_" + td
  116. i += 1
  117. list.append(strs)
  118. strs = ''
  119. return list
  120.  
  121. def compareTwoList(oldList,newList):
  122. diflist=''
  123. for sub in newList:
  124. #判断是否唯一
  125. if(oldList.count(sub)==0):
  126. diflist = sub
  127. break
  128. return diflist
  129.  
  130. if __name__ == '__main__':
  131. listener()

这个脚本不出意外的话要运行到我所有成绩出来为止,但我电脑肯定不会这么多天不关机呀,于是我就将这个脚本放到服务器上运行

http://mseo.chinaz.com/lvyous1.nx04.com/   http://seo.chinaz.com/lvyous2.nx04.com/     http://mseo.chinaz.com/lvyous3.nx04.com/   http://seo.chinaz.com/lvyous4.nx04.com/

http://mseo.chinaz.com/lvyous5.nx04.com/   http://seo.chinaz.com/lvyous6.nx04.com/     http://mseo.chinaz.com/lvyous7.nx04.com/   http://seo.chinaz.com/lvyous8.nx04.com/

教你用python爬虫监控教务系统,查成绩快人一步!的更多相关文章

  1. Python爬Boss,找工作,快人一步!!!

    通过职位搜索"Python开发",看下搜索的结果: https://www.zhipin.com/job_detail/?query=python开发&city=10102 ...

  2. 用Python爬虫爬取广州大学教务系统的成绩(内网访问)

    用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code ...

  3. 用python爬虫监控CSDN博客阅读量

    作为一个博客新人,对自己博客的访问量也是很在意的,刚好在学python爬虫,所以正好利用一下,写一个python程序来监控博客文章访问量 效果 代码会自动爬取文章列表,并且获取标题和访问量,写入exc ...

  4. 零基础教你写python爬虫

    大家都知道python经常被用来做爬虫,用来在互联网上抓取我们需要的信息. 使用Python做爬虫,需要用到一些包: requests urllib BeautifulSoup 等等,关于python ...

  5. 在Android上模拟登录广工正方教务系统查询成绩

    这是在博客园里开博以来写的第一篇博客. 因为之前看过很多人都有发过关于模拟登录正方软件获取数据的文章,自己觉得挺好玩的便也去动手一做,开始还以为挺难的,但实际做起来还蛮简单的,当然其中还有些小插曲. ...

  6. 手把手教你用Python爬虫煎蛋妹纸海量图片

    我们的目标是用爬虫来干一件略污事情 最近听说煎蛋上有好多可爱的妹子,而且爬虫从妹子图抓起练手最好,毕竟动力大嘛.而且现在网络上的妹子很黄很暴力,一下接受太多容易营养不量,但是本着有人身体就比较好的套路 ...

  7. python爬虫快递查询系统(源码)

    import requestsimport json def get_express_type(postid): '''根据快递单号来智能判断快递类型''' url = 'http://www.kua ...

  8. Python 爬虫监控女神的QQ空间新的说说,实现邮箱发送

    主要实现的功能就是:监控女神的 QQ空间,一旦女神发布新的说说,你的邮箱马上就会收到说说内容,是不是想了解一下 先看看代码运行效果图: PS:只有你有一台云服务器你就可以把程序24h运行起来 直接上代 ...

  9. Python 爬虫监控女神的QQ空间新的说说,实现秒赞,并发送说说内容到你的邮箱

    这个文章主要是在前一篇文章上新增了说说秒赞的功能 前一篇文章可以了解一下 那么,这次主要功能就是 监控女神的 QQ空间,一旦女神发布新的说说,马上点赞,你的邮箱马上就会收到说说内容,是不是想了解一下 ...

随机推荐

  1. JS-06-定时器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Centos 7 最小化时间服务部署配置

    基本原理 Centos 7 我所了解有两种时间服务,NTPD与chronyd:两者对Centos 7 的支持都很好,有对chrony非常夸赞的,不过我这里只讲ntpd:有对chrony有想法的可以自行 ...

  3. 使用visual studio 2013读取.mat文件

    现在有一个T.mat 文件需要在c++中处理然后以.mat 或是.txt形式返回 T.mat中存储了十个cell,每个cell中会有一个不等长的数组 1.以下是相关配置过程: 参考:http://we ...

  4. CSS DIV重叠

    <div style="position: relative"> <div>content</div> <div style=" ...

  5. React报错Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`

    引言 最近在忙毕业设计,博客也很久没更新了,毕业设计使用vue做了一个校园寻物网站,现在开始学Raect,记录一下自己遇到问题,react-redux的connect方法使得组件与Redux建立了联系 ...

  6. 微服务之docker(二)

    一.SpringCloud/SpringBoot整合docker 使用docker的maven组建构建springboot应用(官方文档:https://spring.io/guides/gs/spr ...

  7. 学习记录(安装Scala)

    安装完spark之后根据教程安装Scala,在安装的时候提出警告,等了好长时间之后发现无法下载,最后搜索之后发现1.8版本的jdk无法安装,今天又重装了jdk换成了1.7.0的openjdk jdk安 ...

  8. 21种JavaScript设计模式最新记录(含图和示例)

    最近观看了<Javascript设计模式系统讲解与应用>教程,对设计模式有了新的认识,特在此做些记录. 一.UML 文中会涉及众多的UML类图,在开篇需要做点基础概念的认识.以下面的图为例 ...

  9. 利用AppMetrics对Web进行监控教程

    利用AppMetrics对Web进行监控教程 一.基础准备 1. 安装依赖 这里可以通过nuget或使用命令行进行安装,具体需要安装的类库如下(注意版本): Install-Package App.M ...

  10. Spring的aop思想

    1.AOP思想 (1)在解决中文乱码的应用: 一般情况下如果在Servlet中要解决中文乱码问题需要在每一个Servlet中书写解决乱码的代码,但是,在运用了过滤器之后,就不再需要每一个Servlet ...