problemas para obtener datos de FlightRadar24 con urllib2

Estoy tratando de obtener datos de FlightRadar24 usando el siguiente script, basado en esta respuesta para manejar las cookies. Cuando actualmente escribo esa URL en un navegador, obtengo un buen json largo o diccionario que incluye una lista de actualizaciones de lat / long / alt. Pero cuando bash el siguiente código, aparece el mensaje de error que se indica a continuación.

¿Qué debo hacer para leer correctamente el json en python?

NOTA : ese enlace puede dejar de funcionar en una o dos semanas; no hacen que los datos estén disponibles para siempre.

import urllib2 import cookielib jar = cookielib.FileCookieJar("cookies") opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar)) url = "http://lhr.data.fr24.com/_external/planedata_json.1.3.php?f=72c5ef5" response = opener.open(url) print response.headers print "Got page" print "Currently have %d cookies" % len(jar) print jar 

Seguimiento (última llamada más reciente): Archivo “[mypath] / test v00.py”, línea 8, en respuesta = opener.open (enlace) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2 .7 / urllib2.py “, línea 410, en respuesta abierta = método (requerido, respuesta) Archivo” /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py “, línea 523, en http_response ‘http’, request, response, code, msg, hdrs) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”, línea 448, devuelto por error. _call_chain (* args) Archivo “/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py”, línea 382, ​​en _call_chain result = func (* args) File “/ Library / Frameworks / Python.framework / Versions / 2.7 / lib / python2.7 / urllib2.py “, línea 531, en http_error_default raise HTTPError (req.get_full_url (), código, msg, hdrs, fp) HTTPError: HTTP Error 403: Forbidden

No estoy seguro de para qué necesita las cookies, pero el problema es que el servidor web está bloqueando el acceso al usuario-agente enviado por urllib en el encabezado de la solicitud (que es algo así como 'Python-urllib/2.7' o algo así).

Debe agregar un agente de usuario de navegador válido al encabezado para obtener los datos correctos. Ejemplo –

 import urllib2 url = "http://lhr.data.fr24.com/_external/planedata_json.1.3.php?f=72c5ef5" req = urllib2.Request(url, headers={"Connection":"keep-alive", "User-Agent":"Mozilla/5.0"}) response = urllib2.urlopen(req) jsondata = response.read() 

La primera respuesta de @AnandSKumar es la respuesta aceptada, pero aquí hay algunas líneas más que son útiles, ya que jsondata = response.read() devuelve una cadena.

NOTA : ese enlace puede dejar de funcionar en una o dos semanas; no hacen que los datos estén disponibles para siempre.

 import urllib2 import json import numpy as np import matplotlib.pyplot as plt # FROM this question: https://stackoverflow.com/a/32163003 # and THIS ANSWER: https://stackoverflow.com/a/32163003/3904031 # and a little from here: https://stackoverflow.com/a/6826511 url = "http://lhr.data.fr24.com/_external/planedata_json.1.3.php?f=72c5ef5" req = urllib2.Request(url, headers={"Connection":"keep-alive", "User-Agent":"Mozilla/5.0"}) response = urllib2.urlopen(req) the_dict = json.loads(response.read()) trail = the_dict['trail'] trailarray = np.array(trail) s0, s1 = len(trailarray)/3, 3 lat, lon, alt = trailarray[:s0*s1].reshape(s0,s1).T alt *= 10. # they drop the last zero # plot raw data of the trail. Note there are gaps - no time information here plt.figure() plt.subplot(2,2,1) plt.plot(lat) plt.hold plt.plot(lon) plt.title('raw lat lon') plt.subplot(2,2,3) plt.plot(alt) plt.title('raw alt') plt.subplot(1,2,2) plt.plot(lon, lat) plt.title('raw lat vs lon') plt.text(-40, 46, "this segment is") plt.text(-40, 45.5, "transatlantic") plt.text(-40, 45, "gap in data") plt.savefig('raw lat lon alt') plt.show() 

Para convertir la información de fecha y hora a forma humana:

 def humanize(seconds_since_epoch): """ from https://stackoverflow.com/a/15953715/3904031 """ return datetime.datetime.fromtimestamp(seconds_since_epoch).strftime('%Y-%m-%d %H:%M:%S') import datetime humanize(the_dict['arrival']) 

devoluciones

 '2015-08-20 17:43:50' 

raw lat lon alt