Cómo navegar por sitios web de buscapersonas basados ​​en JavaScript y recopilar enlaces

Pagination

Comprensión de los desafíos de la API y la paginación basada en JavaScript

Los sitios web con paginación basada en JavaScript pueden dificultar que los visitantes naveguen por el material, especialmente si los controles de paginación no revelan ningún parámetro de URL. Esto hace que sea imposible modificar o automatizar la navegación de la página utilizando enfoques convencionales, como cambiar las consultas de URL. Es posible interactuar con dichos buscapersonas mediante diferentes métodos.

Uno de esos problemas ocurre al intentar recuperar enlaces o datos de este tipo de sitios web. Si no puede navegar manualmente por cientos de páginas, un mejor enfoque es simular eventos de clic en el buscapersonas JavaScript. Esta tecnología automatiza el procedimiento de navegación, simplificando enormemente las tareas de recogida de datos.

En algunas circunstancias, la pestaña "Red" de las Herramientas de desarrollo del navegador puede mostrar puntos finales de API que proporcionan información útil. Sin embargo, interactuar directamente con estos puntos finales puede causar problemas ocasionalmente porque es posible que no permitan ciertos métodos HTTP, como las solicitudes GET, que se usan comúnmente para recuperar datos.

Este artículo explica cómo simular eventos de clic en el buscapersonas JavaScript de un sitio web y cómo lidiar con las limitaciones de API que restringen el acceso directo a los datos que necesita. También veremos formas de evitar los límites en métodos API específicos para garantizar que recopile toda la información importante de manera efectiva.

Dominio Ejemplo de uso
document.querySelector() Este método se utiliza para seleccionar el primer elemento que coincida con un selector CSS determinado. El script lo usa para elegir el contenedor de paginación (const pagerContainer = document.querySelector('.pagination')) y controlar los botones del buscapersonas.
Array.from() Convierte un objeto iterable o similar a una matriz en una matriz adecuada. El script convierte una NodeList de enlaces de anuncios en una matriz para facilitar la manipulación y el mapeo (Array.from(document.querySelectorAll('.ad-link-selector')).
puppeteer.launch() Cuando se usa con Puppeteer, este comando inicia una nueva instancia de navegador sin cabeza. Admite acciones automatizadas del navegador, como navegación de páginas y simulación de interacciones del usuario (const browser = await puppeteer.launch()).
page.evaluate() In Puppeteer, this method allows you to run JavaScript code in the context of the web page you are controlling. It is used here to extract ad links from the DOM (await page.evaluate(() =>En Puppeteer, este método le permite ejecutar código JavaScript en el contexto de la página web que está controlando. Se utiliza aquí para extraer enlaces de anuncios del DOM (await page.evaluate(() => {...})).
page.waitForSelector() Espera a que aparezca un selector específico en la página antes de continuar, asegurando que todos los elementos dinámicos estén cargados. Esto es especialmente importante al navegar por contenido paginado, ya que aparecen nuevos anuncios con cada cambio de página (await page.waitForSelector('.ad-link-selector').
axios.post() Envía una solicitud HTTP POST a la URL proporcionada. El ejemplo intenta evitar el problema 405 obteniendo datos mediante POST en lugar de GET (respuesta constante = await axios.post()).
console.error() Se utiliza para escribir mensajes de error en la consola. Ayuda con la depuración al mostrar información de error cuando fallan ciertos elementos o solicitudes de API (console.error('¡Botón de página no encontrado!').
$() Una abreviatura para seleccionar elementos en Puppeteer, comparable a document.querySelector(). Este script utiliza el botón "Página siguiente" para generar un evento de clic de paginación (const nextButton = await page.$('.pagination-next').
click() Este enfoque replica un clic en un elemento HTML. En los scripts, se utiliza para navegar por el buscapersonas mediante programación haciendo clic en el botón de página adecuado.

Dominar la paginación basada en JavaScript y la navegación API

El primer script introducido utiliza JavaScript puro para explorar dinámicamente una página con paginación basada en JavaScript. La idea básica detrás de este método es imitar a un usuario presionando los botones del buscapersonas eligiendo y activando eventos de clic en los elementos HTML apropiados. Identificando el contenedor de paginación usando el comando, podemos acceder a los distintos botones de la página y automatizar la navegación. Este enfoque es ideal para casos en los que cambiar manualmente la URL no es una opción y se necesita una interfaz de usuario rápida para interactuar con el mecanismo de paginación.

En el segundo script, utilizamos Puppeteer, un paquete de Node.js para controlar un navegador sin cabeza. Este script no solo simula la pulsación de botones en el buscapersonas, sino que también automatiza todo el proceso de desplazamiento por numerosas páginas, reuniendo todos los enlaces publicitarios en cada iteración. Puppeteer le permite extraer contenido cargado dinámicamente interactuando directamente con elementos DOM, como lo haría un usuario real. Uno de los componentes principales aquí es , que permite que el código JavaScript se ejecute dentro del contexto de la página. Esto es perfecto para recopilar datos como enlaces de anuncios en páginas paginadas.

Ambos scripts requieren manejo de errores para garantizar que el proceso automatizado funcione bien incluso si faltan piezas específicas o la API se comporta inesperadamente. Por ejemplo, registra cualquier error encontrado durante la ejecución, como cuando no se encuentra un botón específico en la página. Además, el Titiritero El comando garantiza que los componentes dinámicos, como los enlaces de anuncios, estén completamente cargados antes de que el script intente interactuar. Esto lo hace extremadamente útil cuando se trabaja con sitios web que dependen en gran medida de JavaScript para representar contenido, ya que evita problemas causados ​​por cargas de páginas faltantes o incompletas.

El script terminado utiliza Axios, un cliente HTTP Node.js basado en promesas, en el backend. Aquí, intentamos obtener datos directamente desde el punto final de la API, que, según el error HTTP 405, no acepta consultas. Para evitar esto, el script envía un solicitud, que podrá ser aprobada por el servidor. Este método es más adecuado para usuarios que desean extraer datos sin tener que navegar por el front-end, pero implica comprender la estructura y el comportamiento de la API del servidor. El manejo de errores garantiza que se informe cualquier falla en la solicitud de API, lo que facilita la resolución de problemas de recuperación de datos del lado del servidor.

Solución 1: emular clics en un buscapersonas de JavaScript utilizando JavaScript básico

Este enfoque utiliza JavaScript básico para activar mediante programación el evento de clic en los botones del buscapersonas seleccionando los elementos DOM apropiados. Esto se puede aplicar a cualquier escenario de front-end dinámico en el que los elementos se representen con JavaScript.

// Select the pagination container
const pagerContainer = document.querySelector('.pagination');

// Function to trigger a click event on a pager button
function clickPageButton(pageNumber) {
  const buttons = pagerContainer.querySelectorAll('button');
  const targetButton = [...buttons].find(btn => btn.textContent === String(pageNumber));
  if (targetButton) {
    targetButton.click();
  } else {
    console.error('Page button not found!');
  }
}

// Example usage: clicking the 2nd page button
clickPageButton(2);

Solución 2: uso de Puppeteer para automatizar la navegación del buscapersonas y la extracción de anuncios.

Puppeteer, una herramienta de Node.js que proporciona una API de alto nivel para operar un navegador sin cabeza, se utiliza de esta manera para navegar por el buscapersonas JavaScript y recopilar enlaces de toda la publicidad. Es una solución de back-end que se utiliza con frecuencia para trabajos de raspado automatizados.

const puppeteer = require('puppeteer');

// Function to scrape all ad links from a paginated website
async function scrapeAds() {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://www.supralift.com/uk/itemsearch/results');

  let ads = [];
  let hasNextPage = true;

  while (hasNextPage) {
    // Scrape the ad links from the current page
    const links = await page.evaluate(() => {
      return Array.from(document.querySelectorAll('.ad-link-selector')).map(a => a.href);
    });
    ads.push(...links);

    // Try to click the next page button
    const nextButton = await page.$('.pagination-next');
    if (nextButton) {
      await nextButton.click();
      await page.waitForSelector('.ad-link-selector');
    } else {
      hasNextPage = false;
    }
  }

  await browser.close();
  return ads;
}

// Call the scraping function and log results
scrapeAds().then(ads => console.log(ads));

Solución 3: obtener datos de API usando Axios en Node.js

Este método se centra en utilizar Axios en Node.js para recuperar datos directamente desde una API. El error 405 indica que el método GET no está permitido, por lo que esta estrategia utiliza POST u otros encabezados para eludir la restricción. Esto es apropiado para un escenario de back-end en el que se requieren interacciones API.

const axios = require('axios');

// Function to fetch data from the API using POST instead of GET
async function fetchData() {
  try {
    const response = await axios.post('https://www.supralift.com/api/search/item/summary', {
      headers: {
        'Content-Type': 'application/json'
      },
      data: { /* Add necessary POST body if applicable */ }
    });

    console.log(response.data);
  } catch (error) {
    console.error('Error fetching data:', error.response ? error.response.data : error.message);
  }
}

// Invoke the fetchData function
fetchData();

Optimización de la paginación de JavaScript para web scraping y recopilación de datos

Al explorar sitios web con un sistema de paginación basado en JavaScript, es fundamental investigar varios métodos para extraer datos rápidamente. Una opción que a veces se ignora es interceptar las solicitudes de red emitidas por el mecanismo de paginación. Al revisar cuidadosamente las consultas realizadas en las Herramientas de desarrollo del navegador, en particular la pestaña "Red", puede determinar los puntos finales utilizados para recuperar datos para cada página. Los sistemas basados ​​en JavaScript pueden utilizar o solicitudes para cargar datos dinámicamente sin cambiar la URL, a diferencia de la paginación tradicional que requiere cambiar los parámetros de la URL.

Para extraer enlaces o datos de dichos sitios web, interceptar las solicitudes y recuperar los datos que devuelven. Puppeteer y otras herramientas le permiten monitorear el tráfico de la red y recopilar datos útiles. Cuando esta estrategia no es viable debido a limitaciones del lado del servidor, comprender el comportamiento de la API se vuelve fundamental. Algunas API, como , puede prohibir métodos específicos como y solo permitir consultas. Adaptar sus consultas para que coincidan con el método previsto de la API es una solución alternativa eficaz para estas limitaciones.

Finalmente, al extraer datos paginados, es fundamental permitir pausas adecuadas entre solicitudes. Muchos sitios web utilizan algoritmos de limitación de velocidad para evitar abusos, y enviar demasiadas solicitudes en rápida sucesión puede provocar que su dirección IP se incluya temporalmente en la lista negra. Para evitar la detección y garantizar una extracción de datos exitosa, incluya un retraso aleatorio entre consultas o limite la cantidad de solicitudes simultáneas. Usando herramientas como en Node.js y el manejo adecuado de la velocidad es un enfoque maravilloso para lograrlo.

  1. ¿Qué es la paginación basada en JavaScript?
  2. La paginación basada en JavaScript es una forma en que los botones de paginación utilizan JavaScript para cargar dinámicamente material nuevo, frecuentemente sin cambiar la URL.
  3. ¿Cómo puedo extraer datos de un sitio web paginado en JavaScript?
  4. Puedes utilizar herramientas como o para automatizar los clics en los botones de paginación o capturar solicitudes de red durante la paginación.
  5. ¿Por qué la API devuelve un error 405 Método no permitido?
  6. Esto ocurre porque la API solo admite ciertos métodos HTTP. Por ejemplo, puede bloquear solicitudes mientras se permite solicitudes.
  7. ¿Puedo modificar la URL para navegar por las páginas?
  8. En la paginación basada en JavaScript, frecuentemente no es posible modificar la URL directamente. Para navegar, deberá activar un evento de JavaScript o utilizar puntos finales de API.
  9. ¿Qué herramientas puedo utilizar para extraer datos paginados?
  10. Los programas de scraping populares incluyen para la automatización del navegador y para solicitudes HTTP. Ambos manejan el contenido paginado de manera eficiente.

Trabajar con paginación basada en JavaScript requiere una combinación de soluciones de front-end y back-end. Ya sea que utilice Puppeteer para automatizar las actividades del navegador o Axios para interactuar directamente con los puntos finales de API, el scraping eficiente requiere un diseño y ejecución cuidadosos.

Comprender cómo un sitio web carga y procesa datos le permite escribir scripts eficientes para extraer la información necesaria. Para evitar peligros frecuentes como el error 405, tenga cuidado de monitorear el tráfico de la red, administrar los límites de velocidad y utilizar los métodos HTTP adecuados.

  1. Se hace referencia a información detallada sobre el uso de Puppeteer para el web scraping en la documentación oficial de Puppeteer. Documentación del titiritero
  2. La explicación de los métodos HTTP y el manejo de solicitudes API, específicamente en torno al error 405 "Método no permitido", se derivó de Documentos web de MDN .
  3. La información sobre Axios para realizar solicitudes HTTP en Node.js se obtuvo del sitio oficial Documentación de Axios .
  4. Para la manipulación del DOM de JavaScript y eventos como click(), se hizo referencia al contenido desde el Documentos web de MDN .