![Python网络爬虫从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/915/44509915/b_44509915.jpg)
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请求的示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P61_52542.jpg?sign=1738809985-cOU9Z1nqPEvqrnoF24xDFMRkMedd7ILE-0-555d33ad298dda4deda97e343df2dd94)
程序运行结果如下:
200
【例4.2】 使用PoolManager对象向多个服务器发送请求。(实例位置:资源包\Code\04\02)
一个PoolManager对象就是一个连接池管理对象,通过该对象可以实现向多个服务器发送请求。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P61_52543.jpg?sign=1738809985-2wvvaya3sgiCyrsnuZBBs5n1QJmgMK5f-0-48f8807692f5d8d4e14a42e7c88a4e16)
程序运行结果如下:
京东请求状态码:200 Python请求状态码:200 百度请求状态码:200
4.2.2 POST请求
【例4.3】 使用request()方法实现POST请求。(实例位置:资源包\Code\04\03)
使用urllib3模块向服务器发送POST请求时并不复杂,与发送GET请求相似,只需要在request()方法中将method参数设置为POST,然后将fields参数设置为字典类型的表单参数。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P62_52545.jpg?sign=1738809985-DqJftdW6KJ4RBVQjuooM0I4KcLiH6Jsi-0-03aa41ee41b74d13b6add99655d628da)
程序运行结果如图4.1所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P62_53116.jpg?sign=1738809985-Eeyi93fCNc8NyAfQnGGKxcgNBzfAJoUP-0-b9f180b65bd06ab720039c9f4bce9a27)
图4.1 返回的请求结果
从图4.1的运行结果中可以看出,JSON信息中的form对应的数据为表单参数,只是country所对应的并不是“中国”而是一段unicode编码,对于这样的情况,可以将请求结果的编码方式设置为unicode_escape。关键代码如下:
print(r.data.decode('unicode_escape'))
编码方式设置为unicode-escape之后,程序运行结果,返回的表单参数内容如图4.2所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P62_12826.jpg?sign=1738809985-GGj7t4mP4Ghy0u9K7tqGzMaIPBujQGLL-0-01964b34cbbea5014a7714624ddccdbd)
图4.2 返回的表单参数
4.2.3 重试请求
【例4.4】 通过retries参数设置重试请求。(实例位置:资源包\Code\04\04)
urllib3可以自动重试请求,这种相同的机制还可以处理重定向。在默认情况下,request()方法的请求重试次数为3次,如果需要修改重试次数,那么可以设置retries参数。修改重试测试的示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P63_52546.jpg?sign=1738809985-iddVkxSF7aQq0KlKy0e7uhe3K8i5X5DH-0-92a46b62046d3dd421787d5646b5e3db)
程序运行结果如下:
默认重试请求次数:3 设置重试请求次数:5 关闭重试请求次数:False
4.2.4 处理响应内容
1.获取响应头
【例4.5】 获取响应头信息。(实例位置:资源包\Code\04\05)
发送网络请求后,将返回一个HTTPResponse对象,通过该对象中的info()方法即可获取HTTP响应头信息,该信息为字典(dict)类型的数据,所以需要通过for循环进行遍历才可清晰地看清每条响应头信息的内容。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P63_52548.jpg?sign=1738809985-dgHWddHFkrBoFYBex3PVnKkwzmYnCriU-0-1492e334af1062c28016e750baac3e82)
程序运行结果如下:
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)数据,接着直接获取指定键所对应的值即可。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52551.jpg?sign=1738809985-10Pp4y17hWBOHDK8gDtHS2aJYnwk3zpi-0-41c21bce0656e984e604dc2c2530ea76)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52552.jpg?sign=1738809985-SgSQbXj4uBwA6DZrDPS1BVh0wSwZ9KNA-0-d9b35983fa3af5020aa7cfe38ce3907a)
3.二进制数据
【例4.7】 处理服务器返回二进制数据。(实例位置:资源包\Code\04\07)
如果响应数据为二进制数据,则也可以做出相应的处理。例如,响应内容为某图片的二进制数据时,则可以使用open()函数,将二进制数据转换为图片。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52553.jpg?sign=1738809985-lDcEkUJVImnM1TfL8vl6fmB5nzBdpJnI-0-e86f3450593e49df2125c8028cf3ed83)
程序运行结果如下:
b'\x89PNG\r\n\x1a\n\x00\x00\x00\......'
以上运行结果中......为省略内容,同时项目结构路径中将自动生成Python.png图片,图片内容如图4.3所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P65_13199.jpg?sign=1738809985-ARInLund3FZFEcScxEcnYsKh7laP8O9G-0-f95e6d1983b62dd56e9854fa5fdfd5d6)
图4.3 自动生成的Python.png图片