目录~

引入

需要什么软件?

模拟登陆

代码实现(登陆)

模拟获取成绩

代码实现(获取成绩)

解析成绩

测试(完成图)

作者的话

引入

就在我刚刚写完旧版正方系统爬虫的时候(旧版正方系统爬虫代码)

学校就出了新版的正方教务系统

估计是装空调的钱有的多

那就开始讲解叭~

需要什么软件?

基本的

Python! (我最喜欢3.x的版本啦)

一个你喜欢的IDE! (顺手的IDE事半功倍哦)

requests(爬虫基本都大家都明白的吧~)

BeautifulSoup(解析结构化数据很好用啦)

re(正则化表达式html还算好用吧)

time(这是网址中神秘代码的来源哦)

datetime(这个可以不加啦 我做了和数据库的链接方便记录时间)

subprocess(委屈 是不经意间没有办法捡来的解决办法)

sys(防止报错意外停止啦)

扩展的

Fiddler 4!(模拟爬虫是真滴好用)

模拟登陆

首先我们启动Fiddler 然后正常访问一下教务系统

发现了这两条事件

第78条事件就是访问主页面啦

但是第80条事件返回了一个json格式的数据 不知道干嘛的 先保存下来吧

输入账号密码

在Fiddler中出现了一条post数据

点一下WebForms看看带了什么数据进去

Body

Value

time

time库里的time~

csrftioken

不知道什么东西 怎么没出现过

yhm

用户名是明文唉 大家心知肚明就好了

mm

这个就是输入的密码了 一看就经过了加密

什么??加密过了??那是怎么加密的呢

在主页面经过审查元素发现了js的文件

啊~在login.js里面 找到了这些代码

$.getJSON(_path+"/xtgl/login_getPublicKey.html?time="+new Date().getTime(),function(data){

modulus = data["modulus"];

exponent = data["exponent"];

});

------我是分割符------

var rsaKey = new RSAKey();

rsaKey.setPublic(b64tohex(modulus), b64tohex(exponent));

var enPassword = hex2b64(rsaKey.encrypt($("#mm").val()));

$("#mm").val(enPassword);

$("#hidMm").val(enPassword);

大概翻译一下就是

获取了publishkey之后使用publishkey对明文的密码做RSA算法加密再使用BASE64填充

升级了系统不就是不用验证码了吗 为什么做爬虫更累了呢

总结一下

保存PublishKey

对密码进行加密

获取csrftoken

登陆!

代码实现(登陆)

首先准备一个session(会话)

session = requests.Session()

time_now = int(time.time())

session.headers.update({

'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',

'X-Requested-With': 'XMLHttpRequest',

'Connection': 'keep-alive',

'Content-Length': '0',

'Content-Type': 'application/x-www-form-urlencoded',

'Host': 'qjxyjw.hznu.edu.cn',

'Referer': 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/index_initMenu.html?jsdm=&_t=' + str(time_now),

'Upgrade-Insecure-Requests': '1'

})

至于这个头是怎么来的 详情Fiddler

# 准备publickey

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/login_getPublicKey.html?time=' + str(time_now)

r = session.get(url)

publickey = r.json()

提一下这个csrftoken 找来找去最后在访问主页面的时候找到了

# 准备csrftoken

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t=' + str(time_now)

r = session.get(url)

r.encoding = r.apparent_encoding

soup = BeautifulSoup(r.text, 'html.parser')

csrftoken = soup.find('input', attrs={'id': 'csrftoken'}).attrs['value']

说一下这个加密 虽然github上面有大佬从js里面移植过来的rsa算法 但是我无论如何都用不来

只好用别人的java程序 在python里面使用txt对密码传输(虽然很low但是是无奈之举了)

url = r"C:\Users\Administrator\Desktop\new_jiaowu"

f = open(url + r"\code.txt", "w")

f.write(studentid + '\n')

f.write(studentpwd + '\n')

f.write(publickey['modulus'] + '\n')

f.write(publickey['exponent'] + '\n')

f.close()

try:

subprocess.Popen('code.exe', shell=False, close_fds=True)

except:

print("启动加密程序错误")

sys.exit()

time.sleep(1)

with open(url + r"\encode.txt", 'r') as f:

list1 = f.readlines()

for i in range(0, len(list1)):

list1[i] = list1[i].rstrip('\n')

id = list1[0]

rsacode = list1[1]

f.close()

if id != studentid:

print("RSA加密错误...等待调试")

sys.exit()

对应的java代码在笔记本里 给个空位=。=

等待更新

嘿嘿嘿东西都准备好了 尝试登陆吧

try:

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/login_slogin.html'

data = {

'csrftoken': csrftoken,

'mm': rsacode,

'mm': rsacode,

'yhm': studentid

}

result = session.post(url, data=data)

return result.text

except Exception as e:

print(e)

如果密码输入错误的话会有提示框 这里使用in就可以简单的实现判断了

if '用户名或密码不正确' in result.text:

return "用户名或密码不正确"

最后 封装一下 就实现了主页面登陆的按钮啦

贴个代码

def login(studentid, studentpwd, session):

time_now = int(time.time())

# 准备publickey

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/login_getPublicKey.html?time=' + str(time_now)

r = session.get(url)

publickey = r.json()

# 准备csrftoken

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/login_slogin.html?language=zh_CN&_t=' + str(time_now)

r = session.get(url)

r.encoding = r.apparent_encoding

soup = BeautifulSoup(r.text, 'html.parser')

csrftoken = soup.find('input', attrs={'id': 'csrftoken'}).attrs['value']

# 加密密码

url = r"C:\Users\Administrator\Desktop\new_jiaowu"

f = open(url + r"\code.txt", "w")

f.write(studentid + '\n')

f.write(studentpwd + '\n')

f.write(publickey['modulus'] + '\n')

f.write(publickey['exponent'] + '\n')

f.close()

try:

subprocess.Popen('code.exe', shell=False, close_fds=True)

except:

print("启动加密程序错误")

sys.exit()

time.sleep(1)

with open(url + r"\encode.txt", 'r') as f:

list1 = f.readlines()

for i in range(0, len(list1)):

list1[i] = list1[i].rstrip('\n')

id = list1[0]

rsacode = list1[1]

f.close()

if id != studentid:

print("RSA加密错误...等待调试")

sys.exit()

# 单击登录按钮

try:

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/xtgl/login_slogin.html'

data = {

'csrftoken': csrftoken,

'mm': rsacode,

'mm': rsacode,

'yhm': studentid

}

result = session.post(url, data=data)

return result.text

except Exception as e:

print(e)

模拟获取成绩

老样子 我们先模拟登陆使用Fiddler看看是怎么一个过程

这里可以一次性查询所有成绩有一点点方便

铛铛 在Fiddler中发现了如下数据

Body

Value

xnm

学年名

xqm

学期名

_search

固定false

nd

这个和之前的time一样的啦 都是time库里面的time函数整数化一下就好了

query*

固定的 照抄照抄

time

固定0(总觉得这个的存在是正方有点问题)

还是提一下这里学期名 发现第一学期发送的是3 第二学期发送的是12

代码实现(获取成绩)

def score_page(session, year, term):

url = 'http://qjxyjw.hznu.edu.cn/jwglxt/cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005'

# 定义所有学期 3为第一学期 12为第二学期

if term == "1":

term = "3"

elif term == "2":

term = "12"

try:

data = {'_search': 'false',

'nd': int(time.time()),

'queryModel.currentPage': '1',

'queryModel.showCount': '15',

'queryModel.sortName': '',

'queryModel.sortOrder': 'asc',

'time': '0',

'xnm': year,

'xqm': term

}

result = session.post(url, data=data)

result = result.json()

return result

except:

return '[Error]获取该学期成绩失败'

解析成绩

既然成绩我们都获取到啦 还很方便给的是json数据 so 你懂了吗

stu_name = result['items'][0]['xm']

sch_stu = result['items'][0]['xslb']

institute = result['items'][0]['jgmc']

stu_class = result['items'][0]['bj']

print('姓名:{}\t学历:{}\t\t学院:{}\t班级:{}'.format(stu_name, sch_stu, institute, stu_class))

# dt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

plt = '{0:{4}<15}\t{1:{4}<6}\t{2:{4}<6}\t{3:{4}<4}'

for i in result['items']:

print(plt.format(i['kcmc'], i['bfzcj'], i['jd'], i['jsxm'], chr(12288)))

# sql.insert_score(studentid, year, term, i['kcmc'], i['bfzcj'], i['jd'], i['jsxm'], dt)

因为后面我做好了和sql数据库的写入 作为演示 我都注释掉啦

测试(完成图)

嗝。。因为加密密码的环境问题 之后用笔记本再贴进来啦 给个空位=。=

(我是图片)

作者的话

为了这个程序真的是心力憔悴(写博客的格式更累)

但是还是结束啦~

希望能帮助到学习爬虫的各位~

python实现高校教务管理系统_Python实现新版正方教务系统爬虫相关推荐

  1. python输入学号返回成绩_Python模拟登陆正方教务系统并抓取成绩单

    学校的教务系统是正方的,在大学期间无论是选课.报名还是查成绩,几乎都要和它打交道,上学期在积累了一定的爬虫和web知识后,我就想着用Python模拟登陆教务系统,实现在命令行里方便地进行成绩或课表的查 ...

  2. 新版正方教务管理系统API(获取课程表,考试,成绩,通知,自动抢课等)

    一个有关新版正方教务管理系统(如下图展示的主页面即为新版教务系统)的API,可以实现教务系统内基础的查询功能,未来还会添加选课抢课,一键评价等功能. 已实现与待实现 自动登陆.cookies获取 个人 ...

  3. 新版正方教务网模拟登录python实现

    新版正方教务网模拟登录 前言 正好大学期末考完,分析一下正方教务网登录,实现模拟登录就可以自己实现抢课和查询成绩等常规操作了 申明 本文以我学校的正方教务网为例,关键信息已打码,理论上适用于所有新版正 ...

  4. 教务系统自动评教_新版正方教务管理系统自动评教脚本

    本脚本适用于新版正方教务管理系统学生评教页面. 使用注意: 1,本脚本必须在Chrome内核浏览器使用,其余内核(IE,Edge等)无法使用! 2,如果您使用的是360浏览器/QQ浏览器/百度浏览器等 ...

  5. 模拟登陆新版正方教务管理系统【可以获取学生基本/课表信息】

    写在前面 博主登陆现在还可以正常使用,但是后面登陆成功,获取信息啥的有问题 登陆还是按照学长的来,模拟登陆新版正方教务管理系统 开始 学校教务系统改版,我直接copy博主代码获取学籍那里一直是获取到的 ...

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

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

  7. 使用 PyRsa 库解决新版正方教务的 RSA 加密问题并模拟登陆的 Python 实现

    前言 先前有一个契机,需要模拟登陆学校所使用的正方教务来获取课程表,其所使用的 RSA 加密方法没有现成的 Python 库可使用,目前其他的 CSDN 博客所采用的方法均无法成功登陆,故只能自己研究 ...

  8. Python实现新版正方教务系统爬虫(二)

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

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

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

最新文章

  1. mysql 隔离级别和锁相关
  2. Python 是怎么火起来的? 转载 2018年01月12日 00:00:00 133 图:Python 之父 Guido 正在设计 Python 语言,结果家里突然潜入一条大蟒蛇,一番激烈斗争,大
  3. Golang之错误处理
  4. python编程输入图形_python编程,输入一个字符,用该字符输出一下图形,是一个数字6,用*表示6...
  5. 《Linux内核设计与实现》读书笔记(十)- 内核同步方法
  6. 计算机网络第2章(物理层)
  7. 在windows server 2008 R2上安装Bing Bar
  8. 未预期的符号 `( 附近有语法错误_苹果iOS 14.2现在提供117种新的表情符号和新的壁纸...
  9. 给大家推荐一些深度学习资源
  10. mac perl dbd mysql_Install DBD::mysql for Perl in XAMPP in Mac , solving errors
  11. 2014年计算机应用文摘,2014年江西信息技术高考试卷Word版
  12. 20172304 2017-2018-2 《程序设计与数据结构》第五周学习总结
  13. 信号与系统实验八 音频信号的时域、频域观测分析与图像的幅频相频重构
  14. 嵌入式和单片机的区别在哪?
  15. 永久删除计算机文件怎么操作步骤,如何彻底删除电脑中的文件 永久删除文件方法...
  16. Zblog模板调用标签情况说明
  17. kafka topic acl授权
  18. 关于心理学书籍的一份书目
  19. 感悟和体会数据结构和算法
  20. 如何在Android TV 桌面添加自定义频道/节目

热门文章

  1. 得到网页的最新更新时间
  2. 干货:服务器网卡组技术原理与实践
  3. 一道CF送命题引发的博文
  4. 解决:微信小程序+Vant——使用van-grid以及van-card图片加载不出来的问题
  5. “泰迪杯”挑战赛 - 通过Java实现中央空调系统的数据分析与控制策略
  6. Macbook Air安装Win7与苹果双系统实操
  7. 经纬度与距离的换算关系
  8. 看图说话之网络2008
  9. win10无法更新计算机的启动配置,电脑升级win10后一开机关机总是显示正在配置更新请不要关闭您的计算机...
  10. 如何给电脑系统重置系统?方法其实很简单