![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=1739362833-ZyfWluyK4qCvMtrD1OCqOxiWJvbhPF7e-0-9cb0f4d97931767956df5a6008f6c644)
程序运行结果如下:
200
【例4.2】 使用PoolManager对象向多个服务器发送请求。(实例位置:资源包\Code\04\02)
一个PoolManager对象就是一个连接池管理对象,通过该对象可以实现向多个服务器发送请求。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P61_52543.jpg?sign=1739362833-NlLoqFGFjjScfP287OpbYnWgIQadhTsK-0-c2e49feb078bbfadd7cff305c9efcd94)
程序运行结果如下:
京东请求状态码: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=1739362833-Rnbtb76klPEUBMY8i6bycP7VQ0lWDmMa-0-975ec670698a938ab8be10a92ab55ef9)
程序运行结果如图4.1所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P62_53116.jpg?sign=1739362833-1CDWiVe7mavy6bPV28l8oMKk7WLpJgKA-0-147c8c120b95579b6f0b61054786c4aa)
图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=1739362833-dVR5qUThk15bacmdKAPxKCS6Vcgs6IZL-0-cc049d15790bbe431369e4251792a897)
图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=1739362833-yFFOKX0l8OUNyOodukPRGA3Vfj6kSLOH-0-c8dc94392a154c897ac9a499f46aedda)
程序运行结果如下:
默认重试请求次数: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=1739362833-QXS4WFzC5456jllKPyvpOqOpsUEVcB0b-0-4f08d8275b015e522d12c962e3aa72e9)
程序运行结果如下:
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=1739362833-9qx7kzFOE56Eqzf7jyqAfQA1tYxH0gbC-0-1d8edec0c05beb7c773ad8e6c2064023)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52552.jpg?sign=1739362833-7cSEyrFNs3CzZp4j79Yu3ecgZo1NAAnc-0-275bbf879c4684df9b396220486d6ec1)
3.二进制数据
【例4.7】 处理服务器返回二进制数据。(实例位置:资源包\Code\04\07)
如果响应数据为二进制数据,则也可以做出相应的处理。例如,响应内容为某图片的二进制数据时,则可以使用open()函数,将二进制数据转换为图片。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52553.jpg?sign=1739362833-n5cNDFpDO5yuBwtaAsLLhfoRERIrGRyW-0-6bba84287af0e37e6121cf8856b2ed33)
程序运行结果如下:
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=1739362833-ja48H4CC8AHBEYgz31Ylf78ObCcO5gTu-0-cf862d9d8fd9cb09d983f20471ebf770)
图4.3 自动生成的Python.png图片