Python Advanced Series — APIs Masivas

7. Consultas asíncronas de rendimiento

7. High-Performance Asynchronous API Requests

Ejecuta miles de peticiones a una API externa simultáneamente en segundos en lugar de esperar horas secuencialmente.

Run thousands of requests to an external API concurrently in seconds instead of waiting hours sequentially.

⚠️ Advertencia de ciberseguridad y producción ⚠️ Cybersecurity and production warning

Este ejercicio es solo para aprendizaje y pruebas. No ejecutes scripts contra datos reales, ambientes de producción, APIs externas, portales con login, datos sensibles, sistemas críticos o repositorios empresariales sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios y cumplimiento de los protocolos de ciberseguridad de tu organización.

This exercise is for learning and testing only. Do not run scripts against real data, production environments, external APIs, login portals, sensitive data, critical systems, or enterprise repositories without authorization, backups, prior testing, least-privilege permissions, change control, and compliance with your organization's cybersecurity protocols.

Objetivo del ejercicio

Exercise objective

Aprender a usar asyncio y aiohttp para consultar varias URLs al mismo tiempo, controlar errores y consolidar las respuestas en un DataFrame.

Learn how to use asyncio and aiohttp to query multiple URLs at the same time, handle errors, and consolidate responses into a DataFrame.

Datos sintéticos

Synthetic data

request_idurlexpected_status
1https://api.example.com/customer/1001200
2https://api.example.com/customer/1002200
3https://api.example.com/customer/9999404

Ejemplo base

Base example

import asyncio
import aiohttp

async def fetch_data(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.json()

Resultado esperado

Expected result

request_idstatusrecords_returnedseconds
1success10.24
2success10.22
3not_found00.19

Script completo

Complete script

# ==========================================================
# Python Advanced Topic 07
# High-Performance Asynchronous API Requests
# ==========================================================

# pip install aiohttp pandas

import asyncio
import aiohttp
import pandas as pd
import time

urls = [
    {"request_id": 1, "url": "https://jsonplaceholder.typicode.com/users/1"},
    {"request_id": 2, "url": "https://jsonplaceholder.typicode.com/users/2"},
    {"request_id": 3, "url": "https://jsonplaceholder.typicode.com/users/3"},
]

async def fetch_data(session, item):
    start = time.perf_counter()
    try:
        async with session.get(item["url"], timeout=10) as response:
            payload = await response.json()
            return {
                "request_id": item["request_id"],
                "url": item["url"],
                "status_code": response.status,
                "name": payload.get("name"),
                "seconds": round(time.perf_counter() - start, 3),
                "result": "success" if response.status == 200 else "review"
            }
    except Exception as exc:
        return {
            "request_id": item["request_id"],
            "url": item["url"],
            "status_code": None,
            "name": None,
            "seconds": round(time.perf_counter() - start, 3),
            "result": f"error: {exc}"
        }

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_data(session, item) for item in urls]
        results = await asyncio.gather(*tasks)
    df = pd.DataFrame(results)
    df.to_csv("api_async_results.csv", index=False)
    print(df)

asyncio.run(main())

Salida esperada en consola

Expected console output

   request_id  status_code              name  seconds   result
0           1          200     Leanne Graham    0.214  success
1           2          200      Ervin Howell    0.208  success
2           3          200  Clementine Bauch    0.219  success

Aplicaciones reales

Real-world applications

  • Consultar APIs de proveedores en lote.
  • Validar direcciones o IDs contra servicios externos.
  • Descargar respuestas JSON masivas.
  • Reducir tiempos de integración en ETL.
  • Query vendor APIs in batches.
  • Validate addresses or IDs against external services.
  • Download large JSON responses.
  • Reduce integration time in ETL.

Recomendaciones

Recommendations

  • Respetar límites de rate limit y términos de uso.
  • Usar timeouts, reintentos y logging.
  • No enviar datos sensibles sin autorización.
  • Probar primero con pocas URLs.
  • Respect rate limits and terms of use.
  • Use timeouts, retries, and logging.
  • Do not send sensitive data without authorization.
  • Test first with a small URL list.

Valor del tópico

Topic value

La asincronía permite acelerar procesos que dependen de espera de red sin saturar el CPU. Es clave para integraciones modernas con APIs.

Asynchronous execution speeds up network-bound processes without overloading the CPU. It is essential for modern API integrations.