python requests超时,python requests请求失败重试
描述:一个双流程项目部署在几个服务器上,有一天突然几个服务器卡住了。
一开始我怀疑是自己的多进程多线程造成的内存占用。查了代码,压力测试,发现跟内存关系不大。
我把几台服务器的日志拿出来对比分析,发现几台机器的每个进程日志的异常时间都差不多,都是接口请求后卡住的。
显然,最大的可能是服务器出了问题。问后台工作人员,当时后台服务器出现异常。
那么问题来了,为什么?之后百度找到这篇文章解释原因:参考链接
网络将不可避免地遇到请求超时。在请求中,如果您不设置您的程序,您可能会永远失去响应。
超时可以分为连接超时和读取超时。简单地说,连接超时是发起连接请求和建立连接之间的最大时间,读取超时是成功启动连接和服务器返回响应之间的最大等待时间。
1.连接超时连接超时是指当您的客户端连接到远程机器端口(对应于connect())时,请求等待的秒数。
默认值约为21秒。
导入时间
导入请求
url=http://www.google.com.hk
print(time . strftime( % Y-% M-% d % H:% M:% S ))
尝试:
html=requests.get(url,timeout=5)。文本
打印(“成功”)
except requests . exceptions . request exception as e:
打印(e)
print(time . strftime( % Y-% M-% d % H:% M:% S ))
因为google被屏蔽,无法连接,错误信息显示连接超时。
2018-12-14 14:38:20
HTTPConnectionPool(host= www . Google . com . hk ,port=80):超过了url的最大重试次数:/(由ConnectTimeoutError(,导致与www.google.com.hk的连接超时。(连接超时=5)))
2018-12-14 14:38:252.读取超时读取超时是指客户端等待服务器发送请求的时间。(具体是指客户端等待服务器发送字节的时间间隔。在99.9%的情况下,这指的是服务器发送第一个字节之前的时间)。
默认值:读取超时没有默认值。如果没有设置,程序将一直等待。我们的爬虫经常卡死,没有任何错误信息,这就是原因。
查看请求源代码,您会发现:
超时可以传递浮点数或元组。
如果将单个值设置为超时,该超时值将用作连接(连接超时)和读取(读取超时)的超时,如下所示:
R=requests.get (3359github.com ,timeout=5)如果想分别制作,传入一个元组,(连接超时,读取超时)比如:
requests.post(url,headers=headers,data=info_json,timeout=(5,20))
黑板爬虫突破的第四关恰好是网站人为设置了15秒的响应等待时间,这就是最好的解释。
导入时间
导入请求
URL _ log in= http://www . hei banke . com/accounts/log in/?next=/lesson/crawler_ex03/
会话=请求。会话()
session.get(url_login)
token=session . cookies[ csrftoken ]
session.post(url_login,data={ csrfmiddlewaretoken :token, username: xx , password: xx})
print(time . strftime( % Y-% M-% d % H:% M:% S ))
URL _ pw= http://www . hei banke . com/lesson/crawler _ ex03/pw _ list/
尝试:
html=session.get(url_pw,timeout=(5,10))。文本
打印(“成功”)
except requests . exceptions . request exception as e:
打印(e)
print(time . strftime( % y-% m-% d % h:% m:% s )的错误消息显示读取超时。
2018-12-14 15:20:47
HTTPConnectionPool(host= www . hei banke . com ,port=80):读取超时。(读取超时=10)
2018-12-14 15:20:57
3.超时重试一般我们不会超时后立即返回,而是会设置一个三次重连的机制。
def gethtml(url):
i=0
而我3:
尝试:
html=requests.get(url,timeout=5)。文本
返回html
除了requests . exceptions . request exception:
i=1
实际上,requests已经帮我们封好了。(但是代码好像比较多.)
导入时间
导入请求
从请求.适配器导入HTTPAdapter
s=请求。会话()
s.mount(http://,HTTPAdapter(max_retries=3))
s.mount(https://,HTTPAdapter(max_retries=3))
打印(时间。strftime( % Y-% M-% d % H:% M:% S ))
尝试:
r=s . get谷歌。com。hk ,超时=5)
回复短信
请求除外。例外情况。请求例外为e:
打印(五)
打印(时间。strftime( % Y-% M-% d % H:% M:% S ))ax _ retries为最大重试次数,重试3次,加上最初的一次请求,一共是四次,所以上述代码运行耗时是20秒而不是15秒
2018-12-14 15:34:03
HTTPConnectionPool(host= www。谷歌。com。hk ,port=80):超过了全球资源定位器(Uniform Resource Locator)的最大重试次数:/(由ConnectTimeoutError(,导致与www.google.com.hk的连接超时。(连接超时=5)))
2018-12-14 15:34:23
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。