Patrones de Diseño para Apify Actors: Cómo Construir Extracción de Datos que No Falla en Producción

Patrones de Diseño para Apify Actors: Cómo Construir Extracción de Datos que No Falla en Producción

Programming· 5 min read

Tu Actor de Apify Falla en Silencio

Tu actor devuelve extract() sin errores. El dataset está vacío. Nadie se entera hasta que el cliente pregunta por qué no recibe datos.

El problema real no es el parsing de HTML. Es que estás construyendo scripts, no agentes de producción.

Paperclip explotó a 30.000 usuarios cuando la gente descubrió que construir agentes de verdad requiere contratos claros entre componentes.

Google ADK tiene 19.000 estrellas en GitHub. Su execution engine basada en grafos implementa retry, state management y error handling como features nativos.

Tú estás haciendo fetch() y祈祷.

Estos son los 4 patrones de diseño que necesitas para construir Apify actors que escalan sin darte vergüenza.

Por Qué Tus Selectores Funcionan en Dev y Fallan en Prod

La mayoría de developers de Apify siguen el mismo patrón:

  1. Instalan playwright o cheerio
  2. Hacen fetch de la URL
  3. Extraen con selectores CSS
  4. Guardan en dataset
  5. Deploy

Esto funciona para 1 URL. Para 10.000 URLs con estructura cambiante, ratelimiting impredecible, y 30.000 usuarios esperando datos consistentes, esto es gambling con tu reputación.

La sabiduría convencional dice que web scraping trata de parsear HTML y manejar selectores.

La realidad: el 90% de los fallos en producción vienen de falta de validación en los inputs y outputs. No de selectores rotos.

Alphora demuestra por qué esto importa. Su @tool decorator genera automáticamente schemas de OpenAI function calling desde type hints y docstrings. Cero configuración manual. Validación en runtime sin esfuerzo extra.

Apify tiene un sistema similar con sus input schemas. La mayoría de developers lo ignoran porque "agrega complejidad".

Aquí está el secreto que nadie te dice: la complejidad que ignoras ahora se convierte en bugs que解决不了 en producción.

El Contrato Que Falta en Tu Actor

Google ADK implementa lo que llama "workflow runtime" con soporte nativo para retry, state management, dynamic nodes y error handling.

Esto no es sobreengineering. Es lo mínimo necesario para scraping a escala.

Patrón 1: Schema-First Input Validation

La mayoría de actors de Apify reciben inputs como esto:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Deberías estar validando antes de ejecutar cualquier lógica de negocio. Alphora hace esto automáticamente con type hints. Tú tienes que hacerlo manualmente, pero es igual de importante:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Este patrón de Apify se mapea directamente al enfoque de Alphora con su @tool decorator. Ambos generan validación desde definición de tipos. La diferencia: tú controlas exactamente qué se acepta y qué se rechaza.

Patrón 2: Retry Logic con Circuit Breakers

Google ADK enfatiza retry y state management como primitives de primer nivel. Tú necesitas implementar esto explícitamente para cada llamada externa.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

La diferencia entre platform-level retries y domain-specific retry logic es crítica. Apify reintenta automáticamente en algunos casos. Pero tú sabes mejor que nadie cuándo un selector necesita fallback, cuándo una API específica requiere backoff exponencial, y cuándo es mejor saltar y marcar como error que seguir insistiendo.

Patrón 3: Structured Output Datasets

Aquí es donde la mayoría de actors fallan completamente. Escriben datos inconsistentes y se sorprenden cuando downstream consumers explotan.

Paperclip escala a 30.000 usuarios porque cada integración sabe exactamente qué esperar. Tú deberías hacer lo mismo:

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Este formato es predecible. Consumers pueden procesar resultados sin guesswork. Cuando algo falla, tienes el error logged con contexto. Cuando funciona, tienes versioning en metadata para debugging.

Implementa Estos Patrones en 4 Pasos

Paso 1: Define tu input contract con Pydantic o JSON Schema antes de escribir cualquier lógica de extracción.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Paso 2: Implementa retry con exponential backoff para HTTP requests y fallback selectors para sitios con estructura variable.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Paso 3: Estandariza tu output dataset con schemas consistentes y metadata para tracking.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Paso 4: Añade lifecycle hooks para logging, metrics y alerting cuando patterns de error aparezcan.

[@portabletext/react] Unknown block type "code", specify a component for it in the `components.types` prop

Responde a Tus Objeciones Antes de Que las Pienses

"Esto es sobreingeniería para scrapers simples"

Scrapers simples se convierten en pipelines de producción. Cada vez. El schema que ignoras hoy es la deuda técnica que pagas mañana debuggeando datos inconsistentes a las 3 AM.

"Apify ya maneja retries y error logging"

Los retries de plataforma son genéricos. Tú sabes que cierto sitio necesita 5 segundos de backoff después de un 429. Tú sabes que cierto selector tiene fallback viable. La lógica específica del dominio requiere implementación específica del dominio.

"Los schemas añaden complejidad innecesaria para websites dinámicos"

Websites dinámicos necesitan validación más estricta, no menos. Si la estructura cambia, tu schema te lo dice inmediatamente con un error claro. Sin schema, obtienes campos vacíos que descubres 3 días después cuando el dashboard muestra gráficos extraños.

Lo Que Necesitas Recordar

  • Valida inputs con schemas antes de ejecutar lógica de negocio
  • Implementa retry domain-specific con circuit breakers, no relies en platform defaults
  • Estandariza outputs con campos consistentes y metadata versioning
  • Añade lifecycle hooks para detectar patterns de error antes de que escalen

La diferencia entre scripts que fallan y agentes que escalan es intencional.

Paperclip no llegó a 30.000 usuarios por suerte. Llegó porque cada componente tiene un contrato claro. Tú puedes hacer lo mismo con tus Apify actors si paras de tratar el input validation como opcional.

Construye el contrato primero. El resto viene solo.

Artículos relacionados

---

¿Quieres recibir contenido como este cada semana? Suscríbete a mi newsletter

Brian Mena

Brian Mena

Software engineer building profitable digital products: SaaS, directories and AI agents. All from scratch, all in production.

LinkedIn