没爬过自己学校教务网站怎么能说自己会敲爬虫 : )
在此记录模拟登录cumt教务系统
P.s Markdown学习中....没找到在哪里能插入代码...所以代码都是图片形式,在后面附上github地址
正文开始
教务系统网址
![](https://img.haomeiwen.com/i11356161/6208a857aaba9728.png)
和许多学校相同,都是正方教务系统(ummm正方和煎蛋难兄难弟)
查看源代码
![](https://img.haomeiwen.com/i11356161/ca74d528df64b6ec.png)
可以看到由五个js进行登录加密,为RSA加密,不了解rsa的看这里:RSA加密
提交表单
![](https://img.haomeiwen.com/i11356161/9adc7dac5ae6735e.png)
post的数据包括csrf令牌以及明文的yhm(即学号,我随便敲的),和base64加密的mm(提交了两次),即密码
csrftoken
用来防止跨站请求伪造
源代码中搜索,找到随机生成的token表单value
![](https://img.haomeiwen.com/i11356161/757bfc9d63e2d989.png)
登录加密
![](https://img.haomeiwen.com/i11356161/5df3d30dc1664490.png)
查看login.js
找到获取公钥私钥的地址
![](https://img.haomeiwen.com/i11356161/8a7333209254b4fd.png)
cookies问题
使用requests库的requests.session()保持会话即可
登录逻辑:从登录页面获取csrftoken,请求login_getpublickey.html提交时间参数获取rsa密钥,对获取到的密钥base64解密,用密钥对登录密码进行rsa加密,对密文再进行base64加密,最后post
rsa加密是最麻烦的地方
此处参考stackoverflow文章戳我
代码
![](https://img.haomeiwen.com/i11356161/7b56168c8883e0fc.png)
![](https://img.haomeiwen.com/i11356161/c822f752ba23ee5a.png)
放上代码地址,使用时导入login.py,调用httpmthd类即可
此处的requests库会有一个编码问题,按报错把库文件代码里某处的'latin1'改为'utf-8'就可以解决
模拟登录后顺便做了成绩获取
![](https://img.haomeiwen.com/i11356161/e6c1f2275d95ee44.png)
打算有时间了敲一个多线程暴力抢课脚本,但是很狗的是,敲完程序测试的机会就只有学期末抢课那几天,这学期敲好调试好要等到过一学期才能拿来用 ( :
![](https://img.haomeiwen.com/i11356161/c88a2b2117a5fab6.jpg)
好了不管这些,反正模拟登录成功后就可以为所欲为了
![](https://img.haomeiwen.com/i11356161/0a8507cde14bfdc9.png)
selenium脚本
![](https://img.haomeiwen.com/i11356161/7898c75ede85c5ca.gif)
除了利用RSA加密密码外,还可以使用selenium直接提交表单
![](https://img.haomeiwen.com/i11356161/472e9d1d7aa98aee.png)
缺点是button的click()有几率失效,网上有解决办法,不多讨论
P.s在此强烈谴责selenium喜新厌旧的行为!!!居然抛弃了PhantomJS转投火狐和chrome的无头版本,然而火狐无头实例化耗时比phantom多了不少
而且既然不支持phantom,为啥库文件里还是有phantom的包,直到运行的时候才报错说phantom已经过时了,请使用火狐或谷歌...莫名其妙.jpg
![](https://img.haomeiwen.com/i11356161/d752e3235a60d11c.png)
更多思路
还可以node.js本地运行js加密,或者提交到在线rsa加密网站
反正方法有很多,没有验证码也可以说对爬虫很友好了
![](https://img.haomeiwen.com/i11356161/3e0b4dcfe9cfd18d.png)
网友评论
"{0:{2}<2} {1:{2}<2}".format("a","b",chr(12288))