8

我已经在 Google App Engine 上运行了一个多月的 cron 作业,没有任何问题。这项工作做了很多事情,其中​​之一是它使用 urllib2 进行调用以从 Reddit 以及其他一些站点检索 json 响应。大约两周前,我在调用 Reddit 时开始看到错误,但在调用其他站点时没有错误。我收到的错误是 HTTP 错误 429。

我尝试在 Google App Engine 之外执行相同的代码并且没有任何问题。我尝试使用 urlFetch,但收到相同的错误。

通过以下代码使用应用程序引擎的交互式 shell时,您可以看到错误。

import urllib2
data = urllib2.urlopen('http://www.reddit.com/r/Music/.json', timeout=60)

编辑:不知道为什么它总是对我而不是其他人失败。这是我收到的错误:

>>> import urllib2
>>> data = urllib2.urlopen('http://www.reddit.com/r/Music/.json', timeout=60)
Traceback (most recent call last):
  File "/base/data/home/apps/s~shell-27/1.356011914885973647/shell.py", line 267, in get
    exec compiled in statement_module.__dict__
  File "<string>", line 1, in <module>
  File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 400, in open
    response = meth(req, response)
  File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 513, in http_response
    'http', request, response, code, msg, hdrs)
  File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 438, in error
    return self._call_chain(*args)
  File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 372, in _call_chain
    result = func(*args)
  File "/base/python27_runtime/python27_dist/lib/python2.7/urllib2.py", line 521, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 429: Unknown

在应用程序引擎之外运行的类似代码没有问题:

print urllib2.urlopen('http://www.reddit.com/r/Music/.json').read()

起初我认为它与超时问题有关,因为它最初可以工作,但由于没有超时错误而是奇怪的 HttpError 代码,我不确定。有任何想法吗?

4

2 回答 2

14

Reddit 对 python shell 的默认用户代理的 api 限制非常严格。您需要使用您的 reddit 用户名设置一个唯一的用户代理,如下所示:

用户代理:/u/spladug 的超级快乐天赋机器人

More info about the reddit api here https://github.com/reddit/reddit/wiki/API.

于 2012-09-06T12:19:55.163 回答
0

Reddit 可能会根据 IP 计算调用次数——这意味着 GAE 上共享您 IP 的其他应用程序可能已经用完配额。

如果您使用 Reddit API 密钥(我不知道他们是否发布它们)或者如果他们同意根据应用程序标头对 API 调用进行速率限制,这可能会变得更好。

于 2012-05-06T09:25:47.537 回答