更新时间:2023年09月06日17时05分 来源:传智教育 浏览次数:
每个程序在运行过程中可能会遇到各种各样的问题,网络爬虫自然也不例外。网络爬虫访问网站离不开网络的支撑。由于网络环境十分复杂,具有一定的不可控性,所以网络爬虫每次访问网站后不一定能够成功地获得从服务器返回的数据。网络爬虫一旦在访问过程中遇到一些网络问题(如DNS故障、拒绝连接等),就会导致程序引发异常并停止运行。 requests.exceptions模块中定义了很多异常类型,常见的异常类型如表所示。
上表中罗列了一些常见的异常类型。其中,Timeout继承自RequestException,Connect Timeout 和ReadTimeout 继承自Timeout。
为保证程序能够正常终止,我们可以使用try-except语句捕获相应的异常,并对异常进行相应的队理。
由于谷歌网站服务器的原因,访问该网站必定会出现连接超时的问题。下面以访问谷歌网站为例,为大家演示如何使用try-except语句捕获RequestException异常,具体代码如下。
import time import requests # 记录请求的发起时间 print(time.strftime('开始时间:%Y-%m-%d %H:%M:%S')) # 捕获RequestException异常 try: html_atr = requests.get('http://www.google.com').text print('访问成功') except requests.exceptions.RequestException as error: print(error) #记录请求的终止时间 print(time.strftime('结束时间:Y-im-d H:iM:S'))
上述代码中,第4行代码记录了发送请求之后的时间。第6~10行代码使用try-except语句尝试捕获与处理RequestException异常。其中,第6~8行代码在try子句中调用getO函数访问谷歌网站,并在访问成功后输出“访问成功”。第9~10行代码在except子句中指定了捕获的异常类型为RequestException。程序监测到try子句中的代码抛出RequestException异常时,会捕获RequestException和所有继承自RequestException的异常,并在捕获异常后输出详细的异常信息。第12行代码记录了终止请求之后的时间。
运行代码,输出如下结果。
开始时间:2021-06-1613:50:53 HTTPConnectionPool(host='www.google.com',port=80):Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at Ox00000000034D6790>:Failed to establish a new connection:[NinError 10060]由于连接方 在一段时间后没有正确答复或连接的主机没有反应,连接尝试失致。)) 结束时间:2021-06-1613:51:14
通过对比结束时间与开始时间可知,我们等待了约20秒,这个时间相对来说有些长,这种长时间的等待是没有任何意义的。
为了减少无意义的等待,我们在发送HTTP请求时可以设置超时时长,即调用getO函数时传入timeout参数,并给该参数指定代表超时时长的值。如果超过该时长,服务器仍然没有返回任何响应内容,就让程序立即引发一个超时异常。在以上示例中,为请求设置超时时长为5秒,具体代码如下。
# 发送GET请求,设置超时时长 Im html_str = requests.get('http://www.google.com', timeout=5).text
再次运行代码,输出如下结果。
开始时间:2021-06-1614:30:01 HTTPConnectionPool(host='www.google.con', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(surllib3.connection.HTrPConnection object at Ox00000000033E23D0>, 'Connection to www.google.com timed out. (connect timeout=5)')) 结束时间:2021-06-1614:30:06
通过对比结果中的结束时间和开始时间可知,程序执行了5秒后便直接结束,并抛出ConnectTimeoutError异常及提示信息“Connection to www.google.com timed out”。这说明连接谷歌网站时超过了预设的等待时长而导致访问失败。