10

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

urllib2.HTTPError: HTTP Error 429: Unknown

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

每两秒发出不超过一个请求。有一些请求突发的余地,但要保持理智。一般来说,保持在一分钟内不超过 30 个请求。

所以我想我会使用time.sleep()将我的请求限制为每 10 秒一页。这最终也会失败。

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

有谁知道这是这两件事中的哪一件?或者我该如何解决这个问题?

4

3 回答 3

19

来自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()
于 2012-11-03T22:13:41.820 回答
5

reddit对 IP 地址和用户代理按请求(不是 Anonymous Coward建议的连接)执行速率限制。您遇到的问题是,尝试使用 urllib2 访问 reddit 的每个人都将被限制为单个用户。

解决方案是设置一个用户代理,您可以在这个问题中找到答案。

或者,放弃编写自己的代码来爬取 reddit 并改用PRAW。它支持 reddit API 的几乎所有功能,您不必担心遵循任何 API 规则,因为它会为您处理这些。

于 2012-11-04T07:08:07.967 回答
0

我遇到了同样的错误。更改代码

from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen(url)
bsObj = BeautifulSoup(html)

from urllib.request import urlopen
from bs4 import BeautifulSoup
import urllib.request

webRequest = urllib.request.Request(url, headers={"User-Agent": <you username in case you are scraping reddit>})
html = urlopen(webRequest)
bsObj = BeautifulSoup(html)

解决了这个问题

于 2018-06-06T06:45:12.290 回答