- Python网络爬虫从入门到精通
- 明日科技编著
- 1176字
- 2025-02-14 21:28:01
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图片