去应聘学校电教,为了提高我的成功率(电教组要求为了排班每个专业最多两个,且总共就10个,还有工资,竞争压力很大(
虽然和我无关),开始在群里吹水:
吹完之前写的Zhixue-K(Zhixue-K是PHP写的,Python写的是暂未发布的Zhixue-X),有学长发现了摸鱼的好机会学长说是为了方便大一学弟那就是吧:
第二天去现场,我被学长叫上去问我可不可行,我按了F12随便霍霍两下(话说居然是旧版edge诶)说可以,然后!然后!
然后!
我就被破格录了!面试都省了……(
以至于他们面试问了啥我都不知道,有的人还以为我是学长然后学长跑了,叫我坐在上面组织面试,美名其曰【你已经是我们的成员了,来帮帮忙很正常对吧~】 ……
当然我总不能干坐在哪里等到谁就叫谁,毕竟我有任务是吧(
电脑拿出来干
打开教务系统长这样
在我写这个爬虫之前,学长学姐们是这么抄表的:
有个表格,先把日期调到今天,然后调取1-2节数据,将有课的教室在表格上打个勾(教室是不按规则排的,也就是说学长学姐们可能要找半天),然后调取3-4节、5-6节、7-8节、9-11节……一直重复这样的工作。
然后他们根据这个表格在每天上课和下课的时候远程开关电脑和教室电源。 而我这个爬虫就是为了节省这种机械工作的时间。
调出F12开发者工具抓包,包长这样:
通过浏览器直接访问,输出的是XML……
XML???好好的JSON哪里去了?
再回来看包,发现HTTP请求头里有这么个玩意:
把cookie原样搬到Postman上,成功输出:
既然主要接口成功输出了,那么接下来就是用户登录的问题。
登录界面抓包如下:
登录过程中使用了令牌,且密码加密混淆过。
而且这个登录包比较奇葩,正常的POST包在F12开发者工具中格式为:参数名称: 参数内容
而这玩意是一整串json数据。
这种包的内容需要在Postman的Body选项卡中填写,可能需要设置HTTP头Content-Type
为application/json
。
翻找登录按钮JavaScript代码,找到密码规则:encryptPassword = new String(CryptoJS.SHA1(salt + '-' + $("#p").val())) + "";
即将“salt-密码”的SHA1值。
同时这意味着系统将密码明文保存于数据库中,而非常用的MD5+SHA1不可逆方式保存,否则系统无法验证密码正确性,即校方或黑客可轻易获取密码原文。
Postman检验通过。
获得需要的接口以后,接下来就是正片——爬虫的编写。
由于使用了sha1,需要引用hashlib的sha1库;
由于需要获取当日时间以下载当日课表,需要time库;
由于使用json获取数据,需要json库;
由于是爬虫,那么requests库是少不了的。
from hashlib import sha1
import json, requests, time
和平常不同的是,登录包的json数据需要放在requests.post的data参数中,而不是params参数。
几番循环,就将当日的教室占用情况以教学楼——课时——教室的树状结构保存下来。
将输出结果给学长看,学长认为这不够直观,希望能够导出为Excel。
纯程序写Excel是不可能的,这玩意烧脑。
当初用PHP的PHPSpreadSheet写Zhixue-K的成绩导出都够呛。
最后我从学长那把原来的表格拿了过来,将各个教室/课时的表格坐标一个个输入,这样的话就可以直接编辑,不用考虑表格的格式问题。
我使用的Excel库是xlutils,没有安装的同学可以使用pip安装:pip install xlutils
安装时会自动安装依赖的xlrd(Excel读库)和xlwt(Excel写库)
之后遍历之前的树状结构,将数据写入表格,大功告成。
(顺便,我不是强者,我是废物)
部分程序我会发布在GitHub上,发上去之后如果对你有帮助,劳烦给个Star呢~么么哒~
除声明外inSoraSky博客(http://www.sorasky.in/)所有内容均为本人所原创,转载时请注明来源!