Empezar por la solicitud, no por la interfaz
Antes de escribir la lógica de Paginación, abre DevTools y observa qué cambia al pasar al siguiente lote.- Abre la pestaña Network y filtra Fetch/XHR.
- Avanza, desplázate o pulsa Cargar más.
- Inspecciona la URL, los parámetros, el cuerpo y la respuesta.
- Decide si conviene seguir enlaces, interactuar con la página o llamar directamente a una API.
offset=40. Un enlace de página puede cargar los resultados mediante JavaScript después de cambiar la URL.
Páginas numeradas
La Paginación numerada es el caso más sencillo porque la siguiente ubicación aparece en la URL:0, los nombres de parámetro como p o start y los sitios que vuelven a mostrar la primera página cuando el número solicitado está fuera del intervalo. La repetición de la primera página es peor que una página vacía, porque puede crear datos duplicados sin errores evidentes.
Enlaces Siguiente
Algunos sitios no muestran números de página, sino únicamente un enlace o una flecha «Siguiente». Si el elemento es un ancla normal, trata la Paginación como un proceso de seguimiento de enlaces:seen_urls es importante. Algunos sitios mal configurados hacen que el último enlace «Siguiente» vuelva a la página actual o a la primera. Antes de confiar en el enlace, comprueba también estados desactivados como aria-disabled="true", disabled o una clase disabled.
Desplazamiento infinito
El desplazamiento infinito parece un problema exclusivo del navegador, pero suele tener una API subyacente. Desplázate una vez con DevTools abierto y busca una solicitud que obtenga el siguiente grupo de registros. Los parámetros útiles suelen llamarseoffset, page, after, cursor o limit.
Cuando sea posible utilizar el endpoint, llámalo directamente:
Botones Cargar más
Un botón Cargar más es una forma controlada de desplazamiento infinito. La página espera a que se haga clic antes de solicitar el siguiente lote. Esto facilita el control del ritmo, porque el scraper puede esperar, validar el nuevo número de elementos y reintentar si la solicitud falla. Si el botón llama a una API sencilla, usa esa API. De lo contrario, haz clic en el botón dentro de un bucle del navegador:API con offset y cursor
Los sitios modernos suelen Paginar los datos en la capa de API. La Paginación por offset solicita una posición numérica:Retry-After, reintenta los fallos temporales con espera incremental y guarda el progreso si el trabajo es lo bastante grande como para que reiniciarlo desde la primera página resulte costoso.
Paginación híbrida
Los sitios reales suelen combinar varios patrones:- Una categoría tiene páginas numeradas, pero cada página carga más productos de forma diferida después de desplazarse.
- Una página de búsqueda empieza con un botón Cargar más y después cambia a enlaces numerados.
- Una interfaz con pestañas tiene una Paginación independiente para «Novedades», «Popular» y «Ofertas».
- Una página de listado Pagina las URL de resultados y cada página de detalles tiene sus propias reseñas o comentarios Paginados.
Medidas prácticas
- Define una señal de parada. Los conjuntos de resultados vacíos, los enlaces Siguiente ausentes, los botones desactivados,
hasNextPage: false, los cursores repetidos y los límites máximos de iteraciones son señales de parada válidas. - Detecta duplicados. El desplazamiento infinito y las API con cursor pueden repetir registros cuando los datos cambian durante la ejecución. Guarda identificadores estables o URL canónicas.
- Modera la navegación. Agrega pequeñas pausas aleatorias entre lotes. La Automatización del navegador debe esperar a que cambie el contenido, no solo usar tiempos de espera fijos.
- Registra los fallos. Si una página falla después de varios reintentos, registra la URL o el cursor y continúa cuando sea posible.
- Prefiere las API cuando sean legítimas y estables. La Paginación directa mediante API suele ser más rápida y fácil de validar que controlar un navegador.
- Usa una herramienta visual cuando la rapidez importe más que el código personalizado. En Octoparse, puedes configurar visualmente la Paginación habitual mediante Siguiente, Cargar más y desplazamiento infinito, y después ejecutarla localmente o en la nube.