- 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请求的示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P61_52542.jpg?sign=1739690696-SBe6CVwsMpIntIJNo62XKJKIe2t2vYsd-0-881a9156c4054aaf6723940c11631953)
程序运行结果如下:
200
【例4.2】 使用PoolManager对象向多个服务器发送请求。(实例位置:资源包\Code\04\02)
一个PoolManager对象就是一个连接池管理对象,通过该对象可以实现向多个服务器发送请求。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P61_52543.jpg?sign=1739690696-YM5sgJgaTHTHZpt3BXacLhR8dK8XIHAx-0-f6907d324f176e94fec1875dfb661532)
程序运行结果如下:
京东请求状态码: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=1739690696-a8whexigPeRpTkJVxYahnQjf6IV9sGlf-0-a576c8bee9f048b578e2805c421f28f8)
程序运行结果如图4.1所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P62_53116.jpg?sign=1739690696-dGit2tFM6lhYZYPH9TdCq0hN3p92aZ81-0-94e96f27347c372cca2d48c9d8e69869)
图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=1739690696-BUBOMCpOAKiP4ir8A2ROdcf6K1gJeWoR-0-2adf23459e7c05aa3da477089a5c45f0)
图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=1739690696-qEfDqFG1OHr8fs9Co2tc1RkQfblMZKuA-0-791b6b01636f084e8706cd93d7314f6e)
程序运行结果如下:
默认重试请求次数: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=1739690696-eTCerI4vHCeKb1aSOQ44cxAErlLf1RXl-0-1d541147dd91c8183f838d1a4f6fad29)
程序运行结果如下:
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=1739690696-03u2ScTZHfypN1rGgid6I9bdg8SPlVtT-0-e3b7ff46be98f3cf19ba5eb18ec3a691)
程序运行结果如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52552.jpg?sign=1739690696-XI3VdNAeDv6u7hfdjwxzo47hY7UVigjj-0-bc2623ee414821632ee92caaee0344b3)
3.二进制数据
【例4.7】 处理服务器返回二进制数据。(实例位置:资源包\Code\04\07)
如果响应数据为二进制数据,则也可以做出相应的处理。例如,响应内容为某图片的二进制数据时,则可以使用open()函数,将二进制数据转换为图片。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P64_52553.jpg?sign=1739690696-MpL1Kv51OZ1s6ifQTIuVjmgucnSDUkbQ-0-2233134739be656c64ecea0484a9ace4)
程序运行结果如下:
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=1739690696-h8L1yTiDGGW60CMo3i29eXFbhmHGPAyD-0-8867a94e0ca0be909df99c6046c2b2c2)
图4.3 自动生成的Python.png图片