9.2.2 request库的响应对象Response

9.2.2 request库的响应对象Response

和浏览器的交互过程一样,requests.get()代表请求过程,它返回的Response对象代表响应。返回内容作为一个对象更便于操作。Response对象的属性如表9-2所示。

表9-2 Response对象的属性

status_code属性返回请求HTTP后的状态,在处理数据之前要先判断状态情况,如果请求未被响应,需要终止内容处理。

响应状态码(HTTP status code)用3位数字来表示网页服务器HTTP的响应状态。200表示连接成功;301表示网页被永久转移到其他URL;404表示连接失败,网页不存在;500表示内部服务器错误。

运行结果:

为了方便引用,requests库还附带了一个内置的状态码查询对象。

通过响应状态码是否与request.code.ok相等,来帮助人们在编写爬虫时判断是否正确获取到了资源。

text属性是请求的页面内容,以字符串形式展示。

encoding属性非常重要,它给出了返回页面内容的编码方式,可以通过对encoding属性进行赋值更改编码方式,以便于处理中文字符。

运行结果:

默认的编码方式是'ISO-8859-1',所以中文会以乱码显示,如继承运行代码:

运行结果如图9-5所示。

为了正常显示中文,可以将编码方式进行更改,语句为:

运行结果如图9-6所示。

图9-5 以'ISO-8859-1'编码显示r.text的内容

图9-6 以'utf-8'编码显示r.text的内容

content属性是页面内容的二进制形式。

运行结果如图9-7所示。

图9-7 以二进制编码显示r.content的内容

除了属性,Response对象还提供了一些方法,如表9-3所示。

表9-3 Response对象的方法

json()方法能够在HTTP响应内容中解析存在的JSON数据,这将带来解析HTTP的便利。

raise_for_status()方法能在非成功响应后产生异常,即只要返回的请求状态status_code不是200,这个方法就会产生一个异常,用于try-except语句。使用异常处理语句可以避免设置一堆复杂的if语句,只需要在收到响应时调用这个方法,就可以避开状态200之外的各种意外情况。

requests会产生几种常用异常。当遇到网络问题时,如DNS查询失败、拒绝连接等,requests会抛出ConnectionError异常;当遇到无效的HTTP响应时,requests会抛出HTTPError异常;当请求URL超时时,会抛出Timeout异常;当请求超过了设定的最大定向次数时,会抛出TooManyRedirects异常。

获取一个网页内容的函数,可用如下代码实现: