APIs, paginación y reintentos

Objetivo

Extraer datos remotos de forma robusta.

Explicación

Una API puede paginar y limitar frecuencia. Debes manejar timeouts, códigos HTTP, reintentos acotados y checkpoint. Nunca guardes tokens en el código. Python se usa como pegamento para automatizar ingestas, validaciones y APIs. En producción importa tanto el resultado como la forma de fallar: timeouts, logs, códigos de salida, reintentos limitados y secretos fuera del código. Una API paginada obliga a controlar estado entre peticiones. Un bucle sin límite, un retry infinito o un token impreso en logs son fallos reales de producción. Debes distinguir errores transitorios como 429/5xx de errores de autenticación 401/403, que no se arreglan repitiendo la misma petición. Para trabajar APIs, paginación y reintentos de forma profesional, no te quedes con el ejemplo: identifica la entrada, ejecuta el caso base, provoca al menos un caso incorrecto y compara el resultado con un control independiente. En este laboratorio el criterio de salida es concreto: La extracción no entra en bucle infinito y puede reanudarse desde página/checkpoint. La verificación principal será: Loguea página, filas y status sin imprimir token. Si no puedes explicar por qué pasa esa comprobación, vuelve al paso anterior antes de continuar.

Contexto profesional

Python se usa como pegamento para automatizar ingestas, validaciones y APIs. En producción importa tanto el resultado como la forma de fallar: timeouts, logs, códigos de salida, reintentos limitados y secretos fuera del código. Una API paginada obliga a controlar estado entre peticiones. Un bucle sin límite, un retry infinito o un token impreso en logs son fallos reales de producción. Debes distinguir errores transitorios como 429/5xx de errores de autenticación 401/403, que no se arreglan repitiendo la misma petición.

Ejemplo real

import os, requests
token=os.environ["API_TOKEN"]
r=requests.get(url,headers={"Authorization":f"Bearer {token}"},timeout=30)
r.raise_for_status()

Archivos o datos de entrada

  • data/ecommerce_orders.csv
  • python/ingest_validate.py

Práctica guiada

Diseña pseudocódigo para recorrer páginas hasta next=null.

Laboratorio paso a paso

  • Descarga `python/api_pagination_lab.py` y ejecútalo con `python api_pagination_lab.py`. El laboratorio simula una API y no necesita internet.
  • Reproduce el ejemplo real de la lección y guarda la salida. No avances hasta poder explicar qué hace cada bloque relacionado con «APIs, paginación y reintentos».
  • Sigue el log página a página. Identifica el primer HTTP 429, comprueba que espera `Retry-After` y que después continúa sin perder los registros anteriores.
  • Modifica `max_retries` a 0 y observa el fallo. Después crea un segundo caso 500 temporal y decide si debe usar la misma política de reintento.
  • Compara tu resultado con el criterio esperado: La extracción no entra en bucle infinito y puede reanudarse desde página/checkpoint. Después ejecuta la comprobación: Loguea página, filas y status sin imprimir token.
  • Provoca deliberadamente un caso problemático relacionado con este error frecuente: Reintentar indefinidamente un 401 no arregla credenciales.. Comprueba que sabes detectarlo y corregirlo.

Reto sin ayuda

Añade estrategia ante HTTP 429 respetando Retry-After.

Resultado esperado

La ejecución termina con `registros=5`, muestra un 429 intermedio, no entra en bucle infinito y no imprime ningún token o secreto.

Cómo verificarlo

Ejecuta el script dos veces: ambas deben terminar con 5 registros. Después pon `max_retries=0`: debe fallar de forma visible en el 429 en lugar de continuar silenciosamente.

Checklist de validación

  • El resultado cumple: La extracción no entra en bucle infinito y puede reanudarse desde página/checkpoint.
  • Has ejecutado esta verificación y puedes explicar el resultado: Loguea página, filas y status sin imprimir token.
  • Has probado al menos un caso límite o dato inválido y el comportamiento es explícito, no silencioso.
  • Puedes repetir la práctica desde cero sin copiar la solución y dejar evidencia (consulta, commit, captura o salida de consola).
Pista específica

Limita reintentos y usa backoff.

Solución paso a paso

1. Ejecuta `api_pagination_lab.py` sin modificarlo. Debes ver página 1 con 200, página 2 con 429, un reintento y después las páginas restantes hasta `registros=5`. 2. El estado que debes conservar entre peticiones es la página/URL siguiente y la colección ya descargada. No reinicies los resultados cuando aparece un error transitorio. 3. Para 429 lee `Retry-After` y espera ese tiempo antes de reintentar. Usa un contador máximo; al superar el límite lanza una excepción y termina con error visible. 4. Para 500/502/503 puedes aplicar backoff acotado porque suelen ser transitorios. Para 401/403 falla inmediatamente: repetir la misma credencial no soluciona autenticación ni permisos. 5. Los logs deben incluir página, status, número de filas y reintento, pero nunca el token. 6. Pon `max_retries=0` y confirma que el 429 produce un fallo controlado. 7. Como extensión, guarda `page` en un fichero checkpoint después de cada página correcta y úsalo para reanudar una ejecución interrumpida.

Errores frecuentes

  • Reintentar indefinidamente un 401 no arregla credenciales.

Qué debes recordar

Python en data engineering debe producir salidas reproducibles y fallar de forma visible ante datos inválidos.

Preguntas de entrevista

  • ¿Qué errores reintentarías y cuáles harías fallar inmediatamente? Aplícalo concretamente a «APIs, paginación y reintentos».
  • ¿Cómo harías observable y reproducible este script? Explica qué evidencia enseñarías al revisor.

Siguiente paso

Conectarás Python con SQL y logs.

Recursos de esta lección

Quiz de la lección

¿Dónde debe vivir un token local?

Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.