2012-01-22 26 views
8

He estado ejecutando un trabajo cron en Google App Engine durante más de un mes sin problemas. El trabajo hace una variedad de cosas, una es que usa urllib2 para hacer una llamada para recuperar una respuesta json de Reddit así como de algunos otros sitios. Hace aproximadamente dos semanas empecé a ver errores al invocar Reddit, pero no hubo errores al invocar a los otros sitios. El error que estoy recibiendo es HTTP error 429.Error 429 al invocar Reddit api desde Google App Engine

He intentado ejecutar el mismo código fuera de Google App Engine y no tengo ningún problema. Intenté usar urlFetch, pero recibí el mismo error.

Puede ver el error al usar la aplicación engine's interactive shell con el siguiente código.

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

Editar: No estoy seguro de por qué siempre falla para mí y no para otra persona. Este es el error que recibo:

>>> 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 

código similar que se ejecuta fuera del motor de aplicación sin ningún problema:

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

Al principio pensé que tenía que ver con un problema de tiempo de espera, ya que estaba trabajando originalmente , pero como no hay un error de tiempo de espera sino un código HttpError extraño, no estoy seguro. Alguna idea?

+0

Usar el shell interactivo y el código que ha proporcionado me funciona. – cheeken

+6

Simplemente significa que está haciendo demasiadas solicitudes. No hay nada que puedas hacer como programador. Para evitar estos errores, generalmente puede poner un descanso entre las solicitudes. http://tools.ietf.org/html/draft-nottingham-http-new-status-02#page-4 –

+0

@ user947240: siga los consejos de shadyabhi. – RanRag

Respuesta

13

La velocidad de reddit limita la API bastante severamente para el agente de usuario predeterminado para el shell de python. Es necesario configurar un agente de usuario único con su nombre de usuario reddit en ella, así:

User-Agent: super feliz estilo bot/u/spladug

Más información sobre la API de reddit aquí https://github.com/reddit/reddit/wiki/API.

+0

Esta debería ser la respuesta aceptada.Directamente de la documentación en ese enlace "Muchos Agentes de usuario predeterminados (como" Python/urllib "o" Java ") están drásticamente limitados para fomentar cadenas de agente de usuario únicas y descriptivas". – yiati

0

Es posible que Reddit esté contando llamadas basadas en IP, lo que significa que otras aplicaciones en GAE que comparten su IP ya pueden estar agotando la cuota.

Esto podría mejorar si utiliza las claves de Reddit API (no sé si las emiten) o si aceptan calificar las llamadas a la API de límite basadas en el encabezado de la aplicación.

+0

Sudhir, esto es solo especulación. – Jason

+1

Sí ... lo fue. Yo no creo que la respuesta se exprese como una certeza. –