Ошибка 429 при вызове Reddit api из Google App Engine - PullRequest
8 голосов
/ 22 января 2012

Я больше месяца без проблем запускаю задание cron в Google App Engine.Эта работа делает множество вещей, одна из которых заключается в том, что она использует urllib2 для вызова, чтобы получить ответ json от Reddit, а также от нескольких других сайтов.Около двух недель назад я начал видеть ошибки при вызове Reddit, но никаких ошибок при вызове других сайтов.Я получаю ошибку HTTP error 429.

Я пытался выполнить тот же код за пределами Google App Engine, и у меня нет проблем.Я пытался использовать urlFetch, но получаю ту же ошибку.

Вы можете увидеть ошибку, когда используете интерактивную оболочку движка приложения со следующим кодом.

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, я не уверен.Есть идеи?

Ответы [ 2 ]

13 голосов
/ 06 сентября 2012

Скорость Reddit довольно сильно ограничивает API для пользовательского агента по умолчанию для оболочки Python. Вам необходимо установить уникальный пользовательский агент с вашим именем пользователя reddit, например:

Пользователь-агент: супер радостный бот от / u / spladug

Подробнее о API Reddit здесь https://github.com/reddit/reddit/wiki/API.

0 голосов
/ 06 мая 2012

Возможно, что Reddit считает звонки на основе IP-адреса - это означает, что другие приложения на GAE, которые совместно используют ваш IP-адрес, возможно, уже исчерпали квоту.

Это может стать лучше, если вы используете ключи Reddit API (я не знаю, выдают ли они их) или если они согласны ограничить количество вызовов API на основе заголовка приложения.

...