前言

哎对不起 我可能是silly boy 我想在学校里把去年的坑填了 但是发现新版的教务系统代码没传到git上 我现在就成了个对着空ide发呆的憨憨(代码在家里啦 所以填坑就再过会吧

那就稍微闲聊一下吧 打算填坑前逛了一下csdn上面有关新版正方教务系统的帖子 我去年留下的rsa加密的坑其实都被填掉了 也有用flask框架完善整个项目的
其实挺好的 写博客就是为了帮助更多的志同道合之人在这条路上进步 告诉你们我是怎么走到这里的 走了多少的坑
为中华崛起而奋斗~~

正文哈

国庆之后终于是想起来要把代码拷走这回事情,现在基本是填完了啦。
给刚学习爬虫的小白们做了封装 希望能够帮助你们理解

新版的方正教务系统唯一的难点也就是在登陆加密的地方了,这里感谢@qq_14926447 使用了他代码中的轮子 于是我也能快乐的跑起来啦~

实现的原理贴在上个教程里面了 就直接上干货吧

github项目链接:https://github.com/welsonsxc/NewZFScoreSpider

讲解一下

整个流程我封装成一个类了,方便后续api或者多线程调用
wechat_robot文件夹里是当时做测试公众号用的 学校方面没法申请下来经费就逐渐废弃了 如果你们学校可以的话 不妨研究一下 填填坑

哝 知道你们最喜欢这个了 再次感谢@qq_14926447

    # 加密密码def process_public(self):weibo_rsa_e = 65537message = str(self.password).encode()rsa_n = binascii.b2a_hex(binascii.a2b_base64(self.modules))key = rsa.PublicKey(int(rsa_n, 16), weibo_rsa_e)encropy_pwd = rsa.encrypt(message, key)self.password = binascii.b2a_base64(encropy_pwd)

我知道有人懒得点进github

# -*- coding: utf-8 -*-
import binascii
import requests
from bs4 import BeautifulSoup
import re
import time
import sys
import rsaclass Student:sessions = requests.Session()time = int(time.time())def __init__(self, name, password, login_url, key_url, grade_url):self.pub = Noneself.year = Noneself.term = Noneself.token = Noneself.header = Noneself.cookie = Noneself.modules = Noneself.request = Noneself.name = str(name).encode("utf8").decode("utf8")self.password = str(password).encode("utf8").decode("utf8")self.url = login_urlself.KeyUrl = key_urlself.gradeUrl = grade_urlself.get_public_key()self.get_csrf_token()self.process_public()self.login()# 获取公钥密码def get_public_key(self):result = self.sessions.get(self.KeyUrl + str(self.time)).json()self.modules = result["modulus"]# 说实话 这也太那啥了 这居然是没用的 怪不得去年栽在这里# self.exponent = result["exponent"]# 获取CsrfTokendef get_csrf_token(self):r = self.sessions.get(self.url + str(self.time))r.encoding = r.apparent_encodingsoup = BeautifulSoup(r.text, 'html.parser')self.token = soup.find('input', attrs={'id': 'csrftoken'}).attrs['value']# 加密密码def process_public(self):weibo_rsa_e = 65537message = str(self.password).encode()rsa_n = binascii.b2a_hex(binascii.a2b_base64(self.modules))key = rsa.PublicKey(int(rsa_n, 16), weibo_rsa_e)encropy_pwd = rsa.encrypt(message, key)self.password = binascii.b2a_base64(encropy_pwd)def login(self):try:self.header = {'Accept': 'text/html, */*; q=0.01','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0','Connection': 'keep-alive','Referer': self.url + str(self.time),'Upgrade-Insecure-Requests': '1',}data = {'csrftoken': self.token,'mm': self.password,'mm': self.password,'yhm': self.name}self.request = self.sessions.post(self.url, headers=self.header, data=data)self.cookie = self.request.request.headers['cookie']key_word = r'用户名或密码不正确'if re.findall(key_word, self.request.text):print('用户名或密码错误,请查验..')sys.exit()else:print("登陆成功")except Exception as e:print(str(e))sys.exit()def post_grade_data(self):try:data = {'_search': 'false','nd': int(time.time()),'queryModel.currentPage': '1','queryModel.showCount': '15','queryModel.sortName': '','queryModel.sortOrder': 'asc','time': '0','xnm': self.year,'xqm': self.term}self.request = self.sessions.post(self.gradeUrl, data=data, headers=self.header).json()except Exception as e:print(str(e))sys.exit()def welcome(self):try:# 姓名name = self.request['items'][0]['xm']# 学历sch_stu = self.request['items'][0]['xslb']# 学院institute = self.request['items'][0]['jgmc']# 班级stu_class = self.request['items'][0]['bj']print('姓名:{}\t学历:{}\t\t学院:{}\t班级:{}'.format(name, sch_stu, institute, stu_class))except Exception as e:print(str(e))def print_grades(self):try:plt = '{0:<20}{1:<5}{2:<5}{3:<5}'print(plt.format('课程', '成绩', '绩点', '教师'))for i in self.request['items']:print(plt.format(i['kcmc'], i['bfzcj'], i['jd'], i['jsxm']))except Exception as e:print("[Error]" + str(e))if __name__ == '__main__':# 输入学号密码# stu_name = input('请输入学号:').strip()stu_name = "你的学号"# stu_password = getpass.getpass('请输入密码(密码不回显,输入完回车即可):') .strip()stu_password = "你的密码"# 教务系统登录路径url = "http://你的学校域名或者ip地址/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t="# 请求PublicKey的URLkey_url = "http://你的学校域名或者ip地址/jwglxt/xtgl/login_getPublicKey.html?time="# 获取成绩路径grade_url = "http://你的学校域名或者ip地址/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005"# 登陆~temp = Student(stu_name, stu_password, url, key_url, grade_url)# 设定学年temp.year = "2018"# 第一学期为3 第二学期为12temp.term = "3"# 选择成绩查询temp.post_grade_data()# 输出个人信息temp.welcome()# 输出成绩信息temp.print_grades()

运行结果

感觉没啥好讲的 都是干货 git大学一定要学会呀 公司里都在用~
如果帮助到你了 烦请star!
最后留个工作邮箱 lilousc@dingtalk.com

Python实现新版正方教务系统爬虫(二)相关推荐

  1. 用Python登陆新版正方教务系统获取课程表(及RSA加密密码实现)

    前言 最近做一个微信小程序,需要登录教务系统.提前用python尝试一下登录接口,并获取到课表打印出来. 我们学校用到新版正方教务系统,长这个样子. 相比旧版的教务系统,唯一好处是不用输入二维码方便爬 ...

  2. python实现高校教务管理系统_Python实现新版正方教务系统爬虫

    目录~ 引入 需要什么软件? 模拟登陆 代码实现(登陆) 模拟获取成绩 代码实现(获取成绩) 解析成绩 测试(完成图) 作者的话 引入 就在我刚刚写完旧版正方系统爬虫的时候(旧版正方系统爬虫代码) 学 ...

  3. JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解

    新版正方教务系统登录界面: 目录 一.需求分析 二.模拟登录内网 三.模拟登录教务系统 四.爬取成绩和课表信息 参考文章 一.需求分析   需要访问教务系统,爬取出课表成绩等信息,并在自己所写的APP ...

  4. 新版方正教务系统爬虫

    新版方正教务系统爬虫 技术 解释 Python 2.7 BeautifulSoup 4.X Pycharm 2017 Firefox - Firebug - 新版教务处地址 218.199.228.4 ...

  5. go语言爬取新版正方教务系统数据

    go语言爬取新版正方教务系统数据 学完go语言的基础之后已经过了一个多月了,开始想试着利用些时间写写博客,就打算将半个月前练着写的一个go爬虫小项目翻出来写写.由于之前对go爬虫的一些基础知识不熟悉, ...

  6. 用java计算学生绩点并排序_JS代码计算GPA平均学分绩点(适合新版正方教务系统)...

    JS代码计算GPA平均学分绩点(适合新版正方教务系统)javascript 新版教务在某些功能上进步很大,可是在GPA统计上,只有全部科目的GPA,没有必修科目的GPA,因此只能本身去写了.java ...

  7. 广州商学院Python正方教务系统爬虫(获取个人信息成绩课表修改密码)

    使用python的requests库简单爬取,使用xpath解析内容 可以获取个人信息.个人照片.成绩单和课表 github地址:https://github.com/PythonerKK/GZCC- ...

  8. 新版正方教务系统导出课程表-油猴脚本

    https://www.cnblogs.com/31415926535x/p/12244461.html 简介 这个油猴脚本主要是针对新版的正方教务系统,实现将课程表转化为一个 courses.ics ...

  9. HZAU新版正方教务系统一键教学评价

    新的一轮教学评价又开始了,每门课要点十几次,课程多的话可能得点一两百次,想起去年有大佬做过自动评价的脚本,但不能用了,因为教务系统的代码有更改,而且不能全满分了,所以照着大佬的代码摸索了一下,改出了能 ...

最新文章

  1. 算法在ros中应用_烟火检测算法——中伟视界人工智能算法AI在智慧工地、石油中的应用_腾讯新闻...
  2. win10安装java1.8开发环境JDK
  3. SQL Server 与 SQL Express 的异同
  4. Angularjs1.x 中的 constant, value
  5. 机器学习——人工神经网络之发展历史(神经元数学模型、感知器算法)
  6. 《Oracle大型数据库在AIX UNIX上的实战详解》的集中答疑九 数据库字符集与国家语言...
  7. Go 语言里怎么正确实现枚举?答案藏着官方的源码里
  8. 线段树(区间合并) HDOJ 3308 LCIS
  9. 四、StackPanel控件
  10. joc杂志影响因子2019_化学sci期刊影响因子排名_国际化学期刊2018最新影响因子_分析测试学报影响因子...
  11. c语言头文件及形式,C语言头文件作用及写法
  12. 2016版Excel加载宏实现加载空间分析库
  13. ①万字《详解canvas api画图》小白前端入门教程(建议收藏)
  14. RocketMQ消息发送源码解析
  15. 吃货必须知道的经验,收藏备用了!太全面了!
  16. 淘宝新版打标足迹在哪里浏览?
  17. 展现巨星风采!字母哥关键时刻挺身而出
  18. 两个usb摄像头通过hub连接电脑怎么同时独立显示_把电脑装进口袋是什么感觉?华硕VivoStick TS10多角度体验...
  19. java结束if_java中如何结束if循环
  20. 如何测试视频会议的延迟

热门文章

  1. 360个人图书馆复制不了
  2. 财务部门:OKR 案例集
  3. 04 4bit移位寄存器设计与功能验证(附源码)
  4. 品优购商城项目常见BUG解析
  5. C#控制台应用程序之旅游资源与线路管理系统
  6. 2016年Visual C++推荐图书125本
  7. 51单片机驱动DS18B20温度传感器测量温度
  8. 华大多功能四合一HD-100多功能智能卡读写器OCX插件配置使用教程
  9. 国外最大的购物搜索/比较购物网站
  10. 烂泥:mysql5.5主从同步复制配置