Python爬虫爬取中国海洋大学教务系统课表
Python爬虫爬取中国海洋大学教务系统课表
Python环境配置
- 首先需要requests包进行爬虫代码的编写
pip install requests
- 由于教务系统登录时使用了rsa非对称加密,所以需要导入包
pip install pycryptodome
到现在就可以编写程序了
通过抓包工具获得整个登录流程
可以用浏览器自带的,也可以用Charles等
看起来还是比较让人头大的,基本思路是将上面的关键步骤利用爬虫进行模拟
首先来看登录的基本流程
这里是第一个URL: http://id.ouc.edu.cn:8071/sso/ssoLogin
出于保密我并没有完全截取密码部分
我这里先列举一个111加密出来的密码
XPhhrlYF2nV7N0ufUDKDFDKozbQcTF1wJkt5eQH3UvdBSPiMi8fnEYybx4doBPAAdIfrVRQOC0WwWlh8ijVvikmZw2hpknSK/sF9lZWV3melQXJ/h1nKZfps1RqW0insN6dcKXh7aC4IYYA2j0biLEBwdQXMTAWwHle1lWYMQH0=
这一串非常长的密文(后边带着一个等号)采用的是rsa非对称加密
具体细节可以参考下面这篇文章
具体代码在程序中实现如下:
1 | #登录密码的加密 |
这里面需要的公钥key可以用抓包工具在文件中找,还是比较好找的,我这里就不公布了。
注意
为了保留cookie,这里使用Session()实例化对象session,以下网络请求均使用session
下面是一个post请求:http://id.ouc.edu.cn:8071/sso/login?service=http%3A%2F%2Fmy.ouc.edu.cn%2Fuser%2FsimpleSSOLogin
携带的参数有四个分别是:
1 | data = { |
这里的password采用的是base64加密,需要对应的改一下,下面的lt参数对应请求次数,第一次为e1s1第二次为e2s1(好像是我忘记了)总之,不用动。_eventId也不用动。
下面是GET请求, 状态码302: http://my.ouc.edu.cn/user/simpleSSOLogin?ticket=ST-1491796-v5cKNr4iKrVURebiWIPZ-UIA
当然映入眼帘的最吸引人之处就是这个参数ticket了,怎么来的腻?
答案在上一条请求的响应头中,响应头的location中表明了这个URL,也就是要重定向到的地址,可是当我们尝试去获取这个location的时候出了点问题,我们并没有得到想要的这个URL,而是得到了一个这样的http://id.ouc.edu.cn:8071/sso/login;jsessionid=B5CD01DCF93BC023F72EA52E72AD0CB7?service=http%3A%2F%2Fmy.ouc.edu.cn%2Fuser%2FsimpleSSOLogin
这一步不可以跳过直接访问下一条语句
所以我们通过page = session.post(url=page.url, headers=headers, data=data)
按照和刚才一样的方式再访问一般这个URL,这次就可以执行下一条URL请求了。
GET请求:http://my.ouc.edu.cn/web/guest
这样就登录到信息门户了
接下来便是我的课表方案一:
因为教务系统里面有两个样式的课表,分别在不同的地方
POST请求:http://jwgl.ouc.edu.cn/login
登录教务系统
POST请求:http://jwgl.ouc.edu.cn/frame/desk/showLessonScheduleDetailJson.action
得到课表一:
大概样式是这样的
课表方案二
1 | headers = { |
这里我踩过的坑就是请求头一定要写全,只使用UA伪装是行不通的(泪的教训)
尤其是Referer不能少
这次得到的样式是这样的:
两者显示的信息各有不同
课表方案三
就是我们的教务系统自带的二维表
只需要改一下URL就可以了
1 | page = session.get(url="http://jwgl.ouc.edu.cn/student/wsxk.xskcb.jsp", params=params, headers=headers) |
这样你就可以得到这样的课表
整体代码多少给一下:
1 | import base64 |
不要直接CV大法,如果你是中国海洋大学的学弟,欢迎加入爱特工作室。
如果你已经是爱特的了,欢迎加入程序部。
如果你已经是程序部的了,那你就不要在看了,有些事情要自己发掘才有意思。