![Python网络爬虫从入门到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/915/44509915/b_44509915.jpg)
3.2 使用urlopen()方法发送请求
urllib.request模块提供了urlopen()方法,用于实现最基本的HTTP请求,然后接收服务端所返回的响应数据。urlopen()方法的语法格式如下:
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
参数说明如下。
url:需要访问网站的URL完整地址。
data:该参数默认值为None,通过该参数确认请求方式,如果是None,那么表示请求方式为GET,否则请求方式为POST。在发送POST请求时,参数data需要以字典形式的数据作为参数值,并且需要将字典类型的参数值转换为字节类型的数据才可以实现POST请求。
timeout:以秒为单位,设置超时。
cafile、capath:指定一组HTTPS请求受信任的CA证书,cafile指定包含CA证书的单个文件,capath指定证书文件的目录。
cadefault:CA证书默认值。
context:描述SSL选项的实例。
3.2.1 发送GET请求
在使用urlopen()方法实现一个网络请求时,所返回的是一个http.client.HTTPResponse对象。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P41_52499.jpg?sign=1739271379-R94qZoTOBOGkpgP0yCW6cfTFCTgl5grb-0-25237b4571a990731699dd066185f147)
程序运行结果如下:
响应数据类型为: <class 'http.client.HTTPResponse'>
【例3.1】 演示常用的方法与属性。(实例位置:资源包\Code\03\01)
在HTTPResponse对象中包含着需要可以获取信息的方法以及属性,下面通过几个常用的方法与属性进行演示。代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P41_52500.jpg?sign=1739271379-04qljl30cO90RDo0yyEyX2AwaEuTQqqT-0-f4076acd573d2b2948e40060253c6ba8)
程序运行结果如图3.1所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P41_10387.jpg?sign=1739271379-LWdwUX3glyJSGJGBrPfHqgPj8bYHxxlS-0-cdb7c19f44b68b9f66dc738f8952cad3)
图3.1 程序运行结果
3.2.2 发送POST请求
【例3.2】 发送POST请求。(实例位置:资源包\Code\03\02)
urlopen()方法在默认情况下发送的是GET请求,在发送POST请求时,需要为其设置data参数,该参数是bytes类型,所以需要使用bytes()方法将参数值进行数据类型的转换。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P42_52501.jpg?sign=1739271379-Gx1OHqMswBd38xIOYRcL26YAgsyF3N8b-0-ca4a358aeff6faa68c7b3bcf71451780)
程序运行结果如图3.2所示。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P42_53108.jpg?sign=1739271379-rSDmWHApN5p1HAPIHpQR6ELKN0Dguo7A-0-aba044e184aa05392b456274de692910)
图3.2 POST请求结果
3.2.3 设置网络超时
urlopen()方法中的timeout参数,是用于设置请求超时的参数,该参数以秒为单位,表示如果在请求时,超出了设置的时间,还没有得到响应时就抛出异常。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P42_52502.jpg?sign=1739271379-77eduK2vIQpELQx85bnZGDD8bGIw9xjw-0-896ad9a8684066d151101930246b2b76)
由于以上示例代码中的超时时间设置为0.1秒,时间较快,所以将显示如图3.3所示的超时异常。
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P43_10510.jpg?sign=1739271379-PXkX1vYDGgGPtBj9HAtajKzNnBcUT33z-0-ce2897a070c07e08fd926df8a130ee05)
图3.3 请求超时异常信息
说明
根据网络环境的不同,可以将超时时间设置为一个合理的时间,如2秒、3秒等。
【例3.3】 处理网络超时。(实例位置:资源包\Code\03\03)
如果遇到了超时异常,爬虫程序将在此处停止。所以在实际开发中开发者可以将超时异常捕获,然后处理下面的爬虫任务。示例代码如下:
![](https://epubservercos.yuewen.com/8BF9E9/23721540501937606/epubprivate/OEBPS/Images/Figure-P43_52504.jpg?sign=1739271379-uRqJWEbzR37y4KLiovEQRlfftccaid0o-0-45089f582fb32f19776fbef97a3195a1)
程序运行结果如下:
当前任务已超时,即将执行下一任务!