所以我有一个子reddits列表,我正在使用urllib打开它们。当我经历他们时,urllib终于失败了:
urllib2.HTTPError: HTTP Error 429: Unknown
做了一些研究我发现reddit通过IP限制了对服务器的请求数量:
每两秒钟发出一次请求。突发请求有一些限制,但要保持理智。一般来说,一分钟内保持不超过30个请求。
所以我想我会使用time.sleep()
将请求限制为每10秒一页。这最终也失败了。
上面的引用是从reddit API页面抓取的。我没有使用reddit API。在这一点上,我在想两件事。该限制仅适用于reddit API或urllib也有限制。
有谁知道这两件事中的哪一件?或者我如何解决这个问题?
答案 0 :(得分: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
或Request。它会减轻服务器上的压力并加快请求速度:
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()
答案 1 :(得分:5)
reddit对IP地址和用户代理按请求(不是由Anonymous Coward连接为suggested)执行速率限制。您遇到的问题是,每个尝试使用urllib2访问reddit的人都将被限制为单个用户。
解决方案是设置一个用户代理,您可以在this question中找到答案。
或者,放弃编写自己的代码来抓取reddit并使用PRAW instead。它支持reddit API的几乎所有功能,您无需担心遵循任何API规则,因为它会为您解决这个问题。
答案 2 :(得分:0)
我遇到了同样的错误。改变了代码 ``来自urllib.request import urlopen 来自bs4 import BeautifulSoup
html = urlopen(url) bsObj =来自urllib.request import urlopen的BeautifulSoup(html){{1}} 来自bs4进口BeautifulSoup import urllib.request
webRequest = urllib.request.Request(url,headers = {" User-Agent":}) html = urlopen(webRequest) bsObj = BeautifulSoup(html)``