go语言爬取新版正方教务系统数据
学完go语言的基础之后已经过了一个多月了,开始想试着利用些时间写写博客,就打算将半个月前练着写的一个go爬虫小项目翻出来写写。由于之前对go爬虫的一些基础知识不熟悉,这个东西足足拖了半个多月才完成( ▼-▼ )
之前曾参考过一些其他博主写过的文章,在此附上链接:
模拟登陆新版正方教务管理系统(获取学籍信息、课表和成绩)
步骤
- 模拟登录并获取cookies
- 通过携带cookies去访问网页爬取数据
模拟登录
在开始敲码之前,需了解一下新版正方系统的登录流程,这就需要自己登录一遍并通过浏览器抓包分析。
以谷歌浏览器为例,通过抓包会发现:
在提交给主页的数据中有csrftoken,yhm,mm
而且待解决的还有302跳转(踩过的坑,后面会讲)和cookies(获取公钥和登录时需用到)
而csrftoken 可通过登录页面发现:
在通过获取登录界面取得csrftoken的值的同时,我们也顺便获取cookies
yhm为用户名
mm为密码,且很明显是经过加密的
在此目的就很明确了,我们要做的事就只有爬取登陆页面并获取csrftoken值和获取cookies
将我们的密码加密
而密码加密代码也可在抓取得js文件中发现:
通过上述代码,我们又可得出一些信息:
密码是通过RSA算法进行加密的,且加密所用到的方法都可在抓包时出现的js文件找到。
首先我们需要获取公钥,即图中的modulus和exponent变量
公钥:
如图所示是一个json类型的数据
关于密码的加密本人曾试着将相关的js文件拷贝下来,当成一个加密脚本来使用,结果不成功,最后直接模仿js文件的加密流程用go来复现。
相关的加密js文件:
分析完毕,让我们开始快乐的代码环节o( ̄▽ ̄)ブ
- 获取csrftoken和cookies
//设置请求
request, err := http.NewRequest("GET", url, nil)
checkError(err)
request.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0") //设置用户代理,伪装浏览器访问
resp, err := client.Do(request)
defer resp.Body.Close()
checkError(err)
//获取登录页以用正则表达式提取token
data, err := ioutil.ReadAll(resp.Body)
checkError(err)
//showResponseImformation("getCsrftoken.html", data, resp)
zz ,err := regexp.Compile(`<input type="hidden" id="csrftoken" name="csrftoken" value="(.+)"/>`)
checkError(err)
findArray := zz.FindStringSubmatch(string(data))
t.csrftoken = findArray