带有urllib2的Python HTTP错误429
我使用以下代码解析重定向以返回链接最终url带有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()
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会带来麻烦。我刚刚将其作为嵌套捕获的代码示例发布,我将编辑如何指定我提到的“重试次数”(任意重试次数).--进一步的改进是采用参数限制重试次数。