Apify y proxies móviles: guía paso a paso desde cero hasta el lanzamiento en la nube
Contenido del artículo
- Introducción
- Preparación previa
- Conceptos básicos y qué es apify
- Paso 1: ¿por qué usar proxies móviles en el scraping en la nube?
- Paso 2: registro en apify y preparación del espacio de trabajo
- Paso 3: creación del actor y carga de la plantilla
- Paso 4: configuración de proxies en el actor
- Paso 5: ejemplo de tarea: recolección de datos de tarjetas de productos
- Verificación de resultado
- Errores comunes y soluciones
- Posibilidades adicionales
- Conclusión
Introducción
En esta guía paso a paso, configurarás un web scraping en la nube con Apify utilizando proxies móviles, crearás un actor en Node.js, ejecutarás una tarea de prueba para recolectar datos de productos y aprenderás a gestionar los límites de manera segura para evitar errores y bloqueos. La guía está dirigida a principiantes, pero también incluye secciones para usuarios avanzados. Al final, tendrás un actor listo para reutilizar, un esquema de proxies funcional, verificación de resultados, listas de verificación, análisis de errores comunes y sugerencias para optimización. Si buscas una respuesta rápida a una duda práctica, puedes ir directamente a la sección de FAQ, pero para obtener resultados óptimos, asegúrate de seguir todos los pasos.
¿Para quién es esta guía? Para aquellos que desean entender cómo lanzar un actor en Apify con proxies móviles, sin gastar semanas estudiando la documentación. Resultará útil para marketers, analistas, investigadores, propietarios de proyectos en línea y desarrolladores principiantes que necesitan una recolección de datos confiable y repetible desde la web.
Lo que necesitas saber de antemano: tener conocimientos básicos de JavaScript será útil, aunque no obligatorio. Detallaremos dónde hacer clic, qué ingresar y cómo verificar los resultados. Es importante poder autenticarte en el servicio web, copiar tokens de acceso y manejar contraseñas de manera cuidadosa.
¿Cuánto tiempo requiere? De 2 a 3 horas para una revisión completa, incluyendo registro, configuración del actor, integración de proxies, ejecución de prueba y verificación de resultados. Si ya cuentas con una cuenta de Apify y acceso a proxies móviles, podrás terminar en 60 a 90 minutos.
Preparación previa
Herramientas, programas y accesos necesarios
- Cuenta de Apify con acceso para lanzar actores.
- Node.js versión LTS (18 o superior) en tu computadora local, si deseas editar el código localmente. Se puede usar el editor integrado en Apify, pero hacerlo localmente es más cómodo.
- Credenciales para proxies móviles. Usaremos como ejemplo el proveedor mobileproxy.space, donde podrás obtener el nombre de usuario, contraseña y dirección del servidor proxy. Puedes usar cualquier servicio similar.
- Editor de texto: VS Code o cualquier otro.
- Apify CLI (opcional) para desarrollo local y carga del actor en la nube.
Requisitos del sistema
- Conexión estable a internet.
- Windows, macOS o Linux. Cualquier computadora moderna sirve para trabajar localmente con el actor.
- 200-500 MB de espacio libre en disco para las dependencias de npm, si decides hacer desarrollo local.
Qué descargar e instalar
- Instala Node.js desde el sitio oficial, selecciona LTS. Tras la instalación, verifica en la terminal con: node -v y npm -v. Deberías ver las versiones sin errores.
- Instala Apify CLI (opcional) con el comando: npm i -g apify-cli. Después de la instalación, verifica: apify --version.
- Prepara las credenciales para los proxies móviles: host, puerto, usuario y contraseña. Si usas mobileproxy.space, obtendrás la dirección en el formato host:port y un par user:password.
⚠️ Advertencia: Nunca publiques nombres de usuario y contraseñas de proxies en repositorios públicos. Usa variables de entorno o secretos de la plataforma.
Creación de copias de seguridad
Si estás editando el código localmente, mantén una copia de seguridad del proyecto (por ejemplo, utilizando git). En Apify, la plataforma almacena versiones de actores, pero es mejor tener un respaldo local del código.
Consejo: Si es tu primera vez trabajando con Apify, comienza directamente en el navegador a través del editor en la interfaz de la plataforma, y agrega el desarrollo local más tarde. Esto acelerará tu inicio.
Conceptos básicos y qué es Apify
Términos clave explicados de manera sencilla
- Apify — plataforma para la automatización de tareas web: scraping, crawling, integraciones. Permite ejecutar código (actores) en la nube, almacenar resultados (Datasets) y gestionar colas de enlaces.
- Actor — aplicación containerizada (usualmente en Node.js o Python) que lleva a cabo tu tarea: abre páginas, recolecta datos y guarda resultados.
- Tarea (Task) — configuración guardada para ejecutar un actor con entradas predefinidas. Conveniente para reinicios regulares sin modificar el código.
- Dataset — almacenamiento de resultados del scraping en forma de tabla. Se puede exportar a JSON, CSV, XLSX.
- Key-Value Store — almacenamiento para archivos y configuraciones arbitrarios (por ejemplo, parámetros de entrada, informes).
- Request Queue — cola de enlaces para el crawler, para almacenar y procesar URL de forma sistemática.
- ProxyConfiguration — configuración del proxy. Se pueden usar proxies de Apify o externos, incluidos los móviles.
- Proxies móviles — proxies que utilizan redes móviles de operadores. Frecuentemente son percibidos por los sitios como un tráfico móvil real.
Principios básicos de operación
Escribes un actor, le pasas los parámetros de entrada y lo ejecutas en la nube. El actor recibe una lista de enlaces, los abre a través del crawler elegido (por ejemplo, CheerioCrawler para páginas HTML simples o PlaywrightCrawler para sitios complejos), recolecta datos y los escribe en el Dataset. Para las solicitudes de red, el actor utiliza proxies de acuerdo con la ProxyConfiguration. Cuando se necesita una recolección estable con bajos niveles de falsas alarmas, se utilizan proxies móviles. Esto permite distribuir la carga y verse para el objetivo como un usuario móvil.
Lo importante a entender antes de comenzar
- Respeta las reglas de los sitios objetivo y las leyes vigentes. Usa la recolección de datos de manera ética y legal.
- Aún los proxies móviles no proporcionan inmunidad ante restricciones. La frecuencia de solicitudes, los retardos, los encabezados HTTP correctos y la calidad del código del crawler son clave.
- Los límites de la plataforma Apify y tu plan tarifario afectan al paralelismo, memoria y tiempo de ejecución. Esto se configura y controla.
Consejo: Si el objetivo proporciona una API oficial, comienza con ella. Es más estable y ético que el scraping de HTML.
Paso 1: ¿Por qué usar proxies móviles en el scraping en la nube?
Objetivo de la etapa
Comprender en qué situaciones los proxies móviles ofrecen el mejor resultado y cómo ajustar la configuración para minimizar bloqueos e inestabilidad al trabajar desde la nube.
Instrucciones paso a paso detalladas
- Define el objetivo de la recolección de datos: lista de productos, precios, reseñas, horarios, noticias. Anota tipos específicos de páginas y sus URL aproximadas.
- Evalúa la complejidad del sitio: si la página se abre sin JavaScript, qué tan rápido carga, si hay carga dinámica. Si el sitio es simple, es suficiente con CheerioCrawler; si es complejo, usa PlaywrightCrawler.
- Decide si necesitas una sesión móvil: si el sitio está claramente orientado a usuarios móviles y muestra versiones diferentes de páginas para clientes móviles y de escritorio, los proxies móviles ayudarán a parecer natural.
- Elige un proveedor de proxies móviles. Un ejemplo sería mobileproxy.space. Asegúrate de tener un host, puerto, usuario y contraseña estables. Anótalos por separado.
- Planifica la frecuencia de las solicitudes. Comienza con 1-2 pestañas simultáneas y 1-3 solicitudes por segundo. Aumenta paulatinamente según la necesidad, observando errores y respuestas del sitio.
- Decide si usarás rotación de IP. Para proxies móviles, la rotación puede ser por orden o por temporizador de acuerdo con el proveedor. Consulta la política y comandos de rotación de tu proveedor.
Puntos importantes
Los proxies móviles son adecuados cuando necesitas reducir la probabilidad de falsas alarmas de seguridad o reproducir el comportamiento de un cliente móvil. No los uses para acciones prohibidas por el sitio o la ley. Configura correctamente los encabezados User-Agent y los retardos.
⚠️ Advertencia: No intentes eludir las restricciones técnicas de los sitios. Si la página está cerrada por autenticación o condiciones de uso, actúa según las reglas del recurso.
Resultado esperado
Comprendes por qué se utilizan los proxies móviles, eliges un proveedor y estás listo para la configuración en el actor. Tienes las credenciales del proxy y un plan de frecuencia de solicitudes.
Problemas posibles y sus soluciones
- No está claro si se necesita la versión móvil. Solución: abre el sitio con un User-Agent móvil en el navegador de desarrollador y compara el marcado. Si hay una diferencia significativa, la sesión móvil es relevante.
- Dudas sobre la fiabilidad del proveedor. Solución: prueba la conexión a través de curl con tu proxy, verifica la estabilidad durante 10-15 minutos.
✅ Verificación: Tienes los parámetros del proxy (host, puerto, usuario, contraseña) y has anotado la frecuencia de solicitudes deseada.
Paso 2: Registro en Apify y preparación del espacio de trabajo
Objetivo de la etapa
Crear o confirmar tu cuenta de Apify, ingresar a la consola, instalar Apify CLI si es necesario y prepararte para crear un actor.
Instrucciones paso a paso detalladas
- Regístrate en Apify. Ingresa tu correo, crea una contraseña y confirma tu e-mail. Tras iniciar sesión, se abrirá la consola con las secciones Actors, Tasks, Storage.
- Ve a tu perfil y encuentra tu token API personal. Copíalo en un lugar seguro, te será útil para CLI e integraciones.
- Si usas CLI: instala apify-cli con el comando npm i -g apify-cli. Luego ejecuta apify login e inserta el token. Tras iniciar sesión exitosamente, verás una confirmación en la terminal.
- Crea una carpeta de trabajo localmente para el proyecto, si decides hacer desarrollo local. Ejecuta apify create y selecciona una plantilla en Node.js con Crawlee. Esto creará la estructura del proyecto con package.json y src/main.js.
- Si trabajas solo en el navegador: haz clic en New en la sección Actors y selecciona una plantilla Node.js + Crawlee. La plataforma creará un actor vacío y abrirá el editor en línea.
Puntos importantes
La seguridad del token es crítica. No lo incluyas en el código. Guárdalo en un gestor de contraseñas. En CLI se almacena localmente y no se incluye en el repositorio, a menos que lo añadas manualmente.
Consejo: Nombra el actor de forma coherente, por ejemplo, mobile-crawler-products. Esto facilitará la navegación y la automatización.
Resultado esperado
Has ingresado a la consola de Apify, si lo deseas configuraste CLI, creaste un actor vacío y ves el archivo main.js en el editor (o localmente en la carpeta src).
Problemas posibles y sus soluciones
- CLI no reconoce el token. Solución: ejecuta apify logout y luego apify login de nuevo. Verifica que ingresas el token correcto desde el perfil.
- Errores al instalar dependencias de npm. Solución: actualiza Node.js a LTS, limpia el caché de npm con el comando npm cache clean --force y repite la instalación.
✅ Verificación: Tienes un actor creado con acceso a editar el código y la estructura básica del proyecto está en su lugar.
Paso 3: Creación del actor y carga de la plantilla
Objetivo de la etapa
Rellenar el actor con el código base en Crawlee, de modo que puedas ejecutar el crawler inmediatamente y verificar su funcionalidad básica sin proxies.
Instrucciones paso a paso detalladas
- Abre el archivo main.js. Si no existe, créalo en src/main.js. Asegúrate de que package.json contiene las dependencias crawlee y apify.
- Inserta el código base del crawler. Ejemplo para CheerioCrawler: import { CheerioCrawler, Dataset } from "crawlee"; export const main = async () => { const startUrls = ["https://example.com/"]; const crawler = new CheerioCrawler({ requestHandler: async ({ request, $, log }) => { const title = $("title").text(); await Dataset.pushData({ url: request.loadedUrl, title }); log.info(`Saved: ${request.loadedUrl}`); }, maxConcurrency: 2, requestHandlerTimeoutSecs: 60, }); for (const url of startUrls) await crawler.addRequests([url]); await crawler.run(); };
- Guarda el archivo. Si estás en el navegador, presiona el botón Guardar. Si lo haces localmente, guarda los cambios y ejecuta npm install para descargar las bibliotecas (si no se descargaron automáticamente).
- Prueba la ejecución sin proxies: ejecuta el actor con la entrada predeterminada. En el Dataset debe aparecer al menos un objeto con el campo title.
Puntos importantes
Un MVP mínimo del actor es necesario para verificar el pipeline: ejecución, registro, guardado de resultados. Antes de añadir proxies, asegúrate de que el código funcione en una página simple.
Consejo: Comienza con uno o dos enlaces iniciales. Esto acelerará las pruebas y facilitará la búsqueda de problemas.
Resultado esperado
El actor se ejecuta correctamente y guarda resultados en el Dataset. Ves registros que indican que los datos fueron guardados y no hay errores como DNS o tiempo de espera de red.
Problemas posibles y sus soluciones
- Error al importar paquetes. Solución: verifica las versiones en package.json. Si es necesario, ejecuta npm i crawlee apify.
- No hay datos en el Dataset. Solución: revisa el selector $("title").text() o reemplázalo por una selección simple, como $("h1").first().text().
✅ Verificación: En el Dataset apareció al menos un objeto con los campos url y title. Los registros muestran una finalización exitosa sin excepciones.
Paso 4: Configuración de proxies en el actor
Objetivo de la etapa
Conectar proxies móviles al actor de Apify, de modo que todo el tráfico de red del crawler fluya a través del proxy especificado, y verificar la estabilidad de la conexión.
Instrucciones paso a paso detalladas
- Prepara la cadena de proxy. Formato para el proxy HTTP externo: http://USERNAME:PASSWORD@HOST:PORT. Ejemplo: http://user123:pass456@proxy.mobileproxy.space:12345. Para mobileproxy.space utiliza las credenciales de tu cuenta.
- Agrega ProxyConfiguration al código. Para CheerioCrawler: import { CheerioCrawler, Dataset, ProxyConfiguration } from "crawlee"; export const main = async () => { const proxy = new ProxyConfiguration({ proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"] }); const crawler = new CheerioCrawler({ proxyConfiguration: proxy, requestHandler: async ({ request, $, log }) => { const title = $("title").text(); await Dataset.pushData({ url: request.loadedUrl, title }); log.info(`Saved: ${request.loadedUrl}`); }, maxConcurrency: 2, requestHandlerTimeoutSecs: 60, }); await crawler.addRequests(["https://httpbin.org/ip"]); await crawler.run(); };
- Guarda los cambios y ejecuta el actor. Si todo está correcto, en el Dataset verás la dirección IP que pertenece a tu proxy móvil (para httpbin.org/ip, esto será un JSON con origin o IP del proxy).
- Si usas PlaywrightCrawler, añade la misma ProxyConfiguration en los parámetros del constructor: import { PlaywrightCrawler, Dataset, ProxyConfiguration } from "crawlee"; const proxy = new ProxyConfiguration({ proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"] }); const crawler = new PlaywrightCrawler({ proxyConfiguration: proxy, launchContext: { launchOptions: { headless: true } }, requestHandler: async ({ page, request, log }) => { const title = await page.title(); await Dataset.pushData({ url: request.loadedUrl, title }); log.info(`Saved: ${request.loadedUrl}`); } });
- Si es necesario, saca la cadena de proxy a una variable de entorno y léela a través de process.env, para no almacenar la contraseña en el código. En la plataforma Apify, utiliza la sección Secrets y ENV Vars en la configuración del actor. Ejemplo: const proxyUrl = process.env.MOBILE_PROXY_URL;
Puntos importantes
No mezcles al mismo tiempo Apify Proxy y una configuración de proxy móvil externa. Dentro de una misma ejecución, usa una fuente de proxy clara. La configuración a través de proxyUrls reemplaza completamente el uso del proxy de Apify.
Consejo: Primero, prueba el proxy en páginas simples como https://httpbin.org/ip o servicios similares que muestren IP. Así podrás verificar de inmediato que el tráfico pasa por la dirección deseada.
⚠️ Advertencia: Si el proveedor de proxies móviles permite la rotación de IP a través de una URL especial o comando, usa esto solo dentro de sus reglas. No cambies la IP con demasiada frecuencia sin necesidad: esto puede levantar sospechas en el sitio objetivo.
Resultado esperado
El crawler está exitosamente conectado al proxy móvil. Al verificar la IP (a través de una página de control), ves la dirección del proxy, los registros son estables y las solicitudes no se caen por tiempos de espera.
Problemas posibles y sus soluciones
- 401 o 407 en los registros. Causa: nombre de usuario o contraseña incorrectos. Solución: revisa las credenciales de tu cuenta del proveedor.
- ECONNRESET o ETIMEDOUT. Causa: inestabilidad de la conexión o bloqueo del dominio. Solución: reduce el paralelismo, reinicia después de una pausa, verifica el estado del proxy con el proveedor.
✅ Verificación: El Dataset contiene el resultado de la solicitud a la página que muestra IP, y allí se puede ver la dirección del proxy móvil.
Paso 5: Ejemplo de tarea: recolección de datos de tarjetas de productos
Objetivo de la etapa
Recolectar datos de tarjetas de productos reales, usando proxies móviles y configuraciones estables de crawler, y guardar los resultados en el Dataset.
Instrucciones paso a paso detalladas
- Define la lista de URL de tarjetas o categorías donde puedas recolectar datos abiertos de manera segura y legal. Anota 3-5 enlaces para la prueba.
- Selecciona el crawler. Si la página es estática, utiliza CheerioCrawler. Si los datos se cargan dinámicamente, elige PlaywrightCrawler.
- Agrega los selectores principales para extraer datos. Por ejemplo: nombre del producto, precio, moneda, calificación, disponibilidad. En Cheerio, estos serán selectores similares a jQuery; en Playwright — page.locator.
- Ejemplo para CheerioCrawler: import { CheerioCrawler, Dataset, ProxyConfiguration, log } from "crawlee"; export const main = async () => { log.setLevel(log.LEVELS.INFO); const proxy = new ProxyConfiguration({ proxyUrls: [process.env.MOBILE_PROXY_URL] }); const startUrls = ["https://example.com/product/1", "https://example.com/product/2"]; const crawler = new CheerioCrawler({ proxyConfiguration: proxy, maxConcurrency: 2, requestHandlerTimeoutSecs: 90, requestHandler: async ({ request, $, log }) => { const title = $("h1.product-title").text().trim(); const priceText = $("span.price").text().trim(); const availability = $("div.stock").text().trim(); const currency = priceText.replace(/[0-9.,\s]/g, ""); const price = parseFloat(priceText.replace(/[^0-9.,]/g, "").replace(",", ".")) || null; await Dataset.pushData({ url: request.loadedUrl, title, price, currency, availability }); log.info(`Saved: ${title || "sin título"}`); }, failedRequestHandler: async ({ request, log }) => { log.warning(`Failed ${request.url}`); } }); await crawler.addRequests(startUrls); await crawler.run(); };
- Ejemplo para PlaywrightCrawler: import { PlaywrightCrawler, Dataset, ProxyConfiguration } from "crawlee"; export const main = async () => { const proxy = new ProxyConfiguration({ proxyUrls: [process.env.MOBILE_PROXY_URL] }); const startUrls = ["https://example.com/product/1"]; const crawler = new PlaywrightCrawler({ proxyConfiguration: proxy, requestHandlerTimeoutSecs: 120, launchContext: { launchOptions: { headless: true } }, requestHandler: async ({ page, request, log }) => { await page.waitForLoadState("domcontentloaded"); const title = await page.title(); const price = await page.locator("span.price").first().textContent().catch(() => null); await Dataset.pushData({ url: request.loadedUrl, title, price }); log.info(`Saved: ${request.loadedUrl}`); } }); await crawler.addRequests(startUrls); await crawler.run(); };
- Guarda MOBILE_PROXY_URL en las variables de entorno del actor en la plataforma Apify (sección Configuración → Variables de entorno). Valor: tu cadena de proxy en el formato http://user:pass@host:port.
- Ejecuta el actor. En los registros, sigue el estado de la solicitud, el tiempo de respuesta y el número de registros guardados con éxito.
Puntos importantes
La estructura de datos en el Dataset debe ser predecible: define campos iguales para todas las tarjetas, de lo contrario, la exportación a tablas será incómoda. Controla los tiempos de espera: para páginas dinámicas aumenta requestHandlerTimeoutSecs y añade esperas para cargar selectores clave.
Consejo: Para una carga suave, establece retardos mínimos/máximos entre solicitudes utilizando la configuración de autoscaled pool o añadiendo pausas manualmente en el handler.
Resultado esperado
El Dataset contiene una entrada por tarjeta de producto con los campos clave. Los registros son estables, no hay errores de autenticación del proxy y el tiempo medio de respuesta es aceptable para tu caso.
Problemas posibles y sus soluciones
- Selectores incorrectos. Causa: diseño adaptable o estructura de página diferente. Solución: revisa la versión móvil y de escritorio, utiliza selectores más estables (atributos data, id únicos).
- Datos vacíos en campos específicos. Causa: valores que se cargan dinámicamente. Solución: añade una espera explícita para los elementos necesarios o usa Playwright en lugar de Cheerio.
✅ Verificación: En el Dataset hay entradas con url, title, price o campos equivalentes. El porcentaje promedio de errores es bajo, menor al 5-10% en la muestra de prueba.
Paso 6: Límites y optimización
Objetivo de la etapa
Configurar paralelismo, tiempos de espera, reintentos, rotación y almacenamiento, para gastar los límites de Apify de manera eficiente y aumentar la estabilidad de la recolección.
Instrucciones paso a paso detalladas
- Limita el paralelismo. En los parámetros del crawler, establece maxConcurrency entre 1 y 3 al principio. Aumenta progresivamente. Cuanto mayor sea el paralelismo, mayor será la carga en el proxy y el sitio.
- Configura reintentos. En Crawlee, hay retryCount y retryTimeoutMillis. Establece retryCount = 1-2, para no agitar páginas problemáticas indefinidamente.
- Gestiona el tiempo de ejecución. Aumenta requestHandlerTimeoutSecs a 90-120 para páginas pesadas. Esto reducirá falsas alarmas de tiempo de espera con respuestas lentas a través de la red móvil.
- Agrega retardos aleatorios. Inserta pausas pequeñas de 300-1500 ms entre solicitudes. Esto se ve más natural y reduce el riesgo de restricciones.
- Planifica la rotación de proxies con el proveedor de manera razonable. Si mobileproxy.space permite solicitar una nueva IP por temporizador, elige un intervalo que no interrumpa la estabilidad de las sesiones.
- Monitorea los límites de Apify: memoria, CPU, tiempo. En la configuración de lanzamiento, especifica Memory (por ejemplo, 1024-2048 MB para Playwright) y Max run time (por ejemplo, 30-60 minutos para batches).
- Almacena solo los campos necesarios. Cuanto menos datos redundantes hay en el Dataset, menor será la carga en el almacenamiento y más rápido será el export.
- Activa el registro a nivel INFO y selectivo en DEBUG durante la depuración. Un volumen excesivo de registros puede interferir en la lectura y no es necesario en modo estable.
Puntos importantes
Ahorrar límites se logra siguiendo algunas reglas simples: bajo paralelismo inicial, reintentos cortos, selectores precisos y minimizar accesos innecesarios a la página. Observación a través de registros y monitoreo ayuda a ajustar configuraciones.
Consejo: Registra URLs exitosas en Key-Value Store o almacenamiento externo. Esto facilitará reiniciar desde el fallo y evitar re-procesar páginas ya recolectadas.
Resultado esperado
El actor funciona de manera uniforme, no consume recursos innecesarios, y los errores son raros y predecibles. Los parámetros de tiempos de espera y paralelismo están ajustados a la velocidad de tu proxy móvil y la complejidad del sitio.
Problemas posibles y sus soluciones
- Aumentar los tiempos de espera no ayuda. Causa: sobrecarga de la página o problemas con el proveedor. Solución: reduce temporalmente el paralelismo a 1 y verifica la estabilidad de la conexión.
- Velocidad demasiado lenta. Causa: un cuello de botella en la red de proxies o en el sitio web pesado. Solución: aumenta los retardos, pero también considera dividir las tareas en batches más pequeños.
✅ Verificación: El tiempo medio por página es estable, el porcentaje de errores no aumenta al incrementar el volumen, y los límites de memoria y tiempo no se exceden.
Verificación de resultado
Lista de verificación: lo que debería funcionar
- El actor se ejecuta sin errores y termina correctamente.
- Los proxies móviles están conectados y la IP en las solicitudes de verificación corresponde al proxy.
- El Dataset contiene los campos y valores esperados.
- Los registros son informativos, pero no están sobrecargados.
- En reinicios no hay duplicados innecesarios (o se controlan).
Cómo probar
- Ejecuta el actor en 2-3 URLs de prueba con el proxy habilitado y verifica la IP a través de una página indicadora.
- Compara las cifras: cuántas solicitudes fueron añadidas y cuántos resultados obtuviste. Deben coincidir o diferir dentro de un error comprensible.
- Exporta el Dataset a CSV y asegúrate de que los datos estén limpios: sin null donde esperas valores.
Métricas de ejecución exitosa
- El porcentaje de solicitudes fallidas es menor al 5-10% en la prueba.
- El tiempo medio de procesamiento de la página es estable y predecible.
- No hay picos anómalos en los tiempos de espera o errores de autenticación del proxy.
Consejo: Registra un conjunto de URLs de control y repite la prueba antes de cada cambio importante en el código. Así podrás detectar regresiones rápidamente.
Errores comunes y soluciones
- Problema: 407 Proxy Authentication Required. Causa: credenciales incorrectas del proxy. Solución: revisa el nombre de usuario y la contraseña, actualiza las variables de entorno y reinicia el actor.
- Problema: ECONNRESET y ETIMEDOUT en los registros. Causa: inestabilidad de la red o sobrecarga. Solución: reduce el maxConcurrency, aumenta los tiempos de espera y haz pausas entre solicitudes.
- Problema: campos vacíos en el Dataset. Causa: selectores incorrectos o carga dinámica. Solución: usa PlaywrightCrawler, añade esperas, revisa los selectores.
- Problema: límite de memoria alcanzado. Causa: demasiadas pestañas paralelas o almacenamiento de datos innecesarios. Solución: reduce el paralelismo, acorta el volumen de datos, aumenta la memoria en la configuración de lanzamiento.
- Problema: recolección demasiado lenta. Causa: páginas pesadas y red móvil. Solución: prioriza la cola de datos, divide la tarea en batches, optimiza selectores y desactiva navegaciones innecesarias.
- Problema: duplicados en los resultados. Causa: reinicio con las mismas URLs sin filtro. Solución: lleva un registro de enlaces procesados en Request Queue con unicidad, o verifica duplicados antes de guardar.
- Problema: el sitio sensible reacciona a solicitudes frecuentes. Causa: ritmo demasiado agresivo. Solución: reduce la velocidad, añade jitter a los retardos, utiliza encabezados correctos y un User-Agent actual.
Consejo: Durante la depuración, activa temporalmente registros detallados para uno o dos URLs y analiza cada paso. Esto es más rápido que lidiar con grandes batches.
Posibilidades adicionales
Configuraciones avanzadas
- Secretos y configuraciones. Almacena MOBILE_PROXY_URL y otras claves en la sección Secrets. En el código, léelas a través de process.env.
- Cambio de User-Agent. Para simular un cliente móvil, establece un User-Agent móvil y un viewport adecuado en Playwright. Haz esto de manera moderada y solo si es necesario para una correcta visualización de la página.
- Programador de tareas. Crea una Tarea y programa intervalos de ejecución (diarios, horarios). Monitorea los límites y el volumen de resultados.
Optimización
- Cacheo. Si las páginas cambian raramente, añade un caché de consultas y visitas repetidas para no gastar proxies y límites innecesariamente.
- Colas y prioridades. Trabaja a través de Request Queue, priorizando enlaces importantes y omitiendo los secundarios.
- División en microservicios. Divide una tarea compleja en varios actores: recolección de enlaces, procesamiento de tarjetas, validación y exportación.
Qué más se puede hacer
- Integraciones por API. Configura el envío de resultados a tu CRM o sistema analítico tras cada ejecución a través de Webhook.
- Validación de datos. Antes de exportar, verifica los esquemas: asegura que todos los valores correspondan al tipo y rango esperados.
- Enlaces internos en el documento. Si es necesario, regresa a la sección Límites y optimización al ajustar el rendimiento.
Consejo: Usa el modo de vista previa y pequeños batches para la ejecución inicial en la programación, luego escálalo gradualmente.
FAQ
- ¿Cómo saber si el proxy es realmente móvil? Verifica el ASN y el tipo de red por IP a través de bases externas y compáralo con operadores móviles. Además, los proxies móviles suelen tener un pool de direcciones característico con dinámica de cambio.
- ¿Se pueden usar varios proxies móviles al mismo tiempo? Sí, indica varios proxyUrls. Crawlee seleccionará automáticamente uno de la lista. Mantente atento a los límites de cada proxy.
- ¿Qué hacer si el sitio muestra un captcha? Reduce la frecuencia, añade retardos, verifica los encabezados y considera usar la API oficial del recurso. Evita acciones que infrinjan las reglas del sitio.
- ¿Cómo almacenar las contraseñas de los proxies de forma segura? Usa variables de entorno y Secrets en la plataforma Apify. No comités contraseñas en git.
- ¿Es necesario cambiar el User-Agent a móvil? Solo si el sitio entrega diferentes versiones de la página. En otros casos, es suficiente con un comportamiento estable y retardos correctos.
- ¿Por qué CheerioCrawler es más rápido? No renderiza la página, solo procesa el HTML. Para páginas dinámicas, usa PlaywrightCrawler, aunque sea más lento.
- ¿Cómo exportar resultados? En la interfaz de Dataset, selecciona exportar a CSV, JSON, XLSX. O utiliza la API de Datasets si deseas automatizar la exportación.
- ¿Se pueden combinar Apify Proxy y proxies móviles? En una misma ejecución, es mejor usar solo uno. Si necesitas diferentes fuentes, divide las tareas por actor o por configuraciones de lanzamiento.
- ¿Cuántas solicitudes por segundo son seguras? Comienza con 1-3 por segundo y monitorea métricas. Para sitios sensibles, reduce a 0.2-0.5 con pausas.
- ¿Es necesario habilitar headful en Playwright? Solo para depuración. En producción, utiliza headless para ahorrar recursos.
Conclusión
Has configurado un actor funcional de Apify con proxies móviles, comprendido los conceptos clave y principios, recolectado datos de prueba de tarjetas de productos y optimizado los límites. Ahora gestionas con confianza el paralelismo, el tiempo de espera y el almacenamiento de resultados, y sabes cómo proteger secretos y contraseñas. A partir de aquí, puedes ampliar el proyecto: agregar tipos de páginas, construir un pipeline de varios actores, conectar un programador y exportaciones automáticas. Si surgen preguntas puntuales, regresa a la sección FAQ o a Límites y optimización. Recuerda que los proxies móviles son una herramienta para aumentar la estabilidad y naturalidad del tráfico, no un medio para eludir restricciones. Trabaja de manera ética, respeta las reglas de los sitios y siempre comienza con pequeñas pruebas, verificando cada cambio.