Python - Petición datos web

 
Vista:
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 02/05/2019 15:59:09
Hola,

soy novato en programación con Python. Tengo que programar una función (def) que retorne el estado meteorológico actual en una cierta localización, definida por su código postal (zip code) y código de país (us, uk, es, etc). La función debe devolver una lista de tuplas de dos elementos, correspondientes al resumen del estado actual del tiempo (weather.main) y a la descripción extendida (weather.description). Hay que usar la API de https://openweathermap.org/api para obtener las predicciones. Se debe utilizar una API key para realizar el algoritmo. Puede usarse la clave d54f26dbcf6d4136bc0ef8ba5f07825b.

¿Alguien sabe cómo debería realizarse? Agradecería un pequeño comentario de cada línea del algoritmo que explique qué es lo que hace.

Un saludo y gracias por adelantado.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
-1
Responder
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 02/05/2019 21:09:53
En adición al ejercicio anterior, y como continuación del mismo, tengo que modificar la función del ejercicio anterior para que reciba como input una dirección en concreto y devuelva la misma información (el estado meteorológico debe ser devuelto como una lista de tuplas de dos elementos, correspondientes al resumen del estado actual del tiempo (weather.main) y a la descripción extendida (weather.description). En este caso, openweathermap no funcion directamente con direcciones, por lo que hay que utilizar la API de Google maps (https://developers.google.com/maps/documentation/), para convertir las direcciones a localizaciones (latitud, longitud). Se puede usar como API key de Google la siguiente: AlzaSyA8MWitYiTSo9jBLrqp3c4lwHiilXxDYDo.

Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 04/05/2019 13:48:19
Respecto a la primera parte del ejercicio, tengo hecho lo siguiente, pero no me funciona:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
 
def meteorologia():
 
    zip_code = raw_input("Introduce un código postal: ")
 
    pais = raw_input("Introduce un código de país: ")
 
    parametros = {"zip%20code": "zip_code", "country%20code": "pais"}
 
    response = requests.get('http://api.openweathermap.org/data/2.5/weather?, params=parametros&      appid=2574c722074c3bad1953f20dc0257130')
 
    print response.content
 
meteorologia()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 05/05/2019 14:23:12
Investigando he encontrado la manera de realizar la primera parte del ejercicio de este post. El código sería:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
import json
 
API_key = '2574c722074c3bad1953f20dc0257130'
base_url = "http://api.openweathermap.org/data/2.5/weather?"
 
zip_code = input("Enter a Zip code and country code : ")
 
Final_url = base_url + "appid=" + API_key + "&zip=" + zip_code
 
weather_data = requests.get(Final_url).json()
 
print("\nCurrent Weather Data Of " + zip_code +":\n")
 
print(weather_data)

Sin embargo, si introduzco un zip_code (por ejemplo 28027,es) sale el siguiente mensaje de error:

NameError Traceback (most recent call last)
<ipython-input-2-66ffd4e91edb> in <module>()
6 base_url = "http://api.openweathermap.org/data/2.5/weather?"
7
----> 8 zip_code = input("Enter a Zip code and country code : ")
9
10 Final_url = base_url + "appid=" + API_key + "&zip=" + zip_code

/usr/lib/python2.7/dist-packages/IPython/kernel/zmq/ipkernel.pyc in <lambda>(prompt)
362 if content.get('allow_stdin', False):
363 raw_input = lambda prompt='': self._raw_input(prompt, ident, parent)
--> 364 input = lambda prompt='': eval(raw_input(prompt))
365 else:
366 raw_input = input = lambda prompt='' : self._no_raw_input()

/usr/lib/python2.7/dist-packages/IPython/kernel/zmq/ipkernel.pyc in <module>()

NameError: name 'es' is not defined

¿Alguna idea de cómo solucionarlo? ¿Y alguna idea para la segunda parte del ejercicio de este post?

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 18
Ha disminuido su posición en 3 puestos en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Joan (4 intervenciones) el 05/05/2019 20:56:18
Hola Toni, a mi no me da ningún error y me funciona perfectamente... he puesto el codigo postal 08320 y me ha devuelto:

{'coord': {'lon': -75.22, 'lat': 39.38}, 'weather': [{'id': 501, 'main': 'Rain', 'description': 'moderate rain', 'icon': '10d'}, {'id': 701, 'main': 'Mist', 'description': 'mist', 'icon': '50d'}], 'base': 'stations', 'main': {'temp': 286.5, 'pressure': 1006, 'humidity': 100, 'temp_min': 284.82, 'temp_max': 288.15}, 'visibility': 4828, 'wind': {'speed': 3.6, 'deg': 50}, 'rain': {'1h': 1.02}, 'clouds': {'all': 90}, 'dt': 1557082574, 'sys': {'type': 1, 'id': 4902, 'message': 0.0081, 'country': 'US', 'sunrise': 1557050257, 'sunset': 1557100648}, 'id': 420024541, 'name': 'Millville', 'cod': 200}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 05/05/2019 21:05:27
Hola Joan,

no te lo ha hecho bien. Fíjate que las coordenadas, el country y el name son de USA (es lo que devuelve por defecto la web si no se introducen los parámetros). En mi caso, lo que habría que introducir como zip_code es 08530,es (el código postal,una coma y el código del país). Poniéndolo así es como me da el error (no sé cómo introducir estos parámetros).

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Joan
Val: 18
Ha disminuido su posición en 3 puestos en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Joan (4 intervenciones) el 06/05/2019 07:37:07
Hola Toni, no muestras como lo haces, pero a mi me funciona perfectamente... tu código postal con el país España devuelve:

{'coord': {'lon': 2.29, 'lat': 41.68}, 'weather': [{'id': 803, 'main': 'Clouds', 'description': 'broken clouds', 'icon': '04d'}], 'base': 'stations', 'main': {'temp': 281.1, 'pressure': 1018, 'humidity': 87, 'temp_min': 274.82, 'temp_max': 285.93}, 'visibility': 10000, 'wind': {'speed': 0.5}, 'clouds': {'all': 75}, 'dt': 1557120999, 'sys': {'type': 1, 'id': 6414, 'message': 0.0057, 'country': 'ES', 'sunrise': 1557117699, 'sunset': 1557168796}, 'id': 50019864, 'name': 'Mataró', 'cod': 200}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 06/05/2019 08:21:33
Buenos días Joan,

cuando el programa te pregunta: Enter a Zip code and country code :
¿introduces 08530,es y te funciona? Yo uso Python 2.7
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de joel
Val: 2.732
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por joel (622 intervenciones) el 06/05/2019 09:52:38
Ahi esta el problema... si utilizas python2.7, tienes que cambiar el input() por raw_input()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 06/05/2019 10:46:17
Ok, gracias.

¿Alguna idea de cómo resolver la segunda parte del ejercicio? La vuelvo a exponer:

En adición al ejercicio anterior, y como continuación del mismo, tengo que modificar la función del ejercicio anterior para que reciba como input una dirección en concreto y devuelva la misma información (el estado meteorológico debe ser devuelto como una lista de tuplas de dos elementos, correspondientes al resumen del estado actual del tiempo (weather.main) y a la descripción extendida (weather.description). En este caso, openweathermap no funciona directamente con direcciones, por lo que hay que utilizar la API de Google maps (https://developers.google.com/maps/documentation/), para convertir las direcciones a localizaciones (latitud, longitud). Se puede usar como API key de Google la siguiente: AlzaSyA8MWitYiTSo9jBLrqp3c4lwHiilXxDYDo.

Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 66
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Petición datos web

Publicado por Toni (35 intervenciones) el 06/05/2019 20:26:24
Vale, ya he modificado el código, quedándome así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def meteorologia():
 
    import requests
 
    import json
 
    API_key = "2574c722074c3bad1953f20dc0257130"
 
    base_url = "http://api.openweathermap.org/data/2.5/weather?"
 
    zip_code = raw_input("Introduce un código Zip y el código del país : ")
 
    Final_url = base_url + "appid=" + API_key + "&zip=" + zip_code
 
    response = requests.get(Final_url).json()
 
    print response
 
meteorologia()

Introduciendo el zip_code 08530,es obtengo lo siguiente:

{u'clouds': {u'all': 40}, u'name': u'Matar\xf3', u'visibility': 10000, u'sys': {u'country': u'ES', u'sunset': 1557168796, u'message': 0.0064, u'type': 1, u'id': 6414, u'sunrise': 1557117699}, u'weather': [{u'main': u'Clouds', u'id': 802, u'icon': u'03d', u'description': u'scattered clouds'}], u'coord': {u'lat': 41.68, u'lon': 2.29}, u'base': u'stations', u'dt': 1557166432, u'main': {u'pressure': 1017, u'temp_min': 286.48, u'temp_max': 290.93, u'temp': 288.77, u'humidity': 55}, u'id': 50019864, u'wind': {u'speed': 3.1, u'deg': 140}, u'cod': 200}

De este resultado, ahora me interesa devolver una lista de tuplas de dos elementos, correspondientes al resumen del estado actual del tiempo (weather.main) y a la descripción extendida (weather.description). ¿Cómo debo modificar el código para que me lo realice?

Gracias de nuevo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar