Cuando se trabaja con Python para interactuar con APIs web, especialmente al manejar múltiples solicitudes, probablemente te hayas encontrado con algunas demoras. Ya sea descargando archivos, extrayendo datos o haciendo solicitudes a APIs, esperar a que cada tarea termine puede ralentizar las cosas considerablemente. Aquí es donde la programación asíncrona entra en juego para salvar el día, y una de las mejores herramientas en el ecosistema de Python para esto es la librería aiohttp.
Si no estás familiarizado con la programación asíncrona, ¡no te preocupes! Lo explicaré en términos sencillos y explicaré cómo aiohttp puede ayudar a optimizar tus solicitudes web, haciéndolas más rápidas y eficientes.
Antes de profundizar, abordemos algo con lo que todo desarrollador lidia: las pruebas de API. Y si eres como la mayoría de los equipos, probablemente estés usando Postman para eso.
Lo entiendo: Postman es una herramienta familiar. Pero seamos honestos, ¿no hemos notado todos cómo se está volviendo menos y menos atractivo cada año? Sin embargo, aquí estás, trabajando en equipo, y necesitas herramientas de colaboración para mantener el proceso de desarrollo sin problemas. Entonces, ¿qué haces? Inviertes en Postman Enterprise por la friolera de $49 al mes.
Pero aquí está el truco: no tienes que hacerlo.
Sí, has leído bien. Hay una forma mejor y más eficiente de gestionar las pruebas de API y la colaboración en equipo sin tener que invertir tanto dinero en una herramienta que, francamente, no ofrece lo que alguna vez ofreció. ¡Exploremos algunas alternativas mejores!

APIDog: Obtienes todo de la versión de pago de Postman, pero MÁS BARATO
Así es, APIDog te ofrece todas las características que vienen con la versión de pago de Postman, a una fracción del costo. La migración ha sido tan fácil que solo necesitas hacer clic en algunos botones, y APIDog hará todo por ti.
Definitivamente vale la pena probar APIDog. Pero si eres el líder técnico de un equipo de desarrollo que realmente quiere deshacerse de Postman por algo mejor y más barato, ¡echa un vistazo a APIDog!
¿Qué es aiohttp?
aiohttp es una librería popular de Python que te permite escribir clientes y servidores HTTP asíncronos. Piensa en ello como la librería requests de Python, pero turboalimentada con el poder de la programación asíncrona.
Está construida sobre el framework asyncio de Python, lo que significa que puede manejar una gran cantidad de solicitudes concurrentemente sin esperar a que cada una se complete antes de pasar a la siguiente.
Imagina que estás en una cafetería, y en lugar de esperar en la fila a que cada pedido se complete uno a la vez, varios baristas comienzan a trabajar en tu pedido simultáneamente.
Con aiohttp, es como si estuvieras trabajando con un equipo de baristas, todos preparando café (o, en este caso, obteniendo datos) al mismo tiempo. ¿El resultado? Resultados más rápidos con menos tiempo de espera.
¿Por qué deberías preocuparte por aiohttp?
Hablemos de por qué aiohttp debería importarte, ya seas un principiante de Python, un científico de datos, un web scraper o incluso un desarrollador experimentado.
- Rendimiento: La razón principal para usar aiohttp es el rendimiento. Si necesitas hacer múltiples llamadas a la API o solicitudes a un sitio web, aiohttp puede manejarlas simultáneamente.
En lugar de procesarlas una tras otra, puedes ejecutar docenas o incluso cientos de solicitudes al mismo tiempo. - Escalabilidad: El web scraping o la llamada a múltiples APIs puede ser un proceso lento y bloqueante utilizando la programación síncrona. Sin embargo, con aiohttp, puedes gestionar más tareas en menos tiempo, lo que significa que tu aplicación puede manejar una mayor demanda o conjuntos de datos más grandes.
- Tiempos de espera reducidos: Los programas síncronos tradicionales tienen que esperar a que una tarea termine antes de comenzar la siguiente.
Con el código asíncrono, las tareas no tienen que esperar. Puedes descargar datos de múltiples URLs a la vez, reduciendo drásticamente el tiempo de ejecución general. - Uso eficiente de los recursos: La programación asíncrona, y aiohttp en particular, hace un uso más eficiente de los recursos de tu sistema.
En lugar de bloquear un hilo o proceso completo esperando una respuesta, aiohttp permite que otras tareas se ejecuten mientras se espera a que se complete una operación de E/S.
¿Cómo funciona aiohttp?
Profundicemos en cómo funciona aiohttp en la práctica.
Primero, aclaremos lo que realmente significa la programación asíncrona. En un programa síncrono, cada tarea debe terminar antes de que comience la siguiente.
Si estás esperando a que un servidor web responda a tu solicitud, todo el programa se detiene hasta que llegue esa respuesta. La programación asíncrona permite que el programa continúe ejecutando otras tareas mientras espera la respuesta.
aiohttp aprovecha este modelo asíncrono para permitirte disparar múltiples solicitudes HTTP a la vez, y luego manejar las respuestas a medida que llegan. Aquí hay un ejemplo que demuestra esto de una manera simple:
Cómo hacer solicitudes web con aiohttp: lo básico

Este diagrama (figura 2) compara el flujo síncrono (una tarea se completa antes de la siguiente) y el flujo asíncrono (múltiples tareas que se ejecutan concurrentemente).
Los cuadros azules representan tareas síncronas, mientras que los cuadros verdes representan tareas asíncronas.
Las flechas indican el flujo de ejecución tanto para los procesos síncronos como para los asíncronos.
Visualización del bucle de eventos (mecanismo de bucle dentro del modelo asíncrono de Python)

Este diagrama (figura 3) ilustra el mecanismo del bucle de eventos en el modelo de programación asíncrona de Python.
Los nodos representan diferentes pasos, como iniciar tareas, esperar operaciones de E/S y ejecutar callbacks.
Las flechas dirigidas muestran cómo se inician las tareas, cómo esperan las operaciones de E/S y cómo el bucle de eventos maneja los callbacks y reinicia las tareas.
Obtención concurrente de URLs en aiohttp

El diagrama de caso de uso (figura 4) visualiza cómo aiohttp puede manejar múltiples solicitudes de URL concurrentemente. Cada proceso de "Obtener URL" se maneja concurrentemente y se pasa a un nodo de procesamiento central.
Este diagrama muestra cómo aiohttp puede obtener concurrentemente múltiples URLs en un escenario de web scraping o solicitud de API.
Diagrama de flujo de trabajo

El diagrama de flujo de trabajo visualiza una canalización de datos básica, mostrando los pasos de obtención, procesamiento, limpieza y almacenamiento de datos.
Ejemplo: Hacer solicitudes asíncronas con aiohttp
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2",
"https://jsonplaceholder.typicode.com/posts/3",
]
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
responses = await asyncio.gather(*tasks)
for i, response in enumerate(responses):
print(f"Response {i+1}: {response[:60]}...") # Print first 60 characters of each response
Run the event loop
asyncio.run(main())
Descargando contenido de forma síncrona
Primero, intentemos hacer esto de forma síncrona usando la librería requests. Se puede instalar usando:
pip.python3.7 -m pip install requests
Descargar un recurso en línea usando requests es sencillo.
import requestsresponse = requests.get("https://www.python.org/dev/peps/pep-8010/")print(response.content)
Imprimirá el contenido HTML de PEP 8010. Para guardarlo localmente en un archivo:
filename = "sync_pep_8010.html"with open(filename, "wb") as pep_file:pep_file.write(content.encode('utf-8'))
Se creará el archivo sync_pep_8010.html.
Casos de uso en el mundo real para aiohttp
1. Web Scraping
Si estás extrayendo múltiples páginas de un sitio web, esperar a que cada página se cargue puede ser un proceso dolorosamente lento. Con aiohttp, puedes extraer múltiples páginas simultáneamente, acelerando el proceso drásticamente. Imagina obtener cientos de páginas a la vez en lugar de esperar a que cada una se cargue en secuencia.
2. Solicitudes de API
Cuando trabajas con APIs, especialmente aquellas que tienen límites de velocidad o responden lentamente, puedes enviar múltiples solicitudes a la vez usando aiohttp. Por ejemplo, si estás consultando una API del clima para obtener datos de múltiples ciudades, aiohttp puede ayudarte a recopilar los resultados más rápido.
3. Recopilación de datos
Ya sea que estés trabajando con datos del mercado de valores, feeds de redes sociales o sitios web de noticias, aiohttp puede cambiar las reglas del juego para manejar cantidades masivas de solicitudes HTTP simultáneamente, lo que te permite recopilar datos más rápido y de manera más eficiente.
Aquí hay tres ejemplos prácticos de cómo usar la librería aiohttp de Python, completos con pasos y código de muestra:
1. Hacer solicitudes HTTP asíncronas
Este ejemplo demuestra cómo hacer múltiples solicitudes HTTP asíncronas usando aiohttp.
Pasos:
- Importar los módulos necesarios
- Definir una función asíncrona para obtener una URL
- Crear una lista de URLs para obtener
- Configurar un bucle de eventos asíncrono
- Ejecutar la función asíncrona para cada URL concurrentemente
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
'https://api.github.com',
'https://api.github.com/events',
'https://api.github.com/repos/python/cpython'
]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
responses = await asyncio.gather(*tasks)
for url, response in zip(urls, responses):
print(f"URL: {url}\nResponse length: {len(response)}\n")
asyncio.run(main())
2. Crear un servidor de API simple
Este ejemplo muestra cómo crear un servidor de API básico usando aiohttp.
Pasos:
- Importar los módulos necesarios
- Definir los manejadores de ruta
- Crear la aplicación y agregar rutas
- Ejecutar la aplicación
from aiohttp import web
async def handle_root(request):
return web.json_response({"message": "Bienvenido a la API"})
async def handle_users(request):
users = [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"},
{"id": 3, "name": "Charlie"}
]
return web.json_response(users)
app = web.Application()
app.add_routes([
web.get('/', handle_root),
web.get('/users', handle_users)
])
if __name__ == '__main__':
web.run_app(app)
3. Servidor de chat Websocket
Este ejemplo demuestra cómo crear un servidor de chat simple basado en websocket usando aiohttp.
Pasos:
- Importar los módulos necesarios
- Crear un conjunto para almacenar websockets activos
- Definir el manejador de websocket
- Crear la aplicación y agregar rutas
- Ejecutar la aplicación
import aiohttp
from aiohttp import web
import asyncio
active_websockets = set()
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
active_websockets.add(ws)
try:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
for client in active_websockets:
if client != ws:
await client.send_str(f"User{id(ws)}: {msg.data}")
elif msg.type == aiohttp.WSMsgType.ERROR:
print(f"WebSocket connection closed with exception {ws.exception()}")
finally:
active_websockets.remove(ws)
return ws
app = web.Application()
app.add_routes([web.get('/ws', websocket_handler)])
if __name__ == '__main__':
web.run_app(app)
Para probar este servidor websocket, puedes usar un cliente websocket o crear una página HTML simple con JavaScript para conectarte al servidor.
Estos ejemplos muestran diferentes aspectos de aiohttp, desde hacer solicitudes asíncronas hasta crear servidores web y manejar websockets. Proporcionan una base sólida para construir aplicaciones más complejas usando esta poderosa librería.
Resumiendo
En el mundo actual impulsado por los datos, la velocidad importa, y la capacidad de manejar muchas tareas a la vez puede darte una ventaja. aiohttp es una herramienta imprescindible en tu kit de herramientas de Python si estás lidiando con web scraping, solicitudes de API o cualquier otra tarea que requiera hacer muchas solicitudes HTTP.
Al volverte asíncrono, no solo estás ahorrando tiempo, sino que también estás haciendo que tu código sea más eficiente y escalable.
Entonces, si estás buscando llevar tus solicitudes web de Python al siguiente nivel, prueba aiohttp.
Rápidamente verás por qué es una opción tan popular entre los desarrolladores que lidian con aplicaciones con mucha E/S.
¿Encontraste útil esta página? ¡Espero que este haya sido un material muy rico para ti!
¡Te deseo todo lo mejor!