python+requests模拟登录 学校选课系统

最近学校让咱们选课,天天都有不一样的课须要选。。。。而后突发奇想试试用python爬学校选课系统的课程信息html

先把本身的浏览器缓存清空,而后在登录界面按f12 如图:python

 

 能够看到登录时候是须要验证码的,验证码图标打算用方法把它存在桌面,手动输入验证码。web

或者能够买一个自动输入验证码的平台1快钱能够帮自动识别100到200次验证码,若是这样作编程

大概过程就是:浏览器

1.找到自动输入验证码的平台缓存

2.阅读该平台的API或者手册服务器

3.用编程语言把验证码图片保存到本身电脑后根据平台格式要求打包,经过url发送过去cookie

4.用返回的数字输入到验证码窗口app

此次我就简单作一个须要本身手动输入验证码的模拟登录脚本算了编程语言

回到正题

因为我清除了缓存,因此如今至关于第一次登录,而后我没有登录而是直接点了f5刷新,浏览器捕捉到的这个请求

能够看到这个是get请求而且请求头是两个Cookie。

Cookie就是我这台电脑我惟一标识符,当我下次访问这个网页时候它会用这个东西来进一步作一下操做,好比:进一步验证个人身份或者能够利用Cookie无需帐号密码直接登录

这里有两个cookie测试看看需用哪一个 下面我再清一次缓存

 

 

 首先上面有两个cookie下面没 。下面是我这边发送给学校的http请求,当我再刷新一次时候

 

能够看到 下面箭头 发送给学校的http请求中多了一个cookie并且是最开始的set-cookie中的第二个,接着我再刷新一次

能够看到发给学校的cookie变成了上次的set-cooki。

那么能够看到图中的 http://xk.qhnu.edu.cn/xsxk/logout.xk 这个网址是用于生成和发送cookie码的

那么若是咱们不用浏览器登录改为用代码登录那么cookie应该是有用的,毕竟是用来标识我这台电脑的。

虽然不知道这个cookie码有没有用 先获取下来再说吧

这里须要用到python的request库

电脑安装好python后(在官网能够下载python并安装)

在配置好环境变量后能够输入win+r键 后输入cmd 调出cmd命令窗口

而后输入 pip install requests 后会自动安装requests库

接下来 咱们须要在桌面新建文件并把后缀名改为 .py

源代码以下:

1 import requests
2 
3 get_cookie_url='http://xk.qhnu.edu.cn/xsxk/logout.xk'
4 r = requests.get(get_cookie_url)
5 cookie=r.cookies.get_dict()
6 print(cookie)# 输出cookie

这里调用了requests的get方法,由于刚才看图片上的这个网址用的就是get请求

把结果保存在r里,而后用

.cookies.get_dict()获得cookie值

测试结果以下:

能够看到拿到了cookie码

:前面的是cookie ID 后面是cookie的值

登录

接下来使用抓包工具Wireshark 监听通过这个网页的流量,也能够用刚才的f12看 

输入帐号密码和验证码后点击登录 抓取到如下数据

登录的时候时候给 http://xk.qhnu.edu.cn/xsxk/loadData.xk(没有截图到,能够本身抓包看到) 这个网址发送了数据而且发送头包含cookie等信息

而且发送给这个网页用的方法是get(没有截图到,能够本身抓包看到)

发送的数据变量有

method

username

password

verifcode

那么后面三个就应该是帐号密码验证码了

经过上面提供的信息,咱们能够伪造一个发给这个网址的请求

代码以下

check_header={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
    'Host': 'xk.qhnu.edu.cn',
}
params={
    'method':'checkLogin',    
    'username':本身的学号,
    'password':本身的帐号,
}
check_url='http://xk.qhnu.edu.cn/xsxk/loadData.xk'

r = requests.get(check_url,params=params,cookies=cookie)
#cookie由以前的代码得到

可是能够看到咱们缺乏了一个verifcode变量用来存放所输入的正确验证码值,由于我还要想办法把验证码的图片保存到桌面,方便看到。

这里我用谷歌浏览器f12的定位功能定位到验证码图片,而且显示了相对应的html代码

 

 

从图中能够看到 这个验证码是由src中的网址生成的,并且d=后面是一串数字,当我再刷新时候这串数字也发生变化

看这串数字不难发现它是一串格林尼治时间,也就是说咱们要得到验证码就须要访问src中的网页,而且这个网址须要传递

一串数字,这串数字是格林尼治时间。我猜是为了作随机生成的吧

那么咱们用get方法来访问这个网址而且将访问的数据保存到桌面

代码:

1 import time
2 
3 jpg_url = 'http://xk.qhnu.edu.cn/xsxk/servlet/ImageServlet?d='+str(int(time.time())*1000)
4 
5 content = requests.get(jpg_url,cookies=cookie).content
6 with open('demo.jpg', 'wb') as fp:
7     fp.write(content)

运行后桌面生成了验证码的图片

在获取这个验证码以前我用抓包工具看了一下 往这个地址发送的数据中又包括了cookie,因此我加上cookie了

在不加cookie的话 就算获取到了验证码图片 在进行模拟登录时候根据桌面上的图登录老是验证码错误

在折腾了一段时间后发现验证码的生成会和个人cookie相关联,也就是说,验证码的生成不只用到格林尼治时间还用到个人cooki

并将验证码与个人cookie绑定,一一对应

而后经过

while(True):
    code = input('请输入验证码:')
    datacode= str(code)

    params['verifyCode']=datacode
    r = requests.get(check_url,params=params,cookies=cookie)
    if re.search('true',r.text):
        print ('验证码正确......')
        break
    else:
        print ('验证码错误,请从新输入......')
        
    
date['verifyCode']=datacode

将验证码加入到前面的date中,发送给/xsxk/loadData.xk,在发送成功后查看返回信息发现验会有true字符串或者false,那么我就能够利用这个来验证我是否是正确

这样用到的re库 须要导入

 

回到刚才的登录

继续看抓包的数据,发现了post方法,通常来讲post方法是真正的登录窗口

post方法前面的 get /xsxk/loadDate......  就是咱们前面实现的get,现应该实现post真正的登录了

在查看post发送的数据中包含了头信息,其中包括cookie 和帐号密码因此咱们用requests的post方法继续伪造请求

在post结束后学校服务器会返回一个302 found的http状态码 这表示浏览器将个人数据发送后,会从新跳转到另一个网页

不过requests是能够自动跳转的,不须要担忧

代码 

log_header={    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Origin':'http://xk.qhnu.edu.cn',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',        
    'Referer':'http://xk.qhnu.edu.cn/xsxk/logout.xk',
    'Accept-Encoding':'gzip, deflate',
    'Accept-Language':'zh-CN,zh;q=0.9',
    'Host': 'xk.qhnu.edu.cn',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1'
}
date={
'username':本身的学号,
'password':本身的密码,
}
log_url='http://xk.qhnu.edu.cn/xsxk/login.xk'

r=requests.post(log_url,data=date,headers=log_header,cookies=cookie)
#传递的参数cooki由以前的代码得到

其中的 date和log_header都是经过抓包看到的 这个网页须要哪些数据。

代码写好后 运行而且抓包发现 与用网页登录抓取的包大体相同,经过屡次修改能够总结以下

经过用网页登录抓包发现登录学校的网址有一下步骤

1.在清空缓存,刷新时(即第一次登录时),会先向xsxk/logout.xk发送cookie

2.在get验证码的所须要的数据中 经过抓包发现须要用到第一步的cookie

3.在登录前须要向xsxk/loadData.xk发送本身的帐号密码和验证码和cookie

4.登录时用的是post方法,而且还须要将本身的帐号密码和以前的验证码和cookie发送一次  若是没有完成第三步那么不管怎么登录都失败

完整代码以下

import time
import requests
import re
from bs4 import BeautifulSoup #获取解析网页的库

username=input("帐号")
password=input("密码")

get_cookie_url='http://xk.qhnu.edu.cn/xsxk/logout.xk'
jpg_url = 'http://xk.qhnu.edu.cn/xsxk/servlet/ImageServlet?d='+str(int(time.time())*1000)
check_url='http://xk.qhnu.edu.cn/xsxk/loadData.xk'
log_url='http://xk.qhnu.edu.cn/xsxk/login.xk'


get_cookie_header={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36'
}
check_header={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',
    'Host': 'xk.qhnu.edu.cn',
}
params={
    'method':'checkLogin',    
    'username':username,
    'password':password,
}
log_header={
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Origin':'http://xk.qhnu.edu.cn',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36',        
    'Referer':'http://xk.qhnu.edu.cn/xsxk/logout.xk',
    'Accept-Encoding':'gzip, deflate',
    'Accept-Language':'zh-CN,zh;q=0.9',
    'Host': 'xk.qhnu.edu.cn',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1'
}
date={
'username':username,
'password':password,
}


r = requests.get(get_cookie_url)
cookie=r.cookies.get_dict()
#print(cookie) 输出cookie

content = requests.get(jpg_url,cookies=cookie).content
with open('demo.jpg', 'wb') as fp:
    fp.write(content)

while(True):
    code = input('请输入验证码:')
    datacode= str(code)

    params['verifyCode']=datacode
    r = requests.get(check_url,params=params,cookies=cookie)
    if re.search('true',r.text):
        print ('验证码正确......')
        break
    else:
        print ('验证码错误,请从新输入......')
        
    
date['verifyCode']=datacode

r=requests.post(log_url,data=date,headers=log_header,cookies=cookie)
#print(r.text)得到网址的源代码


html=BeautifulSoup(r.text,'lxml')
tagList=html.find('b')

print('#############################################################')
print('进入选课系统成功:')
print(tagList.get_text())
print('#############################################################')

在这里用了另一个库 用于解析所获取的登录后网页源代码

总的来讲就是 先用浏览器和抓包工具,浏览器屡次登录,用抓包工具和浏览器的f12查看登录前经历了哪些步骤,哪些网页,每一个网页分别发送了哪些数据,用的是get方法仍是post方法

在知道后,用代码将所须要的数据写出来并保存后用requests库的get方法post方法模拟发送数据给学校服务器。最后得到登录后的网页源代码

 

不过。。。我在得到源代码后发现html中的iframe标签显示的是选课的内容,可是我用于分析网页代码的库是BeautifulSoup

它不支持分析iframe内容。。。白忙活了那么久。

经过在网上查找信息发现selenium这个库支持分析iframe标签的内容

因此接下来就去学习用这个库去获取学习的选课信息而且自动选课

下次就放用selenium作爬虫的过程

相关文章
相关标签/搜索