
Lucas Mitchell
Automation Engineer

Un raspador puede lanzar más solicitudes y recopilar menos datos útiles. Las respuestas lentas mantienen las conexiones ocupadas, los trabajadores repiten solicitudes fallidas y la cola se llena de copias del trabajo en progreso. Aumentar el número de trabajadores puede amplificar el mismo cuello de botella. La medida de rendimiento útil es los datos aceptados entregados dentro del plazo del trabajo, no el número de solicitudes iniciadas.
Este guía explica cómo configurar un límite de concurrencia para un flujo de trabajo de recolección autorizado. Cubre la admisión a nivel de fuente, la programación de reintentos, la capacidad del navegador y un proceso de ajuste controlado. CapSolver encaja en una etapa separada y respaldada de tareas CAPTCHA cuando el flujo permitido lo requiere. Ni un mayor grupo de trabajadores ni un desafío completado cambian la política de tasa de la fuente, por lo que el programador debe mantener el control durante toda la ejecución.
La concurrencia es el número de operaciones actualmente en vuelo, mientras que la tasa de solicitud mide los inicios a lo largo del tiempo. Un límite de concurrencia solo no garantiza una tasa de solicitud estable, ya que el tiempo de respuesta cambia qué tan rápido se liberan las ranuras.
Imagina una fuente de prueba permitida con cuatro ranuras de solicitud activas. Si las solicitudes terminan rápidamente, esas ranuras pueden generar muchos inicios en un corto período. Si las respuestas se ralentizan, las mismas cuatro ranuras generan menos inicios mientras pasan más tiempo ocupadas. Ambos comportamientos obedecen el límite de concurrencia. Se necesita un controlador de tasa separado cuando los inicios deben permanecer dentro de un límite basado en el tiempo.
El glosario de concurrencia y el glosario de limitación de tasa describen conceptos relacionados. En tu programador, regístralos como ajustes separados. Agrega un máximo de cola en espera y un plazo de trabajo para que el trabajo retrasado no se acumule indefinidamente detrás de límites razonables.
No existe un número universal óptimo de solicitudes concurrentes. La política de la fuente, el tamaño de la carga, la renderización del navegador, el ancho de banda y el procesamiento posterior todos influyen en el punto de operación útil. Comienza desde la asignación documentada de la fuente y tu propia capacidad, luego mide una carga permitida explícitamente.
Un límite de concurrencia debe cubrir a los trabajadores que compiten por la misma capacidad o permiso. Una configuración por proceso es insuficiente cuando varios procesos, máquinas o trabajos acceden a la misma fuente limitada.
Identifica el alcance relevante antes de crear trabajadores. Puede ser un nombre de host, una credencial de API, un cupo de cuenta definido por la fuente o una sesión de navegador controlada. Usa el alcance descrito por el proveedor en lugar de asumir que cada URL tiene capacidad independiente. Los subdominios también pueden compartir infraestructura o cupos a nivel de cuenta.
Separa la capacidad global de la capacidad de la fuente. Un techo global protege tus propias máquinas y recursos salientes. Los techos por fuente evitan que una cola rápida consuma todos los slots disponibles. Si la fuente está temporalmente pausada, otra fuente permitida independientemente puede continuar sin usar la identidad o cupo de la fuente pausada.
Para flujos de trabajo de navegador, decide qué ocupa una ranura: una navegación, una página activa o una sesión completa. Una sesión vinculada a una cuenta no debe compartirse casualmente entre trabajos concurrentes. Sus cookies, acciones pendientes y destino esperado necesitan un propietario durante la duración de la tarea.
La admisión debe ocurrir antes de que comience la solicitud y debe aplicarse igualmente a los primeros intentos, reintentos, redirecciones controladas por tu cliente y reinicios de trabajadores. Un camino de reintentos que envía directamente al transporte puede invalidar los límites del programador principal.
Usa una identidad de tarea para la observación deseada y identidades de intento separadas para el trabajo del transporte. Esto permite que la cola distinga un reintentos legítimo de un trabajo programado duplicado. Si un trabajador se reinicia, debe inspeccionar si la observación ya se completó antes de crear otra solicitud.
Una ranura debe liberarse cuando la operación relevante haya terminado realmente o su transporte haya sido cancelado. Liberar capacidad simplemente porque el llamador dejó de esperar puede dejar solicitudes ocultas que sigan ejecutándose más allá del límite nominal. Trata el trabajo incierto o en ejecución como capacidad ocupada hasta que su estado se resuelva.
Limita también la cola. Cuando demasiado trabajo llega, pospone una ventana de recolección posterior, rechaza la demanda excesiva o reduce el alcance solicitado según tu contrato de servicio. Mantener un historial ilimitado traslada el fallo a la presión de memoria y observaciones obsoletas.
Los reintentos deben regresar a una cola controlada con un tiempo futuro elegible, un recuento de intentos y el plazo restante de la tarea. Llamadas de dormir dispersas dentro de los trabajadores dificultan coordinar un enfriamiento compartido de la fuente.
El código de estado HTTP 429 indica que se han enviado demasiadas solicitudes dentro de un período relevante. Cuando la respuesta incluye Retry-After, conserva su demora o semántica de fecha. No dejes que cada trabajador elija independientemente una espera más corta.
Usa un enfriamiento compartido para el alcance afectado. Deja de admitir nuevo trabajo allí mientras el enfriamiento esté activo, incluyendo solicitudes que nunca hayan fallado. El trabajo en ejecución puede terminar, pero una respuesta exitosa de un trabajador no debe borrar automáticamente un enfriamiento válido observado por otro.
Para fallas temporales de lectura sin guía explícita del servidor, aplica una política de reintentos acotada adecuada a la operación. Un horario escalonado puede evitar picos sincronizados después de la pausa. No agregues reintentos a un envío de formulario u otra operación que cambie el estado, a menos que entiendas su efecto y repetibilidad.
| Observación | Respuesta del programador | Evidencia a conservar |
|---|---|---|
| HTTP 429 | Pausa el alcance afectado y respeta la guía de reintentos | Alcance de fuente, tiempo de respuesta, enfriamiento |
| Tiempo de espera de lectura temporal | Reencola solo dentro del presupuesto de intento y plazo | Identidad de intento y tiempo restante |
| Rechazo de autenticación o acceso | Detén o redirige para revisión de acceso | Categoría de respuesta redactada |
| Punto de control de CAPTCHA soportado | Ingresa a una etapa separada permitida de desafío | Observación actual y contexto de desafío |
| Registro extraído inválido | Investiga el análisis o los datos de la fuente | Referencia de página conservada y error de validación |
Redimir tu código de bonificación de CapSolver
¡Aumenta tu presupuesto de automatización instantáneamente!
Usa el código de bonificación CAP26 al recargar tu cuenta de CapSolver para obtener un 5% adicional en cada recarga — sin límites.
Redímelo ahora en tu Panel de CapSolver
Un punto de control de CAPTCHA debe crear una transferencia controlada, no un bucle adicional de solicitudes junto con el raspador. La observación de destino sigue siendo una tarea incluso si requiere un paso de desafío soportado.
La documentación de createTask de CapSolver define la presentación de tareas, mientras que getTaskResult documenta la recuperación de resultados. Sigue los requisitos de tarea aplicables y mantén la identidad de tarea devuelta asociada con la observación actual. Consultar una tarea conocida y crear una nueva tarea son operaciones diferentes.
Dale a esta etapa su propio límite para trabajo activo, tiempo y intentos. La asignación de tasa de la fuente sigue aplicando cuando el navegador reanude. Un resultado de desafío no debe otorgar una excepción inmediata a un enfriamiento de fuente o hacer que todos los trabajadores pausados se reinicien juntos.
Si la presentación de una tarea se agota antes de conocer su aceptación, conserva la incertidumbre. Presentar otra tarea ciegamente puede duplicar el trabajo. El programador debe saber si está esperando un resultado existente, investigando una solicitud incierta o cerrando la observación para revisión.
Después de que la destinación prosiga, verifica la página esperada y registra el contrato. De lo contrario, un aumento en el volumen de desafíos puede ocultar el hecho de que la salida de recolección aceptada no haya mejorado.
Un aumento de concurrencia debe cambiar un ajuste de capacidad mientras mantiene estable el trabajo de comparación y los criterios de aceptación. Usa una fuente de prueba propia o otro entorno donde el test de carga sea explícitamente permitido.
Comienza con un trabajo permitido pequeño y registra las observaciones completadas, registros aceptados, latencia de solicitud, categorías de error y edad de la cola. Separa el tiempo gastado esperando admisión del tiempo gastado en la red o en el navegador. Una duración final prolongada puede tener causas diferentes que requieren soluciones distintas.
Mantén visibles los primeros intentos y reintentos en el mismo informe. Si los registros aceptados permanecen constantes mientras aumentan las solicitudes totales, el tráfico adicional no produce un rendimiento útil. Verifica si la política de reintentos, la preparación de la página o la validación posterior explica la diferencia antes de agregar trabajadores.
Aumenta el límite en un paso predefinido pequeño y observa un intervalo comparable. Deja de aumentar cuando el rendimiento aceptado se estanque, la frecuencia de fallos aumente o la latencia de cola exceda las necesidades de la tarea. Estas observaciones identifican un límite de capacidad para ese trabajo; no prueban un límite permanente a nivel del proveedor.
Repite casos representativos con tamaños de carga y tipos de página diferentes. Una página HTML ligera y un tablero con JavaScript pesado pueden requerir recursos de navegador muy diferentes. Evita seleccionar el límite de operación solo desde las páginas más fáciles.
Elige un punto de operación con espacio por debajo del límite de fallos en lugar de ejecutar permanentemente al valor más alto que pasó brevemente. El rendimiento de la fuente y tu propia infraestructura pueden variar. Reserva capacidad para trabajo programado y evita que trabajos exploratorios tomen todo el grupo.
El freno automático puede adaptar el momento de las solicitudes al latencia observada, pero su comportamiento depende de la implementación y los límites configurados. Lee la documentación del framework que consumes antes de combinarlo con un segundo programador.
La documentación de Scrapy AutoThrottle describe una concurrencia objetivo y un ajuste de demora basado en la latencia, respetando los techos de concurrencia configurados. Su objetivo no es una promesa incondicional de que siempre haya un número exacto de solicitudes activas. Las respuestas no exitosas también reciben un tratamiento especial en el cálculo de la demora.
Usa controles específicos del framework para su alcance documentado. Un freno local de un raspador no coordina automáticamente despliegues independientes ni impone un cupo organizacional total. Si varios trabajos comparten un único cupo, coloca un controlador compartido por encima de esos trabajadores independientes.
Registra la configuración efectiva usada para cada ejecución. Un experimento de concurrencia es difícil de reproducir si el framework, el grupo de transporte, el middleware de reintentos y el programador externo cambian al mismo tiempo. La visión general de la infraestructura del navegador proporciona contexto útil para separar estos recursos.
Un menor rendimiento aceptado puede provenir de la red, la fuente, el navegador, el analizador o el almacén de destino. Más trabajadores de búsqueda solo ayudan a algunos de esos cuellos de botella y pueden empeorar otros.
Si la cola crece mientras las ranuras de red permanecen inactivas, inspecciona la lógica de admisión y enfriamiento. Si la memoria del navegador aumenta, revisa la vida útil de la sesión y la limpieza de la página. Si las solicitudes terminan pero los registros son rechazados, inspecciona la preparación del contenido, los cambios de esquema y el comportamiento del analizador. Si los registros aceptados esperan para ser almacenados, aplica presión atrás desde el escritor de bajo nivel.
Mantén un procedimiento de pausa explícito. Los operadores deben poder detener nuevos inicios para una fuente, preservar las identidades de tarea en vuelo y reanudar gradualmente después de entender el problema. Reiniciar a todos los trabajadores a la vez es una mala sustituta de una reapertura controlada de capacidad.
Establece la concurrencia de raspado alrededor de la política de la fuente, la propiedad real de recursos y los registros aceptados. Ruta cada intento a través de la admisión, coordina los enfriamientos y aumenta la carga solo cuando el pipeline completo se beneficia.
Para flujos que requieren manejo de CAPTCHA soportado, usa CapSolver dentro de una etapa separada y acotada y vuelve a los mismos controles de fuente después. Un programador disciplinado hace que el sistema sea más fácil de operar a medida que cambia la carga y el comportamiento de las páginas.
P: ¿Es lo mismo un límite de concurrencia que un límite de solicitudes por segundo?
No. Los límites de concurrencia activan operaciones. Los límites de tasa de solicitudes controlan los inicios a lo largo del tiempo, por lo que podrías necesitar ambos controles.
P: ¿Debería cada trabajador manejar HTTP 429 de forma independiente?
Los trabajadores que comparten el mismo alcance limitado por tasa deben coordinar su enfriamiento. Los reintentos independientes pueden recrear un pico incluso cuando cada trabajador parece conservador.
P: ¿Puedo resolver el raspado lento aumentando la concurrencia?
Solo cuando la capacidad adicional mejore la salida aceptada dentro de los límites permitidos por la fuente. Primero identifica si el cuello de botella está en la adquisición, renderizado, análisis o almacenamiento.
P: ¿Debe un resultado de CAPTCHA permitir que una solicitud salte al programador?
No. Las reglas de tasa y concurrencia de la destinación siguen aplicando después de completar el manejo del desafío.
P: ¿Qué debe ocurrir cuando el almacenamiento de bajo nivel se queda atrás?
Reduce o pausa la adquisición nueva mediante presión atrás. Una cola ilimitada de páginas recuperadas aumenta el uso de recursos y puede dejar observaciones obsoletas antes de que sean aceptadas.
Aprende una arquitectura de raspado web escalable en Rust con reqwest, scraper, raspado asíncrono, raspado con navegador sin cabeza, rotación de proxies y manejo de CAPTCHA conforme.

Automatiza la resolución de CAPTCHA con Nanobot y CapSolver. Utiliza Playwright para resolver reCAPTCHA y Cloudflare autónomamente.
