欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

requests库入门14-Cookie

程序员文章站 2022-06-16 11:03:06
...

 因为http是没有状态的协议,上一个请求和下一个请求是没有关联。但是现实中又需要有关联,比如一个页面某个操作需要登陆之后才能进行,没有登陆就提示你登陆。为了实现这样的效果,所以出现了Cookie和Session这两种机制。这里的Session是指http的一种机制,和requests的会话对象是两个东西。Session机制不太清楚就不写了。

 

Cookie机制原理

当浏览器第一次发送请求给服务器是没有带cookie的,当你登陆的时候,服务器会检查你的用户名和密码,发现确认有你这么一个用户,给出响应的同是,并给你设置一个cookie,浏览器收到服务器返回的cookie后,会解析并保存。之后再每次请求这个服务器的时候就会在请求头中把cookie带上,服务器会对这个cookie进行解析,发现是之前设置过的cookie,服务器就会给出响应。这样一个完整的交互流程就走完了。

如果服务器并没有设置cookie的有效期,一般来说cookie是在保存在内存里,浏览器关闭的时候失效。如果服务器设置过cookie的的有效期长时间有效,浏览器会把cookie保存到本地。就像有一些网站会有一个选项,7天免登录啥的,那个就是设置cookie的有效期。

在requests里,可以在请求中使用cookies参数来发送cookie到服务器,cookies参数需要指向一个dict。如果某些响应中带有cookie。可以使用cookies来打印得到的cookie

 

来看代码示例,看下登录Github,然后获得返回的cookie

先找到github登录界面,然后F12打开浏览器调试窗,然后输入错误的用户名密码,看下调试窗,左边Name叫做session的就是登录的请求

requests库入门14-Cookie

登录界面:https://github.com/login

登录接口地址是:https://github.com/seeion。

最下面Form Data就是请求时提交的表单数据,最上面两个是固定不变的,中间的这个token是在打开登录界面时动态生成的。下面两个是用户名和密码

也就是说,在我们打开登录界面的时候,会生成一个token。然后点击登录的时候,会把用户名,密码,token一起传过去

那第一步就是获取登录界面自动生成的token

import requests
import re
s = requests.session()#通过会话对象来登录,可以自动保存登录后过后的cookie等
r = s.get('https://github.com/login')#请求登录界面
resuit = r.text#获得登录界面的响应内容
tokens = re.findall(r'<input type="hidden" name="authenticity_token" value="(.*?)" />', resuit)#通过正则得到登录界面响应内容中自动生成的token,生成的是个数组
token = tokens[0]#只需要拿数组第一个字段
print(token)

requests库入门14-Cookie

成功拿到token之后,第二不就是把token放到请求头中,然后请求登录接口,成功之后就可以拿到返回的cookie了

url = 'https://github.com/session'
payloda = {'commit': 'Sign in',
           'utf8': '✓',
           'authenticity_token':token,
           'login':'usernmae',
           'password':'password'}
r1 = s.post(url,data=payloda)
print(r1.status_code)
print(r1.text)
print(r1.cookies)

用户名和密码输入自己的github账号

requests库入门14-Cookie

返回内容就不截图了,是登录成功后的首页html代码。可以看到cookie已经拿到了

 

相关标签: python request