所以,我有子reddits的名单,我使用的urllib打开它们。 当我经过他们最终的urllib失败:
urllib2.HTTPError: HTTP Error 429: Unknown
做一些研究,我发现,reddit的限制了IP请求到他们的服务器的ammount的:
毫无多个请求每两秒钟。 这里也有一些津贴请求的突发状况,但保持清醒。 在一般情况下,保持它在一分钟内不超过30名的请求。
所以,我想我会使用time.sleep()
我的申请限制在一个页面每10秒。 这最终失败一样好。
该帖以上是从抓住reddit的API页面。 我不使用的reddit的API。 在这一点上,我想两件事情。 如果不是这样的限制仅适用于reddit的API或urllib的也是有限制的。
有谁知道这两件事情它是哪一个? 或如何,我可以去解决这个问题?
从https://github.com/reddit/reddit/wiki/API :
许多默认的用户代理(如“巨蟒/ 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()
书签交易执行速率通过请求限制(如不连接建议用于两个IP地址和用户代理通过匿名懦夫)。 你碰到的问题是,大家谁试图使用的urllib2将速率限制为单个用户访问reddit的。
解决的办法是设置一个用户代理,你可以找到在回答这个问题 。
或者,放弃编写自己的代码来抓取Reddit和使用PRAW代替 。 它支持reddit的API的几乎所有功能,你不用担心任何之后的API规则,因为它负责的是你。
我遇到同样的error.changing从``从urllib.request里进口的urlopen从BS4进口BeautifulSoup代码
HTML =的urlopen(URL)bsObj = BeautifulSoup(HTML) to
从BS4进口BeautifulSoup进口urllib.request里urllib.request里导入的urlopen
的WebRequest = urllib.request.Request(URL,标题= { “用户代理”:})HTML =的urlopen(的WebRequest)bsObj = BeautifulSoup(HTML)``