带有urllib2的Python HTTP错误429

带有urllib2的Python HTTP错误429,python,urllib,http-status-code-429,Python,Urllib,Http Status Code 429,我使用以下代码解析重定向以返回链接最终url def resolve_redirects(url): return urllib2.urlopen(url).geturl() 不幸的是,我有时会收到HTTPError:HTTP Error 429:请求太多。有什么好办法可以解决这个问题?以下是好方法还是有更好的方法 def resolve_redirects(url): try: return urllib2.urlopen(url).geturl()

我使用以下代码解析重定向以返回链接最终url

def resolve_redirects(url):
    return urllib2.urlopen(url).geturl()
不幸的是,我有时会收到
HTTPError:HTTP Error 429:请求太多
。有什么好办法可以解决这个问题?以下是好方法还是有更好的方法

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError:
        time.sleep(5)
        return urllib2.urlopen(url).geturl()

此外,如果except块中出现异常,会发生什么情况?

这是处理异常的好方法,不过您应该检查以确保在请求给定网站的两次请求之间,您总是在适当的时间内睡眠(例如,twitter限制了每分钟的请求量,并在其api文档中清楚地显示了这一数量)。因此,只要确保你总是睡足够长的时间就可以了

要从异常中的异常恢复,只需嵌入另一个try/catch块:

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError:
        time.sleep(5)
        try:
            return urllib2.urlopen(url).geturl()
        except HTTPError:
            return "Failed twice :S"

编辑:正如@jesse-w-at-z所指出的,您应该在第二个错误案例中返回一个URL,我发布的代码只是如何编写嵌套的try/catch的参考示例。

在重新尝试之前,最好确保HTTP代码实际上是429

可以这样做:

def resolve_redirects(url):
    try:
        return urllib2.urlopen(url).geturl()
    except HTTPError, e:
        if e.code == 429:
             time.sleep(5);
             return resolve_redirects(url)
        raise
这也将允许任意次数的重试(可能需要也可能不需要)


我认为这将取决于返回429的URL和限制您呼叫的速率。它们的限制/时间是什么?在错误情况下返回非URL会带来麻烦。我刚刚将其作为嵌套捕获的代码示例发布,我将编辑如何指定我提到的“重试次数”(任意重试次数).--进一步的改进是采用参数限制重试次数。