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