requests的学习(二)
1 Session对象
class requests.Session: session对象来自于requests中的Session类
1.1 session基本用法
session用于上下文管理器中
如上,这样能确保在一旦退出with语句后,session就会被关闭,即使with语句中有未处理的异常发生
1.2 session对象拥有的方法
session对象有the main requests API中的所有方法,所以利用session也可发送执行get post等请求,具体包括
requests.request()
requests.get()
requests.head()
requests.post()
requests.put()
requests.patch()
requests.delete()
具体见 https://requests.readthedocs.io/en/latest/api/#main-interface
session对象还拥有其他方法如
cookies()
close()
options()
send()
等等 具体见 https://requests.readthedocs.io/en/latest/api/#request-sessions
1.3 利用session 在多个请求之间共享数据
多个请求,如果这多个请求之间有共同的数据,如请求头headers或者cookie数据,未使用session发送请求时,每次请求都会添加部分重复的数据(headers或cookie)。现在,通过session对象来执行get等请求,只需要在请求前利用session添加一次数据(session级别的数据),这样,每一个请求发送都会携带者这部分session级别数据
如下,通过session添加cookie
结果
可以看到,结果3和结果4是一致,他们在请求时都没有像前面2个请求一样显式地携带cookie,直接在开头利用session添加了cookies数据,这样,通过该session发送的数据就都携带了session数据
如下,通过session添加header
1.4 数据覆盖
session执行head等请求时在方法里面传递的参数会覆盖直接通过sesssion定义的同名参数,即方法级别的数据会覆盖session级别的数据 不同名的参数会被发送出去
如上,方法里面的定义的参数值被发送出去,覆盖了session里面的同名参数
需要注意的是,即使使用了session,A请求里面定义参数不会被B请求所使用,除非是像上面说的参数覆盖的情况
session是一个类,通过session定义的各种数据就好像类的属性数据,get等方法就是类中定义的方法。通过session执行请求方法,则相当于用一个session类的对象执行get等方法,自然拥有类的属性数据,同时,又可以在请求方法里面传参来覆盖类的属性数据或者定义自己的参数,即使是同一个session对象,执行不同的方法时,方法之间的参数如果不是和类的数据关联,是不会互相影响的
1.5 删除数据(在方法级别删除)
有时你不想要字典参数中一些session级别的的key-value数据。要做到这一点,你只需简单地在方法层级别参数中将那个key的值设置为 None ,在此方法中key-value数据就会被自动省略掉
如上,在session级别中定义了参数h-test1, 在第一个get请求中,它被发送出去了,在第2个get请求中,它被忽略了
2 构造Request 对象并发送
在做类似 requests.get() 的调用操作时,其实在做两件主要的事情。其一,构建一个 Request 对象, 该对象将被发送到某个服务器请求或查询一些资源。其二,一旦 requests 得到一个从服务器返回的响应就会产生一个 Response 对象。该响应对象包含服务器返回的所有信息,也包含你原来创建的 Request 对象
2.1 requests.requests(method,xxx)
利用requests.request(method,xxx)也可以手动构建一个Request对象并发送,其返回值与requests.method(xx)一样,都是一个Rsponse object
如上,requests.request(method,xxx)中的参数,除了第一个是表示get、post等方法的字符串,其他参数与使用requests.method(xxx)使用的参数一致
日常使用中也更推荐用requests.request(method,xxx)这种,它把method作为参数,使用起来更加灵活可变
结果
2.2 session().requet(method,xxx)
把session对象的功能和requests.request(method,xxx)结合起来,即session().requet(method,xxx)
结果
3 PreparedRequest
执行GET等请求后,获得一个Response对象,通过Response对象,可以获得服务器返回给我们的各种数据外,还可以利用Rsponse.request获得一个PreparedRequest对象,即发送请求时的的各种数据(header 、body等)
3.1 从Response中获取PreparedRequest
结果
3.2 通过session对象和Request构造一个PreparedRequest并发送
如上,Request(第一个字母大写)是requests库中的一个更加底层的类,生成一个Request对象,利用该对象就可生成PreparedRequest,再通过方法Session().send(PreparedRequest,xxx)就可以发送http请求到服务器
具体见https://requests.readthedocs.io/en/latest/api/#lower-level-classes
3.3 关于PreparedRequest
PreparedRequest是requests库中一个更加底层的类,包含了将要发送到服务器的准确的数据,通常从一个Request对象生成PreparedRequest,而不是手动生成,以免出现各种难以预料的情况
PreparedRequest发送到服务器: Session().send(PreparedRequest)
具体见 https://requests.readthedocs.io/en/latest/api/#lower-lower-level-classes
PreparedRequest的属性有
url : HTTP URL to send the request to
body: request body to send to the server
headers: dictionary of HTTP headers
method: HTTP verb to send to the server
hooks: dictionary of callback hooks, for internal usage
方法有 prepare_body() prepare_herders()等,但是应避免直接使用这些prepare_xx方法,应直接从Request生成PreparedRequest
结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南