HTTP,说白了就是用Post,Get获取信息。选课,咱们得先登录学校的教务系统啊,所以用谷歌浏览器观察当我们登录教务系统的时候,网页干了什么。在登录页面,按F12,打开开发者工具,假装登录一下。
我们发现当我们登录的时候,网页带着数据Post了一下,我们只要模仿这个Post,就可以登录啦,是不是特别简单。
但是我们发现,有验证码啊,这个就是用来鉴别登录的用户是人还是机器人。这个识别验证码,大家可以用python的图像处理的一些第三方处理试试,我是直接把图片提取出来,然后人工输入的。
也就是说,我们获取了验证码后,再把账号,密码,验证码给Post上去。一来一去,我们就访问了两次服务器,但是我们得让服务器知道这两次访问都是来自同一个ip的,否则验证码就变了,我们也就不能成功Post了。这个时候,cookies就帮了大忙,她可以帮助我们使得两次访问是同一个会话,怎么保持cookies,Python的第三方库requerts可就十分强大了,session = requests.session(),就可以帮助我们建立一个会话,保持会话信息。
好了,废话不多说了,直接上。
我用的Python3.5,一开始用的Python3.6,可是不能打包成exe文件,就退回了Pyhton3.5。编辑器用的Pycharm,个人观点这是一款非常棒的编辑器。
首先,安装需要的第三方库。BeautifulSoup(和正则一起用,还不是爽歪歪)、requests(让HTTP服务于人类)和PIL(图像处理的一个第三方,我用它把扒取的验证码打开,然后人工输入)。如果你安装的Python3,也就自动安装了pip(用pip不是更简单吗?)
三个第三方的pip下载方法:pip install beautifulsoup4
pip install requests
pip install Pillow
以我们学校的教务系统为例。打开开发者工具,点击Network,然后账号,密码,验证码瞎打点登录,就会在右边看见在登录的时候发生了什么。 找到一个跟登录有关的.do文件,选择headers,会看到她往一个网址(Request URL,这个url暂定义为post_url)post了一下,请求表头(Requests Headers)也在这里,里面就有咱需要的cookies,需要关注一点Referer,这里必须从Referer一栏的网址跳到这里才行。大家可以先试下不跳会怎么样,因为每个教务系统都是不一样的,不需要跳转的,就直接Post就好了。
下拉会看到在Post的数据,分别是账号,密码,验证码,其他的可能会有别的参数,应该只有 这三个是变得。我只需要在Post的时候将数据也带上就行了。不得不说,Python3的第三方库requests实在强大,甚至暴力,又有点小清新
。 点击Preview,然后挨个选择Name下的文件,找到出现验证码的一个。像下图。
再点回Headers可以看到登录的时候验证码是怎么来的,Requests URL就是我们要获取验证码而Get的url,只取红线的部分(暂定义为yzm_url)即可,后面就是唬人的。在表头那块我们可以看到Referer是loginAction.do的url。
所以思路就来了,我们可以先访问post_url,拿到cookies后,利用session保持会话,访问yzm_url,获得验证码后,再将账号、密码和验证码Post到post_url。至此我们就可以模拟登陆教务系统了。
下面直接贴核心代码了(支持开源)
1 | session = requests.session() # 建立会话,保持会话信息,cookies |
<font face = "宋体" size = 4> 我们成功模拟登陆教务系统后,就可以做一些我我们想做的事情了,例如抢课。模拟登陆搞明白了,抢课也就很简单了,就是Get或者Post的而已,我浪费了很多时间和代码在处理文本信息上。因为每个学校的教务系统不一样,所以就不贴代码了。