Vimos en el concepto anterior como podemos acceder a recursos de Internet desde Python. Un recurso muy común para transferir datos en Internet son los archivos con formato JSON.
La Biblioteca estándar de Python cuenta con un módulo que nos facilita trabajar con archivos JSON.
El formato JSON se lo puede transformar en Python a un diccionario. Por ejemplo:
import json cadena=""" { "codigo":"1", "descripcion":"papas", "precio":"13.45" } """ print(cadena) # imprimimos un string diccionario=json.loads(cadena) print(diccionario) # imprimimos un diccionario
De forma similar si disponemos de un vector, luego la transformación será a una lista con elementos de tipo diccionario:
import json cadena=""" [ { "codigo":"1", "descripcion":"papas", "precio":"13.45" }, { "codigo":"2", "descripcion":"manzanas", "precio":"45" } ] """ print(cadena) # imprimimos un string lista=json.loads(cadena) print(lista) # imprimimos una lista
Implementar un sitio WEB en PHP que retorne un archivo con formato JSON con los datos de diferentes artículos.
Para resolver el problema debemos tener un conocimiento del lenguaje PHP y del gestor de base de datos MySQL.
Cree una base de datos llamada 'pythonya' y una tabla 'articulos' con los siguientes datos:
CREATE TABLE `articulos` ( `codigo` int(11) NOT NULL AUTO_INCREMENT, `descripcion` varchar(50) DEFAULT NULL, `precio` float DEFAULT NULL, PRIMARY KEY (`codigo`) ); insert into `articulos` values (1,'papas',15); insert into `articulos` values (2,'manzanas',24); insert into `articulos` values (3,'peras',45.3); insert into `articulos` values (4,'naranjas',22); insert into `articulos` values (5,'pomelos',29); insert into `articulos` values (6,'frutillas',130); insert into `articulos` values (7,'anana',75);
Seguidamente proceda a codificar el siguiente archivo PHP que se conecta a la base de datos 'pythonya', recupera todas las filas de la tabla 'articulos' y finalmente retorna todos los datos en formato JSON:
<?php header('Content-Type: application/json'); $server="localhost"; $usuario="root"; $clave=""; $base="pythonya"; $conexion=mysqli_connect($server,$usuario,$clave,$base) or die("problemas") ; mysqli_set_charset($conexion,'utf8'); $datos = mysqli_query($conexion, "SELECT codigo, descripcion, precio from articulos"); $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC); echo json_encode($resultado); ?>
Si ya ha estudiado un poco de PHP sabe que al solicitar ésta página desde un navegador web lo que sucede es que retorna un archivo en formato JSON:
Ahora implementaremos una aplicación en Python que recupere y muestre los datos del archivo JSON generado en un servidor de Internet accediendo a una base de datos MySQL a través de PHP:
from urllib import request import json pagina=request.urlopen("http://localhost/pythonya/retornararticulos.php") datos=pagina.read().decode("utf-8") print(datos) # imprimimos un string print("_"*100) lista=json.loads(datos) # convertimos el string a una lista print(lista) # imprimimos una lista print("_"*100) for elemento in lista: print(f"{elemento['codigo']} {elemento['descripcion']:50} {elemento['precio']:>12}")
El resultado de ejecutar la aplicación (recuerde tener activo el servidor web con PHP y MySQL):
Importamos los módulos request y json:
from urllib import request import json
Solicitamos al servidor local (localhost) el recurso 'retornararticulos.php' localizado en la carpeta 'pythonya':
pagina=request.urlopen("http://localhost/pythonya/retornararticulos.php")
Leemos y decodificamos a formato 'utf-8':
datos=pagina.read().decode("utf-8")
La variable 'datos' es un string:
print(datos) # imprimimos un string
Mediante el método 'loads' del módulo 'json' transformamos el contenido del string en una lista con elementos de tipo diccionario:
lista=json.loads(datos) # convertimos el string a una lista
Imprimimos la lista completa:
print(lista) # imprimimos una lista
Hacemos una impresión de cada elemento de la lista con un formato más legible para el usuario:
for elemento in lista: print(f"{elemento['codigo']} {elemento['descripcion']:50} {elemento['precio']:>12}")
Ingresar por teclado el código de un artículo, seguidamente recuperar los datos de dicho artículo del servidor local. Pasar el código del artículo como parámetro 'GET' en la llamada.
La aplicación en PHP que recupera los datos de un determinado artículo que llega como parámetro es:
<?php header('Content-Type: application/json'); $server="localhost"; $usuario="root"; $clave=""; $base="pythonya"; $conexion=mysqli_connect($server,$usuario,$clave,$base) or die("problemas") ; mysqli_set_charset($conexion,'utf8'); $datos = mysqli_query($conexion, "SELECT codigo, descripcion, precio from articulos where codigo=$_GET[codigo]"); $resultado = mysqli_fetch_all($datos, MYSQLI_ASSOC); echo json_encode($resultado); ?>
Es importante notar que ahora recuperamos solo una fila de la tabla 'articulos', es decir aquel que coincide con el código de artículo pasado en la llamada:
$datos = mysqli_query($conexion, "SELECT codigo, descripcion, precio from articulos where codigo=$_GET[codigo]");
Ahora veamos el programa Python que llama a la página PHP anterior.
from urllib import request import json codigo=input("Ingrese el código de artículo a consultar:") pagina=request.urlopen(f"http://localhost/pythonya/retornarunarticulo.php?codigo={codigo}") datos=pagina.read().decode("utf-8") lista=json.loads(datos) if len(lista)>0: print(f"Descripción:{lista[0]['descripcion']}") print(f"Precio:{lista[0]['precio']}") else: print("No existe un artículo con el código ingresado")
El resultado de ejecutar la aplicación y cargar un código de artículo a consultar (recuerde tener activo el servidor web con PHP y MySQL):
Cuando nos conectamos al servidor le pasamos un parámetro llamado código y un número que ingresamos previamente por teclado:
codigo=input("Ingrese el código de artículo a consultar:") pagina=request.urlopen(f"http://localhost/pythonya/retornarunarticulo.php?codigo={codigo}")
Una vez que recuperamos los datos del servidor procedemos a convertir el string devuelto:
lista=json.loads(datos)
Si la lista no está vacía procedemos a mostrar la descripción y precio del artículo consultado:
if len(lista)>0: print(f"Descripción:{lista[0]['descripcion']}") print(f"Precio:{lista[0]['precio']}")
En caso contrario significa que intentamos consultar un código de artículo inexistente:
else: print("No existe un artículo con el código ingresado")
Confeccionar una aplicación visual con tkinter que permita mostrar todos los artículos. Recuperar del servidor web llamando al recurso 'retornararticulos.php'.
Disponer dos botones para poder navegar entre los distintos registros recuperados.
La interfaz visual debe ser similar a:
El sitio web
https://jsonplaceholder.typicode.com/
se puede utilizar para recuperar datos con diferentes formatos (JSON por ejemplo) y probar nuestros algoritmos.
Confeccionar una aplicación en Python que recupere el archivo JSON de la siguiente dirección web:
https://jsonplaceholder.typicode.com/posts
Nos retorna un archivo JSON con un formato similar a:
[ { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }, { "userId": 1, "id": 2, "title": "qui est esse", "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla" }]
Convertir los datos recuperados a una lista y mediante un for mostrar los atributos "userID", "id", "title" y "body".
Hacer la misma actividad que el problema anterior con el recurso que devuelve la dirección:
https://jsonplaceholder.typicode.com/users
Nos retorna un archivo JSON con un formato similar a:
[ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, { "id": 2, "name": "Ervin Howell", "username": "Antonette", "email": "Shanna@melissa.tv", "address": { "street": "Victor Plains", "suite": "Suite 879", "city": "Wisokyburgh", "zipcode": "90566-7771", "geo": { "lat": "-43.9509", "lng": "-34.4618" } }, "phone": "010-692-6593 x09125", "website": "anastasia.net", "company": { "name": "Deckow-Crist", "catchPhrase": "Proactive didactic contingency", "bs": "synergize scalable supply-chains" } } ]
Convertir los datos recuperados a una lista y mediante un for mostrar todos los atributos.
ejercicio342.py from urllib import request import json import tkinter as tk from tkinter import ttk class Aplicacion: def __init__(self): self.ventana1=tk.Tk() self.label1=ttk.Label(text="Código:", width=25) self.label1.grid(column=0, row=0, padx=10, pady=10) self.label2=ttk.Label(text="", width=25) self.label2.grid(column=1, row=0, padx=10, pady=10) self.label3=ttk.Label(text="Descripción:", width=25) self.label3.grid(column=0, row=1, padx=10, pady=10) self.label4=ttk.Label(text="", width=25) self.label4.grid(column=1, row=1, padx=10, pady=10) self.label5=ttk.Label(text="Precio:", width=25) self.label5.grid(column=0, row=2, padx=10, pady=10) self.label6=ttk.Label(text="", width=25) self.label6.grid(column=1, row=2, padx=10, pady=10) self.boton1=ttk.Button(self.ventana1, text="Anterior", command=self.anterior, width=25) self.boton1.grid(column=0, row=3, padx=10, pady=10) self.boton2=ttk.Button(self.ventana1, text="Siguiente", command=self.siguiente, width=25) self.boton2.grid(column=1, row=3, padx=10, pady=10) self.articulos=[] self.recuperar_articulos() self.indice=0 self.mostrar_articulo() self.ventana1.mainloop() def anterior(self): if self.indice>0: self.indice-=1 self.mostrar_articulo() def siguiente(self): if self.indice<len(self.articulos)-1: self.indice+=1 self.mostrar_articulo() def recuperar_articulos(self): pagina=request.urlopen("http://localhost/pythonya/retornararticulos.php") datos=pagina.read().decode("utf-8") self.articulos=json.loads(datos) def mostrar_articulo(self): if len(self.articulos)>0: self.label2.config(text=self.articulos[self.indice]['codigo']) self.label4.config(text=self.articulos[self.indice]['descripcion']) self.label6.config(text=self.articulos[self.indice]['precio']) aplicacion1=Aplicacion() ejercicio343.py from urllib import request import json pagina=request.urlopen("https://jsonplaceholder.typicode.com/posts") datos=pagina.read().decode("utf-8") lista=json.loads(datos) for elemento in lista: print("userId:",elemento['userId']) print("Id:",elemento['id']) print("title:",elemento['title']) print("body:",elemento['body']) print("_"*80) ejercicio344.py from urllib import request import json pagina=request.urlopen("https://jsonplaceholder.typicode.com/users") datos=pagina.read().decode("utf-8") lista=json.loads(datos) print(lista) for elemento in lista: print("id:",elemento['id']) print("name:",elemento['name']) print("username:",elemento['username']) print("email:",elemento['email']) print("street:",elemento["address"]["street"]) print("suite:",elemento["address"]["suite"]) print("city:",elemento["address"]["city"]) print("zipcode:",elemento["address"]["zipcode"]) print("lat:",elemento["address"]["geo"]["lat"]) print("lng:",elemento["address"]["geo"]["lng"]) print("phone:",elemento['phone']) print("website:",elemento['website']) print("company name:",elemento["company"]["name"]) print("catchPhrase:",elemento["company"]["catchPhrase"]) print("bs:",elemento["company"]["bs"]) print("_"*80)