python requests超时,python requests请求失败重试

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: