python爬虫学校正方教务系统获取全部成绩

python爬虫正方教务系统许昌学院
来自许昌学院的大四小菜鸡,疫情封在宿舍,闲来无事在宿舍爬了一下之前没成功的教务系统爬虫,当时觉得挺难的,今天发现这个还是挺简单的,这个程序参考了很多前辈大佬们的程序和思路,我也给代码发出来方便各位拿来学习交流,有什么不懂的地方欢迎在评论区留言,看到留言我会第一时间回复

爬取数据流程

1.找到目标网站

我们学校用的是新版正方教务系统,长这个样子,相信也有不少同学学校用的同款的教务系统,一到选课贼卡,还老是挂(吐槽一下)

在这里插入图片描述

2.抓包接口

网页抓包相信很多童鞋是会的,这里我用浏览器自带的抓包工具,我用的是win10自带的Edge
F12打开浏览器开发者工具,点击网络,先输入一个错的账号密码,查看抓包情况
在这里插入图片描述
可以看到有一个post请求,点开查看
在这里插入图片描述
这不就是用户名还有加密后的密码吗??,再通过接口名也不难看出,这是一个接口
那这个密码应该怎么加密呢?
我们再js代码里面找找
在这里插入图片描述
看这里引入的加密库,是rsa加密,那么现在我们要做的就是获取公钥,对密码进行加密.

还是刚刚抓到的接口,里面有一个链接:
在这里插入图片描述在这里插入图片描述

3.登录参数分析

有了这个公钥接口,我们就能对密码进行加密了,不过在写程序的时候发现一个坑.就是那个exponent好像并没什么用,我也不知道咋回事,反正参考了前辈的代码发现并没用上,而且他也在这个地方被坑住了.
有了这些,登录需要提交的参数我们都已经知道三个了,分别是language(语言),yhm(用户名),mm(加密后的密码),还差一个csrftoken,这个参数在哪里找呢?

别急,这个参数也很简单,右键打开网页源码 CTRL+F搜索csrftoken,会发现原来这个参数就在登录主页里面
在这里插入图片描述

4.程序流程思路分析

1.创建一个13位时间戳方便后续使用
2.创建一个session会话
3.添加访问教务系统必要的header请求头
4.获取公钥
5.通过公钥对明文的密码进行加密
6.获取csrftoken
7.通过session.post进行登录

经过以上步骤,我们拿到的session对话就获取了访问成绩接口的权限,理论上就可以为所欲为了,比方说可以做一个查成绩的小网站,抢课小程序什么的.

编写代码

到此为止,我们需要的参数已经全部找到,程序思路也分析完,接下来就是写代码环节

5.程序代码

#获取公钥https://jwglxt.xcu.edu.cn/jwglxt/xtgl/login_getPublicKey.html?time=1669947527543
#登录接口https://jwglxt.xcu.edu.cn/jwglxt/xtgl/login_slogin.html?time=1669947499740
import requests
import re
import time
import binascii
import rsa
#密码加秘密函数
def get_encrypted_password(pw,m):
    weibo_rsa_e = 65537
    message = str(pw).encode()
    rsa_n = binascii.b2a_hex(binascii.a2b_base64(m))
    key = rsa.PublicKey(int(rsa_n, 16),weibo_rsa_e)
    encropy_pwd = rsa.encrypt(message, key)
    the_enpassword = binascii.b2a_base64(encropy_pwd)
    return the_enpassword
pass

username = '学号'
password = '密码'
#获取当前13位时间戳
t=str(int(time.time()*1000))
#创建session会话
session=requests.session()
#设置请求头
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': 'jwglxt.xcu.edu.cn',
	'Referer': 'http://jwglxt.xcu.edu.cn/jwglxt/xtgl/index_initMenu.html?jsdm=&_t=' + t,
	'Upgrade-Insecure-Requests': '1'
})
#获取公钥
publicKey_url='https://jwglxt.xcu.edu.cn/jwglxt/xtgl/login_getPublicKey.html?time='+t
r=session.get(publicKey_url)
publicKey=r.json()
#对密码进行加密
enPassword = get_encrypted_password(password,publicKey['modulus'])
#获取csrftoken
loginPage_url='https://jwglxt.xcu.edu.cn/jwglxt/xtgl/login_slogin.html?time='+t
loginPage=session.get(loginPage_url)
loginPage.encoding = 'utf-8'
csrftoken = re.search('name="csrftoken" value="(.*?)"', loginPage.text).group(1)
#登录信息
LoginData={
    'csrftoken': csrftoken,
    'language': 'zh_CN',
    'yhm':username,
    'mm': enPassword,
    'mm': enPassword
}
#登录
res=session.post('https://jwglxt.xcu.edu.cn/jwglxt/xtgl/login_slogin.html?time='+t,LoginData)
print("============================================================================")
if re.findall('用户名或密码不正确',res.text):
    print('用户名或密码错误,请查验..')
else:
    print("登陆成功")
pass
#查询全部成绩
cj=session.post('https://jwglxt.xcu.edu.cn/jwglxt/cjcx/cjcx_cxXsgrcj.html?doType=query&gnmkdm=N305005&su='+username,
{
    'xnm': '',
    'xqm': '',
    '_search': 'false',
    'nd':t,
    'queryModel.showCount': 15,
    'queryModel.currentPage': 1,
    'queryModel.sortName':None,
    'queryModel.sortOrder': 'asc',
    'time': 5
})
cjj=cj.json()
print(cjj)
#关闭会话
session.close()
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YY博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值