2

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

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 块中有异常会发生什么?

4

3 回答 3

4

最好在重试之前确保 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

于 2015-07-29T18:14:22.873 回答
1

这是处理异常的好方法,尽管您应该检查以确保您在给定网站的请求之间始终处于适当的睡眠时间(例如,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 的参考示例。

于 2015-07-29T17:29:17.647 回答
0

将 User-Agent 添加到请求标头解决了我的问题:

from urllib import request
from urllib.request import urlopen

url = 'https://www.example.com/abc.json'
req = request.Request(url)
req.add_header('User-Agent', 'abc-bot')
response = request.urlopen(req)
于 2021-09-14T00:32:09.457 回答