Flo*_*ciu 9 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也有限制.
有谁知道这两件事中的哪一件?或者我如何解决这个问题?
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()
但是,这将为每个请求创建一个新连接.我建议用另一种库,能够重新使用连接的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()