上一节里我们了解了怎样用requests库来构建和发送http请求,这一节我们来了解下怎样解析服务器端给的响应。先回顾一下http响应的包结构:
在IDE中打断点观察响应结构
首先,如果还不会在pycharm中打断点调试程序的同学,请在网上搜索相关教程,搜索关键字为:pycharm 断点调试 这种搜索资料的技能是IT相关从业人员必备基本功,请尽快掌握。 我们在pycharm里创建以下代码,并打上断点开始调试:
例1.一个get 请求的断点调试
import requests r=requests.get(https://api.github.com/events)
print(r.content)#请把断点打在这一行
这里可以看到调试的界面:
点击图中的Variables一栏下的r,我们可以看到响应r里包含的内容,见下图:
这里来看一下调试器里显示的内容。
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的各种事件信息:
例3.使用requests 库自带的json 解析器解析响应
import requests
r=requests.get(https://api.github.com/events)
print(r.json0)
以下是打断点观察r.json()的值:
可以看到,同样解析出了一个包含了很多字典的列表。
一般建议用的是例3的方式解析json数据,比较方便啦。当然有时候解析也会失败(比如服务器返回了一个格式错误的json),那时就可以通过观察r.content 和r.text 等来分析原因。