urllib2 HTTP错误429
所以我有一个列表,我正在使用urllib来打开它们。当我浏览它们时,最终urllib失败了:
urllib2.HTTPError: HTTP Error 429: Unknown
经过研究,我发现reddit通过IP限制了对服务器的请求数量:
每两秒提出一个请求。突发请求有一定的余地,但请保持理智。通常,一分钟内不要超过30个请求。
因此,我认为我通常会time.sleep()
每10秒将请求限制为一页。最终也会失败。
以上引用来自reddit API页面。我没有使用reddit
API。在这一点上,我正在考虑两件事。该限制仅适用于reddit API或urllib也有限制。
有人知道这是哪两种吗?或者我该如何解决这个问题?
-
从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()
但是,这将为每个请求创建一个新的连接。我建议用另一种库,能够重新使用连接的
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()