当前位置: 首页 > 知识库问答 >
问题:

带有网址 2 的 Python HTTP 错误 429

麹耘豪
2023-03-14

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

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

不幸的是,我有时会得到 HTTP 错误: HTTP 错误 429: 太多的请求.解决这个问题的好方法是什么?以下是好的还是有更好的方法。

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

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

共有3个答案

梁丘兴腾
2023-03-14

添加用户代理到请求标头解决了我的问题:

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)
柯国安
2023-03-14

这是处理异常的好方法,但您应该检查以确保您在给定网站的请求之间始终处于适当的睡眠状态(例如,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,我发布的代码只是如何编写嵌套的尝试/捕获的参考示例

洪河
2023-03-14

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

 类似资料:
  • 问题内容: 我有一个URL 。当我添加此文件时 现在将允许我使用链接。但是我该怎么做呢? 另外,我怎样才能使这个网址?谢谢。对不起,我还比较陌生。 问题答案: 感谢您的想法@denoise和@mogosselin。也可以使用@stslavik指出我的代码示例的某些缺点。 这是我的方法: 通过使用我得到的链接 而 这是我的目标。我只会用PHP做其他事情。

  • 问题内容: 我有一个使用NodeJS,MongoDB(以Mongoose作为驱动程序)和ExpressJS的完整Web应用程序。 该项目可以在我的本地计算机上完美运行。今天,我决定将一切都投入生产。我正在使用Google App Engine托管我的应用程序,并使用Compose(以前是MongoHQ)托管我的数据库。 尽管我的API似乎不起作用,但App Engine可以完美地为我的应用程序提供

  • 上可用的方法只接受字符串:

  • 有人能帮我做这个吗? 我不知道错误是什么,也不知道我应该如何修复它。任何帮助都很感激

  • 我需要监听一个活动的mq并调用rest post api来获取作为正文接收的数据,为此我创建了一个简单的spring Boot2.x应用程序,并试图启动一个路由器,但应用程序无法启动。 我对注册路由器的理解是用@Component来注册一个类,它应该实现camel RouteBuilder > JDK 1.8 Spring Boot版本2.2.6。发行版 骆驼版本2.24.0 Pom xml