Introducción
En las tareas operativas, comprobar la disponibilidad de los servicios web es una actividad habitual. Aunque las bibliotecas de terceros, como requests, son populares, en algunos entornos restringidos solo puede utilizarse la biblioteca estándar de Python.
En este laboratorio utilizará el módulo urllib de la biblioteca estándar de Python para crear un comprobador sencillo de conectividad. Esto demuestra que a menudo es posible crear herramientas operativas útiles sin dependencias adicionales.
Al finalizar este laboratorio, comprenderá cómo:
- Importar el módulo
urllib.request. - Definir una función para comprobar una URL.
- Obtener códigos de estado HTTP, como
200 OK. - Gestionar excepciones, por ejemplo, errores del servidor o hosts inaccesibles.
- Mostrar mensajes de estado fáciles de entender.
Importar módulos
En este paso comenzará creando un script de Python e importando el módulo necesario. El módulo urllib.request es la herramienta integrada de Python para abrir URL. Puede imaginarlo como un navegador web, como Chrome o Firefox, que usted controla mediante código en lugar de usar el ratón. El módulo permite que el script obtenga datos de Internet.
Esto resulta útil en operaciones porque muchos sistemas ofrecen API basadas en HTTP o endpoints de comprobación de estado. Aunque más adelante los equipos adopten bibliotecas de terceros, conocer las herramientas de la biblioteca estándar ayuda a comprender mejor el modelo subyacente de solicitud y respuesta.
Primero, asegúrese de encontrarse en el directorio correcto. Abra el terminal y vaya al directorio del proyecto:
cd ~/project
Ahora cree un archivo de Python llamado connectivity_check.py con el editor de texto nano o con cualquier otro editor que prefiera:
nano connectivity_check.py
En Python, antes de utilizar una biblioteca, debe importarla. Añada la siguiente línea al principio del archivo. Importará urllib.request para gestionar la solicitud y urllib.error para gestionar posibles errores más adelante.
import urllib.request
import urllib.error
Pulse Ctrl+O y, después, Enter para guardar el archivo. Luego pulse Ctrl+X para salir de nano.
Puede comprobar el contenido del archivo mediante el comando cat:
cat connectivity_check.py
Definir la función
Ahora que las importaciones están listas, debe estructurar el código. Una buena práctica consiste en encapsular la lógica dentro de funciones. Esto hace que el código sea reutilizable y más fácil de probar.
Las funciones son especialmente útiles en los scripts operativos porque a menudo es necesario ejecutar la misma acción contra muchos destinos. Una vez que la comprobación de red esté incluida en una función, podrá llamarla para distintas URL sin duplicar el código.
En este paso definirá una función llamada check_url que acepta una cadena con una URL como argumento.
Vuelva a abrir el archivo connectivity_check.py:
nano connectivity_check.py
Añada la siguiente definición de función debajo de las instrucciones de importación. Por ahora solo añadirá una instrucción pass, que en Python sirve como marcador de posición e indica que no se debe hacer nada. En los pasos siguientes incorporará la lógica.
import urllib.request
import urllib.error
def check_url(url):
print(f"Checking connectivity for: {url}")
## Logic will go here
pass
Guarde el archivo y salga del editor (Ctrl+O, Enter, Ctrl+X).
Esta estructura establece la base del script. La función check_url recibe un parámetro, url, que contendrá la dirección del sitio web que desea probar, por ejemplo, "https://www.google.com".
Realizar la solicitud
En este paso implementará la lógica principal para enviar una solicitud y obtener el código de estado HTTP. Normalmente, un código de estado HTTP 200 significa «OK» o que la operación se realizó correctamente.
En términos generales, una solicitud HTTP es una conversación entre un cliente y un servidor. El script actúa como cliente: envía una solicitud a una URL, espera la respuesta del servidor y, a continuación, examina metadatos como el código de estado antes de decidir qué hacer.
Utilizará urllib.request.urlopen() para abrir la URL. Esta función devuelve un objeto de respuesta que dispone de un método .getcode() para obtener el código de estado.
Abra connectivity_check.py:
nano connectivity_check.py
Actualice la función check_url para que tenga el siguiente aspecto. Observe que se añade un tiempo de espera de 5 segundos para evitar que el script quede bloqueado si el servidor no responde.
import urllib.request
import urllib.error
def check_url(url):
print(f"Checking connectivity for: {url}")
## Open the URL with a 5-second timeout
response = urllib.request.urlopen(url, timeout=5)
## Get the status code
status_code = response.getcode()
print(f"Status Code: {status_code}")
Nota: En esta etapa, si la URL no es válida o el servidor está inactivo, el script se detendrá con un error porque todavía no se ha añadido la gestión de errores. Esto se corregirá en el paso siguiente.
Guarde el archivo y salga del editor.
Gestionar errores
La programación de red es impredecible. Los servidores pueden dejar de funcionar, las búsquedas DNS pueden fallar y las conexiones a Internet pueden interrumpirse. Si urlopen falla, genera una excepción. Para que el script sea robusto, debe gestionar estas excepciones mediante un bloque try...except.
En la supervisión real, es importante distinguir entre los distintos tipos de fallo. Si un servidor devuelve 500, significa que se ha podido contactar con él y que ha informado de un problema interno. En cambio, un URLError suele indicar que la solicitud ni siquiera llegó a un endpoint HTTP utilizable. Un buen operador trata estos casos como tipos de incidente diferentes.
Gestionará dos tipos concretos de error:
urllib.error.HTTPError: El servidor respondió, pero con un código de error, como 404 Not Found o 500 Server Error.urllib.error.URLError: No fue posible alcanzar el servidor, por ejemplo, por falta de conexión a Internet o por un dominio incorrecto.
Considere el bloque try...except como una red de seguridad. Si ocurre algún problema, como una interrupción de Internet, el código no se detendrá sin control. En su lugar, pasará al bloque except, donde podrá capturar el error y mostrar un mensaje útil.
Abra connectivity_check.py:
nano connectivity_check.py
Modifique la función para incluir la lógica de la solicitud dentro de un bloque try:
import urllib.request
import urllib.error
def check_url(url):
print(f"Checking connectivity for: {url}")
try:
## Attempt to open the URL
response = urllib.request.urlopen(url, timeout=5)
status_code = response.getcode()
print(f"Success! Status Code: {status_code}")
except urllib.error.HTTPError as e:
## Server responded with an error (e.g., 404, 500)
print(f"HTTP Error: {e.code}")
except urllib.error.URLError as e:
## Failed to reach the server
print(f"URL Error: {e.reason}")
Este código intenta ejecutar las líneas incluidas en el bloque try. Si se produce un error, Python deja de ejecutar ese bloque y salta al bloque except correspondiente.
Guarde el archivo y salga del editor.
Probar el script
En este último paso hará que el script se pueda ejecutar añadiendo un bloque principal que llame a la función. Esto permite ejecutar el script directamente desde el terminal.
El patrón if __name__ == "__main__": es una convención de Python que separa las funciones reutilizables del código que debe ejecutarse cuando se lanza el script directamente. Esta pequeña decisión de diseño facilita la reutilización posterior, ya que otro script puede importar check_url sin activar automáticamente las llamadas de prueba.
Probará el script con una URL conocida y funcional, como https://www.example.com. También puede probar una URL ficticia para observar cómo funciona la gestión de errores.
Abra connectivity_check.py:
nano connectivity_check.py
Añada el siguiente código al final del archivo:
if __name__ == "__main__":
## Test with a valid URL
target_url = "https://www.example.com"
check_url(target_url)
print("-" * 20)
## Test with an invalid URL to see error handling
invalid_url = "https://www.this-domain-does-not-exist-12345.com"
check_url(invalid_url)
El bloque if __name__ == "__main__": garantiza que este código solo se ejecute cuando el script se lance directamente, y no cuando otro script lo importe como módulo.
Guarde el archivo y salga del editor.
Ahora ejecute el script para ver los resultados:
python3 connectivity_check.py
Debería ver un resultado similar al siguiente:
Checking connectivity for: https://www.example.com
Success! Status Code: 200
--------------------
Checking connectivity for: https://www.this-domain-does-not-exist-12345.com
URL Error: [Errno -2] Name or service not known
(Nota: El mensaje exacto del error correspondiente a la URL no válida puede variar ligeramente según el entorno de red).
Resumen
En este laboratorio ha creado correctamente un comprobador de conectividad de red mediante la biblioteca estándar de Python. Ha aprendido a:
- Importar módulos: Utilizó
urllib.requestyurllib.error. - Realizar solicitudes HTTP: Utilizó
urlopenpara conectarse a un servidor web. - Gestionar respuestas: Obtuvo códigos de estado HTTP para verificar la disponibilidad de un servicio.
- Gestionar errores: Implementó bloques
try...exceptpara gestionarHTTPErroryURLError, lo que hace que el script sea resistente a fallos de red.
Esta habilidad es fundamental para crear scripts de supervisión, comprobaciones de estado y web scrapers sencillos en entornos donde no se pueden instalar dependencias externas.



