requests的学习

发布时间 2023-08-04 12:11:10作者: 工作手记

response的解析

解析请求的url: r.url

解析响应状态码:r.ststus_code

image

解析文本类型的response: r.text

image
r.text 用于解析respose内容为文本类型 requests会自动解码其中的内容

image
r.encoding #查看requests使用了什么编码或者设置自己的编码
如果你改变了编码,每当你访问 r.text ,Request 都将会使用 r.encoding 的新值

解析非文本类型的response: r.content

image
返回内容的类型为bytes

解析json格式的响应内容:r.json()

image

获得原始的socket response: r.raw

在罕见的情况下,你可能想获取来自服务器的原始套接字响应,那么你可以访问 r.raw,并设置 stream=True
image

获得response的headers

r = requets.post(xxxxx)
# 输出所有的header
print(r.headers)
# 输出Content-Type这个header值
print(r.headers['Content-Type'])

设置请求的header

为请求添加HTTP header,只要简单地传递一个 dict 给 headers 参数就可以了
image

下图是baidu接口的header字段
image

请求参数设置

参数拼接在url的?后面

image
image
如上,需要把具体参数放在一个由string类型的数据组成的dict里面,赋值给params这个参数字段名。 打印出请求的url,可以看到参数被编码进了url里面
在url中拼接请求参数常见于一些get请求

post请求的的请求参数

把请求参数作为form-encoded data(表单数据)发送

image
如上,把参数写在dict里面然后传递给data字段名
如果key和value的关系是一对多的关系,还可采用下面的两种形式存放参数
image

把请求参数作为json形式发送

image
如上,把参数数据从py对象手动转为json,然后传递给data字段名。
不过上面由于没有设置请求的header 即"Content-Type": "application/json",所以实际请求时可能不会把参数作为json发送出去,添加header如下
image

更方便的形式,是把参数传给json字段名,requests会自动帮我们自动转为json并添加header(2.4.2版本开始)
image

如果requests传递的参数中有参数data或者files,那么json参数会被自动忽略

cookies

在请求参数中携带cookie

把cookie的key与value放在dict中,然后传给参数字段cookies
image
结果
image

另一种方式是把cookie数据放在requests.cookies.RequestsCookieJar()中,然后传给参数字段cookies
RequestsCookieJar类型和dict和dict的操作和相似,适合跨域名和路径使用
image

解析response中的cookie

response中返回的cookies其类型为RequestsCookieJar

r = requests.get(xxxx)
#输出cookie,假设其中存在xxxxkey_of_cookies这样一个字段
print(r.cookies['xxxxkey_of_cookies'])

超时

HTTP请求发出后,在设定的时间内(timeout参数),还没有收到response,就不再等待response,直接抛出异常
image

image

关于超时的定义 官网文档有如下解释
image
简单说,超时与下载需要的时间无关,无论下载需要多久,都表示已经收到response了,超时是针对请求对应的服务的的response而言,在设定的时间内,如果一个字节的的socket response都没有,就是超时

错误与异常

所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException

ConnectionError 异常

在出现网络问题、DNS查询失败、连接服务器失败等因素后,Requests 会抛出一个 ConnectionError 异常
如下,故意连接到一个不存在的url
image
执行结果
image

HTTPError 异常

发出HTTP请求后得到的response状态码以4或5开头(a 4XX client error or 5XX server error response), 通过方法:Response.raise_for_status(),可以手动释放一个异常
下面请求一个本地的httpbin服务接口
image

image

timeout 异常

TooManyRedirects 异常

若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常