gpt4 book ai didi

python - 使用 urllib2 在超时时重试加载页面?

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:54 25 4
gpt4 key购买 nike

我试图强制 Python 在遇到超时错误时重试加载页面。有没有办法让它重试特定次数,可能在特定时间延迟之后?

如有任何帮助,我们将不胜感激。

谢谢。

最佳答案

urllib2 没有为此内置任何内容,但您可以自己编写。

棘手的部分是,作为 urlopen文档说,无论出现什么问题,您只会得到一个 URLError。那么,您如何知道这是超时还是其他原因?

好吧,如果你查找URLError ,它表示它将有一个 reason ,对于远程 URL 将是一个 socket.error 。如果你查找 socket.error它告诉您它是 IOErrorOSError 的子类(取决于您的 Python 版本)。如果你查找 OSError ,它会告诉您它有一个代表潜在错误的 errno

那么,您得到哪个errno 超时值?我愿意打赌它是 EINPROGRESS,但让我们确定一下:

>>> urllib.urlopen('http://127.0.0.1', timeout=0)
urllib2.URLError: <urlopen error [Errno 36] Operation now in progress>
>>> errno.errorcode[36]
'EINPROGRESS'

(您可以只使用数字 36,但不能保证跨平台相同;errno.EINPROGRESS 应该更便携。)

所以:

import errno
import urllib2

def retrying_urlopen(retries, *args, **kwargs):
for i in range(retries):
try:
return urllib2.urlopen(*args, **kwargs)
except URLError as e:
if e.reason.errno == errno.EINPROGRESS:
continue
raise

如果您认为这很糟糕并且应该不那么笨重……好吧,我想每个人都同意。异常(exception)情况已经进行了两次根本性的改进,同时又出现了另一个大的异常(exception)情况,以及沿途的各种小变化。但如果您坚持使用 2.7,您将无法从这些改进中获益。

如果迁移到 Python 3.4 是不可能的,也许可以迁移到第三方模块,如 requestsurllib3。这两个库都有一个单独的 Timeout 异常类型,而不是让您仔细研究通用 URLError 的细节。

关于python - 使用 urllib2 在超时时重试加载页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25277833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com