urllib2 HTTP错误429

发布于 2021-01-29 15:21:47

所以我有一个列表,我正在使用urllib来打开它们。当我浏览它们时,最终urllib失败了:

urllib2.HTTPError: HTTP Error 429: Unknown

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

每两秒提出一个请求。突发请求有一定的余地,但请保持理智。通常,一分钟内不要超过30个请求。

因此,我认为我通常会time.sleep()每10秒将请求限制为一页。最终也会失败。

以上引用来自reddit API页面。我没有使用reddit
API。在这一点上,我正在考虑两件事。该限制仅适用于reddit API或urllib也有限制。

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

关注者
0
被浏览
180
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看