urllib2 HTTP错误429

Flo*_*ciu 9 python urllib2 reddit http-status-code-429

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

urllib2.HTTPError: HTTP Error 429: Unknown
Run Code Online (Sandbox Code Playgroud)

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

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

所以我想我time.sleep()每隔10秒就会将请求限制在一个页面上.这最终也失败了.

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

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

Ano*_*ard 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()
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)


bbo*_*boe 5

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

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

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