Python网络爬虫从入门到精通
上QQ阅读APP看书,第一时间看更新

4.2 发送网络请求

4.2.1 GET请求

使用urllib3模块发送网络请求时,首先需要创建PoolManager对象,通过该对象调用request()方法来实现网络请求的发送。request()方法的语法格式如下:

     Request(method,url,fields = None,headers = None,** urlopen_kw)

常用参数说明如下。

 method:必选参数,用于指定请求方式,如GET、POST、PUT等。

 url:必选参数,用于设置需要请求的url地址。

 fields:可选参数,用于设置请求参数。

 headers:可选参数,用于设置请求头。

【例4.1】 使用request()方法实现GET请求。(实例位置:资源包\Code\04\01)

使用request()方法实现GET请求的示例代码如下:

程序运行结果如下:

     200

【例4.2】 使用PoolManager对象向多个服务器发送请求。(实例位置:资源包\Code\04\02)

一个PoolManager对象就是一个连接池管理对象,通过该对象可以实现向多个服务器发送请求。示例代码如下:

程序运行结果如下:

     京东请求状态码:200
     Python请求状态码:200
     百度请求状态码:200

4.2.2 POST请求

【例4.3】 使用request()方法实现POST请求。(实例位置:资源包\Code\04\03)

使用urllib3模块向服务器发送POST请求时并不复杂,与发送GET请求相似,只需要在request()方法中将method参数设置为POST,然后将fields参数设置为字典类型的表单参数。示例代码如下:

程序运行结果如图4.1所示。

图4.1 返回的请求结果

从图4.1的运行结果中可以看出,JSON信息中的form对应的数据为表单参数,只是country所对应的并不是“中国”而是一段unicode编码,对于这样的情况,可以将请求结果的编码方式设置为unicode_escape。关键代码如下:

     print(r.data.decode('unicode_escape'))

编码方式设置为unicode-escape之后,程序运行结果,返回的表单参数内容如图4.2所示。

图4.2 返回的表单参数

4.2.3 重试请求

【例4.4】 通过retries参数设置重试请求。(实例位置:资源包\Code\04\04)

urllib3可以自动重试请求,这种相同的机制还可以处理重定向。在默认情况下,request()方法的请求重试次数为3次,如果需要修改重试次数,那么可以设置retries参数。修改重试测试的示例代码如下:

程序运行结果如下:

     默认重试请求次数:3
     设置重试请求次数:5
     关闭重试请求次数:False

4.2.4 处理响应内容

1.获取响应头

【例4.5】 获取响应头信息。(实例位置:资源包\Code\04\05)

发送网络请求后,将返回一个HTTPResponse对象,通过该对象中的info()方法即可获取HTTP响应头信息,该信息为字典(dict)类型的数据,所以需要通过for循环进行遍历才可清晰地看清每条响应头信息的内容。示例代码如下:

程序运行结果如下:

     Date : Tue, 16 Jun 2020 07:52:27 GMT
     Content-Type : application/json
     Content-Length : 243
     Connection : keep-alive
     Server : gunicorn/19.9.0
     Access-Control-Allow-Origin : *
     Access-Control-Allow-Credentials : true
2.JSON信息

【例4.6】 处理服务器返回的JSON信息。(实例位置:资源包\Code\04\06)

如果服务器返回了一条JSON信息,而这条信息中只有某条数据为可用数据时,则可以先将返回的JSON数据转换为字典(dict)数据,接着直接获取指定键所对应的值即可。示例代码如下:

程序运行结果如下:

3.二进制数据

【例4.7】 处理服务器返回二进制数据。(实例位置:资源包\Code\04\07)

如果响应数据为二进制数据,则也可以做出相应的处理。例如,响应内容为某图片的二进制数据时,则可以使用open()函数,将二进制数据转换为图片。示例代码如下:

程序运行结果如下:

     b'\x89PNG\r\n\x1a\n\x00\x00\x00\......'

以上运行结果中......为省略内容,同时项目结构路径中将自动生成Python.png图片,图片内容如图4.3所示。

图4.3 自动生成的Python.png图片