Enunciado y solución de ejercicios resueltos en Python: web scraping. Se incluye la descarga del código fuente completo de los ejercicios en Python. Se pedirá que se desarrolle un programa Python que acceda a una determinada web, obtenga unos datos concretos y muestre un sesgo de estos datos con un formato determinado. En el ejercicio se pide al usuario que capture todos los posibles errores que se puedan producir, por lo que también es un ejemplo de captura de errores.
Ejercicio resuelto Python: web scraping
Enunciado del ejercicio Python
Realizar un script Python que obtenga la información del sitio web: https://www.ign.es/web/ign/portal/ultimos-terremotos/-/ultimos-terremotos/get30dias y que realice las siguientes funciones:
- Que obtenga y almacene en una variable el nombre de los terremotos sentidos de los últimos 30 días (columna “Evento” de la tabla Terremotos sentidos de los últimos 30 días en el área de la Península Ibérica e Islas Canarias).
- Que almacene el valor de la magnitud de cada evento sísmico (columna “Magnitud”).
- Que imprima por pantalla los datos de manera que el formato sea similar al siguiente:
1 2 3 4 |
EVENTO MAGNITUD es2024jagif 1.5 es2024iyigr 2.7 es2024ixsdl 2.3 |
Para la conexión con el servidor web indicado se se recomienda el uso del paquete request y para la obtención y el tratamiento de la información se recomienda el uso del paquete bs4 y BeautifulSoup.
Intentar realizar todos las capturas de errores posibles, al menos en los casos en los que:
- Se produce un error al conectar al servidor.
- No se ha obtenido contenido HTML.
- No se ha obtenido la tabla.
- No se han obtenido las columnas de la tabla.
Solución del ejercicio en Python
La solución propuesta al ejercicio 1, como ejemplo de uso de web scraping en Python, podría ser:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
from bs4 import BeautifulSoup import requests try: # Conectamos con el servidor web indicado conServidorWeb = None conServidorWeb = requests.get("https://www.ign.es/web/ign/portal/ultimos-terremotos/-/ultimos-terremotos/get30dias") if conServidorWeb != None: # Obtenemos el contenido HTML de la web contenidoHTML = None contenidoHTML = BeautifulSoup(conServidorWeb.content, "html.parser") if contenidoHTML != None and contenidoHTML != "": # Buscamos y obtenemos la primera tabla que aparezca en la web (es la única) tabla = None tabla = contenidoHTML.find("table") if tabla != None and tabla != "": # Obtenemos todas las fila de la tabla (etiqueta "tr") filasTabla = None filasTabla = tabla.find_all("tr") if filasTabla != None and filasTabla != "": # Definimos el diccionario que contendrá las columnas de Evento y Magnitud eventos_magnitudes = {} for filaActual in filasTabla: # Obtenemos todas las columnas de la tabla (etiqueta "td") columnas = filaActual.find_all("td") # Si ha encontrado una columna o más if len(columnas) >= 1: # Obtenemos la primera columna, que es la de Evento evento = columnas[0].get_text() # Obtenemos la columna 7, que es la de Magnitud magnitud = columnas[6].get_text() # Guardamos en el diccionario los valores obtenidos eventos_magnitudes[evento] = magnitud # Mostramos el resultado formateado en columnas print (f"{"EVENTO":18}MAGNITUD") for evento, magnitud in eventos_magnitudes.items(): print (f"{evento:18}{magnitud}") else: print("No se ha obtenido columna en la tabla") else: print("No se ha obtenido ninguna tabla") else: print("No se ha obtenido información HTML de la web") else: print("No se ha podido conectar con el servidor web") except Exception as e: print(f"Error al conectar al servidor web: {e}") finally: # Cerramos la conexión con el servidor if conServidorWeb != None: conServidorWeb.close |
Ejemplo de ejecución del ejercicio en Python
La compilación del ejercicio 1, dará como resultado:
En el caso de que no haya conexión con el servidor web, capturará el error y lo mostrará de forma controlada:
Descarga del fichero Python con el ejercicio resuelto
En el siguiente enlace os proporcionamos la descarga del código fuente completo en Python con la solución del ejercicio propuesto: