urllib2 HTTP错误429

时间:2012-11-03 20:10:27

标签: python urllib2 reddit http-status-code-429

所以我有一个子reddits列表,我正在使用urllib打开它们。当我经历他们时,urllib终于失败了:

urllib2.HTTPError: HTTP Error 429: Unknown

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

  

每两秒钟发出一次请求。突发请求有一些限制,但要保持理智。一般来说,一分钟内保持不超过30个请求。

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

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

有谁知道这两件事中的哪一件?或者我如何解决这个问题?

3 个答案:

答案 0 :(得分:18)

来自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()

但是,这将为每个请求创建一个新连接。我建议使用另一个能够重用连接的库,例如httplibRequest。它会减轻服务器上的压力并加快请求速度:

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()

答案 1 :(得分:5)

reddit对IP地址和用户代理按请求(不是由Anonymous Coward连接为suggested)执行速率限制。您遇到的问题是,每个尝试使用urllib2访问reddit的人都将被限制为单个用户。

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

或者,放弃编写自己的代码来抓取reddit并使用PRAW instead。它支持reddit API的几乎所有功能,您无需担心遵循任何API规则,因为它会为您解决这个问题。

答案 2 :(得分:0)

我遇到了同样的错误。改变了代码 ``来自urllib.request import urlopen  来自bs4 import BeautifulSoup

html = urlopen(url)  bsObj =来自urllib.request import urlopen的BeautifulSoup(html){{1}} 来自bs4进口BeautifulSoup import urllib.request

webRequest = urllib.request.Request(url,headers = {" User-Agent":}) html = urlopen(webRequest)  bsObj = BeautifulSoup(html)``