tutorial python

En este post vamos a ver como comenzar a consumir webservices en python 3, para esto vamos a consumir un webservices (ws) de clima, en este caso voy a usar la siguiente página.

https://openweathermap.org/

para poder consumir, tienen que registrarse y crear una api para el consumo, son 60 peticiones diarias en la versión gratuita.

Consumir webservices en python – Método GET

Antes de comenzar, quiero recordar que existen 3 publicaciones antes de esta, si no sabes sobre python, dejare los links para que sepan que es y cómo dar los primeros pasos.

Consumir webservices

Para comenzar a consumir un webservices tenemos que importar las siguientes librerias

#!/usr/bin/env python3
import urllib.request
import urllib.parse
import http.client
import json

Anteriormente existían 2 librerías para consumir datos en internet, pero para python se unificaron para crear/quedar la librería urllib.

Urllib: si entramos a la liga anterior, vamos a ver que existen 4 funciones

  • request – Abre y lee peticiones url
  • error – contiene los errores generados de request
  • parse – herramienta para convertir url
  • robotparse – convierte archivos robots.txt (google)

Http.client: esta librería no la usamos ya que la llamada por el momento se hace con urllib, pero es una interfaz más compleja.

Json: es una librería para crear, manipular y decodificar archivos/llamadas de tipo json

si vamos a la documentación de python 3 y entramos en urllib.request , vamos a ver todas las funciones que tiene esta clase.

la principal es urlopen que funciona de la siguiente manera

urllib.request.urlopen(urldata=None[timeout]*cafile=Nonecapath=Nonecadefault=Falsecontext=None)

¡Tranquilos! vamos a usar solo unos cuantos parámetros, en especial vamos a usar url y tiempo, el parámetro de objeto es el tiempo de espera en la petición, es decir que si la pagina tarda mas de lo que le indicamos, este dará un error.

si imprimimos la siguiente línea con una petición que nos regresará un json

print(urllib.request.urlopen(«http://unprogramador.com»,timeout=30))

vamos a ver un objeto como el siguiente

<http.client.HTTPResponse object at 0x03C4DC90>

para esto vamos a usar la función json de python 3

f = urllib.request.urlopen(url,timeout=30)
djson = json.loads(f.read())

en la variable f guardamos el archivo que nos lanza el request, y usamos la función read() para poder leer el contenido, luego transformamos para que sea un lenguaje amigable.

la respuesta se vería de la siguiente manera, recordemos que en la url vamos a colocar la ruta de la api del clima

url = "http://api.openweathermap.org/data/2.5/weather?id=3995465&units=metric&APPID=152b1599f3e42d9d0f559bf3cf348a2b&lang=en"
f = urllib.request.urlopen(url,timeout=30)
djson = json.loads(f.read())
print(djson)

y la respuesta del json es la siguiente:

{‘coord’: {‘lon’: -100.32, ‘lat’: 25.67}, ‘weather’: [{‘id’: 721, ‘main’: ‘Haze’, ‘description’: ‘haze’, ‘icon’: ’50d’}], ‘base’: ‘stations’, ‘main’: {‘temp’: 25, ‘pressure’: 1012, ‘humidity’: 69, ‘temp_min’: 25, ‘temp_max’: 25}, ‘visibility’: 9656, ‘wind’: {‘speed’: 1, ‘deg’: 350}, ‘clouds’: {‘all’: 75}, ‘dt’: 1541004000, ‘sys’: {‘type’: 1, ‘id’: 4001, ‘message’: 0.0226, ‘country’: ‘MX’, ‘sunrise’: 1540990163, ‘sunset’: 1541030396}, ‘id’: 3995465, ‘name’: ‘Monterrey’, ‘cod’: 200}

Recordemos que python es un lenguaje multi-paradigma y todo lo que tenemos son objetos, cuando convertimos en json creamos un objeto con array, entonces si necesitamos consultar una variable se consulta como un arreglo

djson[‘coord’][‘lon’]
consumir webservices en python
pero hay casos donde tenemos más de una respuesta como en la opción weather, en estos casos realizamos lo siguiente:
print(djson[‘weather’][0][‘main’])
Nos regresara un tipo de clima la línea anterior, pero si nosotros queremos traducirlo podemos hacer un tipo de switch en python.

Función Switch en python

Bueno en resumidas cuentas, si ustedes buscan nunca encontrarán algo como el switch tradicional, en python no existe como tal, pero podemos crear algo similar gracias a las bondades de las librerías/duplas/objetos.

def sw(x):
    clima = {
        'Thunderstorm':'Tormenta',
        'Clouds':'Nublado',
        'Clear': 'Despejado',
        'Haze': 'Niebla'
        
    }
    return clima.get(x,x)

nosotros podemos ir ingresando los valores que queremos traducir o usar como un switch, al igual que el switch, tenemos que escribir exactamente qué va a evaluar.

la línea que vemos en return lo que hace es que la primera x es el valor que se busca, y la segunda x es en caso de no encontrar la palabra que va a enviar, un ejemplo más práctico de leer sería así:

return clima.get(x,»no existe esta palabra»)

 

para finalizar pondré todo el código para que pueda compilarlo y ver cómo funciona cada cosa, recuerden que pueden dejar algun comentario para sugerencias, dudas  u otra cosa!.

#!/usr/bin/env python3
import urllib.request
import urllib.parse
import http.client
import json
def sw(x):
    clima = {
        'Thunderstorm':'Tormenta',
        'Clouds':'Nublado',
        'Clear': 'Despejado',
        'Haze': 'Niebla',
        'Mist':'niebla'
        
    }
    return clima.get(x,x)
try:
    url = "http://api.openweathermap.org/data/2.5/weather?id=3995465&units=metric&APPID=152b1599f3e42d9d0f559bf3cf348a2b&lang=en"
    f = urllib.request.urlopen(url,timeout=30)
    djson = json.loads(f.read())
    print(djson['coord']['lon'])
    print(sw(djson['weather'][0]['main']))

except:
    print('error al consultar datos')

 

por Cesar Flores

Programador de tiempo completo, Gamer de medio tiempo y fotógrafo ocasionalmente, me gusta el front-end y mi framework favorito es angular aunque no por eso le hago el feo a un nuevo lenguaje.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.