用Python做有趣的事儿——模拟登陆学校教务系统
2017-08-29 21:43
459 查看
电赛结束后,好好休息了几天,心里有痒了起来,好久没动过Python了,上次动她已经是4月份左右,因为参加一个互联网+的比赛,用python写了一个微信公众号的后台(改天有空也更上来,呵呵,只怕是猴年马月了,没办法,我就是一个懒bi)。
——————————————————————————————————
这一篇先写下,用python做模拟登陆教务系统。
HTTP,说白了就是用Post,Get获取信息。选课,咱们得先登录学校的教务系统啊,所以用谷歌浏览器观察当我们登录教务系统的时候,网页干了什么。在登录页面,按F12,打开开发者工具,然后账号随便输入,密码您也freestyle,验证码我觉得可以。
我们发现当我们登录的时候,网页带着数据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。至此我们就可以模拟登陆教务系统了。
下面直接贴核心代码了(支持开源)
我们成功模拟登陆教务系统后,就可以做一些我我们想做的事情了,例如抢课。模拟登陆搞明白了,抢课也就很简单了,就是Get或者Post的而已,我浪费了很多时间和代码在处理文本信息上。因为每个学校的教务系统不一样,所以就不贴代码了。
——————————————————————————————————
这一篇先写下,用python做模拟登陆教务系统。
HTTP,说白了就是用Post,Get获取信息。选课,咱们得先登录学校的教务系统啊,所以用谷歌浏览器观察当我们登录教务系统的时候,网页干了什么。在登录页面,按F12,打开开发者工具,然后账号随便输入,密码您也freestyle,验证码我觉得可以。
我们发现当我们登录的时候,网页带着数据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。至此我们就可以模拟登陆教务系统了。
下面直接贴核心代码了(支持开源)
session = requests.session() # 建立会话,保持会话信息,cookies r = session.get(post_url) cookies = r.headers['Set-Cookie'] # 获取cookies cookies = cookies.strip('; path=/') # 删除指定字符,这里是由于 我学 #校的教务系统在cookies加了干扰数据。 yam_headers = { 'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Connection': 'keep-alive', 'Cookie': cookies, 'Host': '************' 'Referer':'*************' 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36' } #这是获取验证码的表头,这里的链接通google浏览器的开发者工具,按照前面说的去找。 yamdata = session.get(yzm_url, headers=yam_headers) # 获取验证码 tempIm = BytesIO(yamdata.content) # 将数据流放入tempIm以字节的形式 im = Image.open(tempIm) # 转换为图片的形式 im.show() # 展示验证码 Code = input('Please Enter Code:') logindata['v_yzm'] = Code login_headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.8', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Content-Length': '37', 'Content-Type': 'application/x-www-form-urlencoded', 'Cookie': '', 'Host': '***********' 'Origin': '*********' 'Referer': '***********' 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36' } login_headers['Cookie'] = cookies d = session.post(post_url, data=logindata, headers=login_headers)#将账号,密码,验证码和表头Post上去,然后我们可以用过BeautifulSoup或者正则表达式,抓取d.text有用的信息,判断是否登录成功。
我们成功模拟登陆教务系统后,就可以做一些我我们想做的事情了,例如抢课。模拟登陆搞明白了,抢课也就很简单了,就是Get或者Post的而已,我浪费了很多时间和代码在处理文本信息上。因为每个学校的教务系统不一样,所以就不贴代码了。
相关文章推荐
- 利用Python requests库模拟登陆学校教务系统
- 利用python3.4爬取学校教务系统,并封装成api供app调用(二)之不带验证码模拟登录
- Python正方教务系统模拟登陆爬取教务信息
- python 爬虫登陆学校教务系统
- Python项目模拟登录学校正方教务系统抓取课程表。
- python 爬虫登陆学校教务系统之验证码识别
- 用python做有趣的事儿——模拟登陆知乎
- Python 模拟登陆教务选课系统
- python 爬虫实战--登陆学校教务系统获取成绩信息
- python爬虫——模拟登陆教务系统
- 左手用R右手Python系列——模拟登陆教务系统
- PHP的curl带验证码模拟登陆学校的教务系统(验证码已被自动识别,不需要输入)
- python 爬虫登陆学校教务系统之HTML解析
- python 爬虫 教务系统模拟登陆 并下载课表
- 使用Httpclient模拟登陆正方软件股份有限公司开发的教务管理系统
- python爬虫实战之模拟正方教务系统登录查询成绩
- 强智教务系统模拟登陆经验【附源码】
- Python爬虫实战——模拟登录教务系统
- 关于Android端模拟登陆教务系统
- Android模拟登陆综合教务系统客户端(java)-jsoup解析数据