Apify no es un Scraper. Es un Sistema Operativo para Scraping y No lo Sabes

Apify no es un Scraper. Es un Sistema Operativo para Scraping y No lo Sabes

Programming· 12 min read

Has Perdido 3 Meses Construyendo un Scraper. Apify lo Habría Hecho en 3 Días — y tu Versión Ya se Está Rompiendo en la Página 5

El ritual es siempre el mismo.

Abres Stack Overflow. Copias un snippet de Puppeteer. Le añades un bucle para paginar. Lo despliegas en un servidor cutre. Y a las dos horas, el scraper está muerto.

Cloudflare te bloqueó. La sesión expiró. El proxy te devolvió un CAPTCHA. O peor: la web renderiza SPA con React, tus document.querySelectorAll devuelven arrays vacíos, y llevas una semana recolectando basura sin saberlo.

*El problema no es que sepas o no scrapear. Es que estás resolviendo problemas que ya resolvió otro. *

Apify no es un "scraper como servicio". No es un wrapper bonito de Puppeteer. Es un sistema operativo para scraping — y el 90% de los desarrolladores lo usan mal o no lo usan en absoluto por puro sesgo de "not invented here".

Vamos a desmontar esa decisión con números, código, y un framework que puedes aplicar hoy.

---

La Mentira del "Solo Fetch el HTML"

El consejo más repetido en Stack Overflow sigue siendo: "usa requests + BeautifulSoup".

Funciona maravillosamente... en webs de 2004.

Hoy, más del 50% de los top 10.000 sitios web usan frameworks JavaScript como React, Angular o Vue. Eso significa que el contenido crítico se renderiza en cliente. Tu scraper de requests.get() recibe un HTML vacío con <div id="root"></div> y un montón de bundles JS que nunca ejecuta.

Y ni siquiera sabes que estás recogiendo basura.

Enfoque ingenuo:

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

Enfoque Crawlee:

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

15 líneas. Paginación automática. Ejecución real de JavaScript. Y si una página falla, reintenta con otra sesión. No es magia. Es infraestructura que alguien ya pagó por construir.

Pero hay un problema más sutil que la mayoría ignora: el falso positivo. Puedes obtener un HTML con BeautifulSoup, ver que los datos están ahí, y nunca darte cuenta de que estás scrapeando la versión estática de la página mientras los datos dinámicos que realmente necesitas — precios en tiempo real, disponibilidad de stock, resultados de búsqueda personalizados — se cargan mediante llamadas XHR o GraphQL que tu scraper nunca ejecuta. Es como creer que has visitado un museo porque has visto la fachada desde la calle.

---

El Coste Oculto del DIY Que Nadie Cuantifica

Cuando decides construir tu propio scraper desde cero, no estás escribiendo lógica de extracción. Estás escribiendo:

  • Gestión de colas de URLs con persistencia ante crashes.
  • Rotación de proxies con pools por país.
  • Manejo de sesiones con cookies y fingerprints.
  • Reintentos con backoff exponencial.
  • Detección de CAPTCHAs y loops de redirección.
  • Logging estructurado para depurar crawlers distribuidos.

*Eso no es un proyecto de una tarde. Es un esfuerzo de 2-3 meses de engineering. *

Y luego viene el mantenimiento.

Cada vez que el sitio rediseña sus selectores CSS, pierdes 5-10 horas re-ingenierizando. Cada vez que Cloudflare actualiza su algoritmo de detección, tu scraper muere. Los equipos que construyen scraping in-house subestiman el coste de mantenimiento entre 5x y 10x.

Crawlee, por otro lado, ha manejado miles de millones de requests a través de millones de sitios distintos. Los edge cases que tú aún no has visto — crashes de browser en medio de un crawl, memory leaks en sesiones largas, páginas que devuelven HTML distinto según la IP, scroll infinito que nunca termina — ya están resueltos.

Hay un paralelismo interesante en otros ámbitos creativos y técnicos. Recientemente, la artista Charli XCX generó un intenso debate al afirmar que el "anti-marketing" se convertiría en la próxima gran tendencia en promoción mediática. La idea — marketing más íntimo, personal, privado, uno a uno — fue recibida por algunos como una genialidad y por otros como el redescubrimiento de algo que existe desde hace décadas en escenas underground y comunidades de nicho. "Cariño, anti-marketing... hay millones de libros de marketing sobre esto. Lo enseñan en la escuela", respondió un crítico.

El "not invented here" en scraping funciona exactamente igual. Muchos desarrolladores creen estar descubriendo una solución innovadora cuando, en realidad, están reinventando una rueda que Crawlee ya ha perfeccionado durante años. Lo que parece "más control" o "una solución a medida" es, en la mayoría de los casos, una pérdida de tiempo que podría dedicarse a lo que realmente importa: extraer datos de valor.

---

El Framework de 5 Capas para Scraping en Producción

Vale, te he convencido de que Crawlee es mejor que raw Puppeteer. ¿Pero cómo lo llevas a producción?

Aquí está el Framework de 5 Capas para Scraping en Producción — la secuencia exacta que sigo para mis proyectos:

1. Scaffolding con Crawlee

No empieces desde cero. Usa el CLI:

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

Elige Playwright como motor. TypeScript estricto. Listo. Te da:

  • Proyecto estructurado con src/, storage/, apify.json.
  • Router class para manejar distintos patrones de URL.
  • Request queue persistente con SQLite o MongoDB.
  • Dataset para almacenar resultados estructurados.

Pero no te limites al scaffold básico. Dedica los primeros 30 minutos a explorar la estructura generada. Crawlee create no solo te da archivos: te da un patrón arquitectónico. Verás un routes.ts donde ya hay handlers de ejemplo, un main.ts con la configuración del crawler separada de la lógica, y un sistema de logging integrado con niveles configurables. Aprovecha esa estructura desde el día uno. No la "limpies" para hacerla más simple — la complejidad que ves ahí es necesaria cuando tu scraper pase de 10 URLs a 10.000.

2. Configura la Request Queue y el Proxy

El 90% de los scrapers mueren por mala gestión de proxies. Conéctalo al pool gestionado de Apify:

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

Sin configurar pools manuales. Sin rotación custom. Sin scripts de bash para cambiar IPs.

La decisión de qué tipo de proxy usar no es técnica: es estratégica. Los proxies residenciales son ideales para sitios con protección anti-bot agresiva (Cloudflare, DataDome), pero tienen un coste operativo mayor. Los proxies de datacenter son más rápidos y económicos, pero muchos sitios los detectan y bloquean al instante. Crawlee te permite combinar ambos grupos en una misma configuración y definir reglas de failover: "intenta primero datacenter, si falla tres veces seguidas cambia a residencial". Sin el framework, esa lógica serían fácilmente 200 líneas de código con estado compartido y condiciones de carrera.

3. Implementa el Router con Retry Automático

El patrón de ruteo por URL es la forma correcta de estructurar scrapers complejos:

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

Este patrón de router es más potente de lo que parece a simple vista. Te permite escalar tu scraper por tipo de página sin tener un bloque monolítico de condicionales. Cuando el sitio añada una nueva sección — por ejemplo, páginas de reseñas de producto — solo añades un nuevo handler con la etiqueta RESENA y defines la lógica de extracción. El crawler existente lo procesará sin modificar una sola línea del código que ya funciona.

Además, el sistema de retry automático de Crawlee no es un simple reintento. Implementa backoff exponencial con jitter: si una request falla, espera 1 segundo antes de reintentar; si vuelve a fallar, espera 2; luego 4, luego 8, hasta un máximo configurable. Y en cada reintento, asigna una nueva sesión con un nuevo proxy y un nuevo browser context. Así evitas que el site te marque como "mismo usuario insistiendo" y te banee permanentemente.

4. Define el Schema de Output

Un scraper no es un script. Es un data pipeline. Define tu estructura antes de escribir código:

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

Usa crawler.pushData() para enviar al Dataset. Después puedes exportar a JSON, CSV, o enviarlo a un webhook.

Pero el schema no es solo para que tu código funcione. Cuando despliegas como Apify Actor, el schema de input/output se convierte en documentación viva. Cualquier persona de tu equipo — o un cliente, si vendes acceso a tus datos — puede ver exactamente qué campos devuelve el scraper sin leer una línea de código. Y si usas TypeScript, el compilado te protege contra errores de tipeo que en JavaScript puro pasarían desapercibidos hasta que alguien intente consumir los datos y se encuentre con un undefined inesperado.

5. Despliega como Apify Actor

El paso que convierte tu scraper local en un endpoint serverless:

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

Despliegas con:

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

Y tienes tu scraper funcionando como API REST, con scheduler para ejecuciones recurrentes, logging gestionado, y alertas cuando falla.

El verdadero valor de este paso no es técnico: es operativo. Cuando despliegas como Actor, delegas la gestión de infraestructura a Apify. No necesitas preocuparte por la capacidad de tu VPS, por reiniciar el proceso cuando crashea, o por monitorizar si el scraper está vivo a las 3 de la mañana. Apify escala horizontalmente: si necesitas scrapear 100.000 URLs en una hora, el sistema lanza múltiples contenedores en paralelo. Si solo necesitas 10 URLs al día, ejecuta un contenedor mínimo durante 30 segundos. Pagas por el uso real, no por mantener un servidor encendido 24/7.

---

La Objeción del Lock-In y Por Qué No Aplica

"Sí, vale. Pero no quiero atarme a Apify. Quiero correrlo en mi infraestructura."

*Crawlee es 100% open-source bajo licencia MIT. Se ejecuta en tu máquina local, en un EC2, en una Lambda, en un VPS de 5 pavos, o en un Raspberry Pi. *

La plataforma de Apify es opcional. Te da:

  • Proxy pool gestionado (residencial y datacenter).
  • Almacenamiento persistente de datasets.
  • Scheduler y webhooks.
  • Monitoreo y alertas.

Pero si quieres montarlo todo tú, Crawlee funciona exactamente igual con tus propios proxies, tu propia base de datos, y tu propio cron. El framework de 5 capas se aplica igual.

La diferencia es que si decides desplegar en Apify después, es un solo comando: apify push. No tienes que reescribir nada.

Esta objeción del lock-in es comprensible, pero suele esconder una falacia más profunda. Cuando dices "no quiero atarme a Apify", a menudo lo que realmente estás diciendo es "prefiero atarme a mi propia implementación casera de proxies, colas, reintentos y almacenamiento". Una implementación que, a diferencia de Apify, no tiene un equipo de ingenieros dedicados a mejorarla cada semana, que no ha sido probada contra millones de sitios, y que no tiene un SLA. El verdadero lock-in no es usar una plataforma externa — es construir infraestructura propia que no escala y que te impide moverte porque has invertido meses en ella.

---

La Trampa del "Me lo Monto Yo"

El 99% de los desarrolladores que empiezan un scraper desde cero no lo hacen porque necesiten una feature que Crawlee no tenga.

Lo hacen porque "es más fácil hacerlo uno mismo que aprender una herramienta nueva".

Esa decisión parece racional el primer día. Al mes, cuando estás debugueando por qué tu sesión se corrompió después de 500 requests sin un proxy nuevo, ya no parece tan inteligente.

*El scraping no es un problema de extracción. Es un problema de infraestructura. *

La lógica que extrae los datos de la página — los selectores CSS, el mapeo de campos — es el 20% del código. El 80% restante es gestión de estado, reintentos, proxies, almacenamiento, y logging. Y ese 80% es exactamente lo que Crawlee te da gratis.

Apify no es un producto para gente que no sabe programar. Es un multiplicador para los que ya saben y quieren dejar de perder el tiempo con infraestructura que no les diferencia.

Hay además una trampa cognitiva que merece la pena señalar: el sesgo de sunk cost. Cuando llevas dos semanas construyendo tu scraper casero, es muy difícil parar y admitir que deberías haber usado Crawlee desde el principio. Piensas "ya he invertido demasiado tiempo como para cambiarme ahora". Pero ese razonamiento es una falacia. El tiempo ya está invertido y no va a volver. La pregunta relevante no es cuánto tiempo has gastado, sino cuánto tiempo vas a gastar a partir de ahora si sigues por el mismo camino. Si la respuesta es "semanas o meses", el movimiento racional es parar hoy, aprender Crawlee en un día, y reescribir en dos. El orgullo del código propio es el enemigo del código que funciona.

---

Tu Próximo Scraper Empieza con npx crawlee create

No mañana. No "cuando tenga tiempo". El próximo scraper que escribas.

npx crawlee create te da 15 líneas de boilerplate contra 40 de Puppeteer raw. Te da infraestructura probada contra los mismos sitios que te van a bloquear. Y te da la opción de desplegar como API cuando lo necesites.

El coste de oportunidad de no usar Crawlee no es el precio de la herramienta. Es el tiempo que podrías haber pasado construyendo algo que realmente importa.

Arranca hoy. El scraper que escribas en 3 días con Crawlee será más robusto que el que tardarías 3 meses en construir tú solo.

Y si aún tienes dudas, haz esta prueba: coge el último scraper que escribiste desde cero. Cuenta las líneas de código dedicadas a lógica de extracción — selectores, parsing, mapeo de campos. Luego cuenta las líneas dedicadas a infraestructura — gestión de proxies, reintentos, persistencia de cola, logging, manejo de errores. Si la proporción es peor que 20/80, tienes tu respuesta. No necesitas un mejor scraper. Necesitas un sistema operativo para scraping. Y ya existe.

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