Ошибка 429 при вызове Reddit API из Google App Engine

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

Решение

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

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

Больше информации о Reddit API здесь https://github.com/reddit/reddit/wiki/API.

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

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

Другие вопросы по тегам