使用urllib2

时间:2015-07-29 17:22:49

标签: python urllib http-status-code-429

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

def resolve_redirects(url):
    return urllib2.urlopen(url).geturl()

不幸的是我有时会得到HTTPError: HTTP Error 429: Too Many Requests。什么是打击这个的好方法?以下是好的还是有更好的方法。

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

此外,如果except块中有异常会发生什么?

2 个答案:

答案 0 :(得分:2)

在重新尝试之前确保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

这也允许任意数量的重试(可能需要也可能不需要)。

https://docs.python.org/2/howto/urllib2.html#httperror

答案 1 :(得分:1)

这是处理异常的一种很好的方法,但是你应该检查以确保你在给定网站的请求之间保持适当的时间睡眠(例如twitter限制每分钟的请求数量并且有这个数量明确显示在他们的API文件中)。所以只要确保你总是睡得足够长。

要从异常中的异常中恢复,您可以简单地嵌入另一个try / catch块:

@model2_ids = Model2.pluck(:model1_id)
@some_variable = Model1.where.not(id: @model2_ids)

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