requests中的响应

239 阅读3分钟

上一节里我们了解了怎样用requests库来构建和发送http请求,这一节我们来了解下怎样解析服务器端给的响应。先回顾一下http响应的包结构:

image.png

在IDE中打断点观察响应结构

首先,如果还不会在pycharm中打断点调试程序的同学,请在网上搜索相关教程,搜索关键字为:pycharm 断点调试 这种搜索资料的技能是IT相关从业人员必备基本功,请尽快掌握。 我们在pycharm里创建以下代码,并打上断点开始调试:

例1.一个get 请求的断点调试

import requests r=requests.get(https://api.github.com/events)
print(r.content)#请把断点打在这一行

这里可以看到调试的界面: image.png 点击图中的Variables一栏下的r,我们可以看到响应r里包含的内容,见下图: image.png 这里来看一下调试器里显示的内容。

r={Response)这个表示r是一个Response类的实例,Response类是

reqeusts库里定义来表示响应的类。

r._content 等以下划线开头的内部变量我们暂时不用管。

r.connection 里看上去存放了一些连接相关的内容,我们一般也不用。

r.content 这个就是响应主体内容,以字节 bytes类型保存,我们把它转换成字典或字符串之后就是我们想要的响应数据。

r.cookies 这里保存了这个响应带的 cookie,一般也没什么用,后面我们会用reqeusts的会话来管理 cookie.

r.elapsed这个请求的响应时间。

那么大家可能会问,你怎么知道这里每参数是什么意思的?

很简单,看官方文档:docs.python- requests.org/zh CN/latest/api.html#requests.Response

那么如果对某个具体参数的官方文档有疑问,怎么办?

你可以在网上搜索,比如reqeusts elapsed,你可以搜到很多中文文章讲这个参数。

好,剩下的参数我就不—介绍了,只讲其中重要的参数。对我没介绍到的参数有兴趣的同学自己看看文档或进行搜索。

r.status_code这个就是HTTP响应里的状态码,非常重要,常用于写断言。

r.reason这里会包含一个短语,如果响应失败,会告诉你失败原因。

r.request这个响应所对应的请求。

r.text响应中数据转换成的文本。

r.url这个响应来自于哪个url。

解析响应

例2.解析一个响应

import requests.json r=requests.get("https://api.github.com/events)
print(r.content)
dict json=json.loads(r.content)
print(dict json)

在这个例子里,我们用json 这个库解析了github给我们返回的响应数据。

通过打断点调试,可以看到dict json 其实是一个列表,列表元素是字典,字典里包含了github的各种事件信息: image.png 例3.使用requests 库自带的json 解析器解析响应

import requests
r=requests.get(https://api.github.com/events)
print(r.json0)

以下是打断点观察r.json()的值: image.png 可以看到,同样解析出了一个包含了很多字典的列表。

一般建议用的是例3的方式解析json数据,比较方便啦。当然有时候解析也会失败(比如服务器返回了一个格式错误的json),那时就可以通过观察r.content 和r.text 等来分析原因。