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

urllib2 HTTP错误429

景麒
2023-03-14

所以我有一个sub-reddits列表,我用urllib打开它们。在我仔细研究之后,urllib最终失败了:

urllib2.HTTPError: HTTP Error 429: Unknown

做了一些研究,我发现reddit通过IP限制了对其服务器的请求数量:

每两秒钟不要提出超过一个请求。请求的突发有一定的空间,但要保持理智。一般来说,一分钟内不要超过30个请求。

所以我想我应该使用time.sleep()将我的请求限制在每10秒一页。这最终也失败了。

上面的引用是从reddit API页面获取的。我没有使用reddit API。在这一点上,我在想两件事。要么该限制仅适用于reddit API,要么urllib也有限制。

有人知道这两个东西是哪一个吗?或者我该如何解决这个问题?

共有3个答案

万阳嘉
2023-03-14

我也遇到了同样的错误。更改代码

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen(url)
bsObj = BeautifulSoup(html)

from urllib.request import urlopen
from bs4 import BeautifulSoup
import urllib.request

webRequest = urllib.request.Request(url, headers={"User-Agent": <you username in case you are scraping reddit>})
html = urlopen(webRequest)
bsObj = BeautifulSoup(html)

解决了问题

於乐
2023-03-14

Reddit通过请求(而不是匿名懦夫建议的连接)对IP地址和用户代理执行速率限制。您遇到的问题是,每个尝试使用urllib2访问reddit的人都将作为单个用户受到速率限制。

解决方案是设置一个用户代理,您可以在这个问题中找到答案。

或者,放弃编写自己的代码来抓取reddit,而使用PRAW。它支持reddit的API的几乎所有特性,你不必担心遵循任何API规则,因为它会为你处理这些。

崔恺
2023-03-14

从 https://github.com/reddit/reddit/wiki/API:

许多默认的用户代理(如Python/urllib或Java)都受到严格限制,以鼓励唯一和描述性的用户代理字符串。

这也适用于常规请求。在发出请求时,您需要提供自己的用户代理标头。

#TODO: change user agent string
hdr = { 'User-Agent' : 'super happy flair bot by /u/spladug' }
req = urllib2.Request(url, headers=hdr)
html = urllib2.urlopen(req).read()

但是,这将为每个请求创建一个新的连接。我建议使用另一个能够重用连接的库,例如< code>httplib或Request。这将减轻服务器的压力,加快请求速度:

import httplib
import time

lst = """
science
scifi
"""

hdr= { 'User-Agent' : 'super happy flair bot by /u/spladug' }
conn = httplib.HTTPConnection('www.reddit.com')
for name in lst.split():
    conn.request('GET', '/r/'+name, headers=hdr)
    print conn.getresponse().read()
    time.sleep(2)
conn.close()
 类似资料:
  • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示:

  • 我得到了这个错误,有什么想法会导致它吗?我试图发送一个DTO,它有一个扩展抽象类的对象列表,我想这个问题可能是因为DTO中的列表,还是因为抽象类的子类?

  • 在月食中, ”org.apache.axis2。AxisFault:传输错误: 403错误:禁止”试图从svn检出项目时发生错误。我不能实现这个错误,因此我检查了从终端使用"svn-co"命令的项目。 但是,有趣的是,当我试图在Eclipse中运行应用程序时,在输入凭据(用户名和密码)并按下“登录”按钮之后,我又遇到了相同的错误。响应是JFrame上的无效用户名/密码,但凭据没有错误。这只发生在日

  • Errors 错误 Library routines must often return some sort of error indication to the caller. As mentioned earlier, Go’s multivalue return makes it easy to return a detailed error description alongside th

  • 本章概述了Google API错误模型,以及开发人员如何正确生成和处理错误的一般指南。 Google API使用简单的协议无关错误模型,这使我们能够在不同的API,API协议(如gRPC或HTTP)以及错误上下文(例如,异步,批处理或工作流错误)中获得一致的体验。 错误模型 错误模型在逻辑上由google.rpc.Status定义,当API发生错误时,返回一个Status实例给客户端。 以下代码段

  • 5.4. 错误 在Go中有一部分函数总是能成功的运行。比如strings.Contains和strconv.FormatBool函数,对各种可能的输入都做了良好的处理,使得运行时几乎不会失败,除非遇到灾难性的、不可预料的情况,比如运行时的内存溢出。导致这种错误的原因很复杂,难以处理,从错误中恢复的可能性也很低。 还有一部分函数只要输入的参数满足一定条件,也能保证运行成功。比如time.Date函数