Una página web dinámica es aquella cuyo contenido no está incrustado directamente en HTML estático, sino que se genera a través del renderizado del lado del servidor o del lado del cliente.
Puede mostrar datos en tiempo real en función de las acciones del usuario, como cargar más contenido cuando el usuario hace clic en un botón o se desplaza hacia abajo en la página (como el desplazamiento infinito). Este diseño mejora la experiencia del usuario y permite a los usuarios obtener información relevante sin tener que volver a cargar toda la página.
Para determinar si un sitio web es una página web dinámica, puede deshabilitar JavaScript en su navegador. Si el sitio web es dinámico, la mayor parte del contenido desaparecerá.
Técnicas de huellas digitales: Muchos sitios web utilizan técnicas de huellas digitales para detectar y bloquear raspadores automatizados. Estas técnicas crean una "huella digital" única para cada visitante analizando información como el comportamiento del navegador, la resolución de la pantalla, los complementos, la zona horaria, etc. Si se detectan anomalías o si son inconsistentes con el comportamiento normal del usuario, el sitio web puede bloquear el acceso.
Mecanismos de bloqueo: Para proteger su contenido, los sitios web implementan varios mecanismos de bloqueo, como:
¿Tiene alguna idea o duda maravillosa sobre el raspado web y Browserless?
¡Veamos lo que otros desarrolladores están compartiendo en Discord y Telegram!
Un método efectivo para interceptar las solicitudes XHR (XMLHttpRequest) y Fetch durante el proceso de raspado es inspeccionar la pestaña Red del navegador para identificar los puntos finales de la API que proporcionan contenido dinámico. Una vez que se identifican estos puntos finales, se pueden utilizar clientes HTTP como la biblioteca Requests para enviar solicitudes directamente a estas API para obtener datos.
El uso de un navegador sin cabeza como Puppeteer o Selenium permite la simulación completa del comportamiento del usuario, incluida la carga de la página y la interacción. Estas herramientas pueden procesar JavaScript y raspar el contenido generado dinámicamente.
Solicitar datos directamente de la API del sitio web es una forma eficiente de rastrear. Analice las solicitudes de red del sitio web, encuentre el punto final de la API y utilice el cliente HTTP para solicitar datos.
Al monitorear las solicitudes de red, identificar las llamadas AJAX y reproducirlas, se pueden extraer datos cargados dinámicamente.
Para evitar ser bloqueado por el sitio web, el uso de servicios proxy y la rotación de IP es una estrategia importante. Esto puede ayudar a dispersar las solicitudes y reducir el riesgo de detección.
Escribir scripts para simular el comportamiento de navegación humana, como agregar retrasos entre las solicitudes, aleatorizar el orden de las operaciones, etc., puede ayudar a reducir el riesgo de ser identificado como un rastreador por el sitio web.
Browserless es un servicio en la nube headlesschrome que opera aplicaciones en línea y automatiza scripts sin una interfaz gráfica de usuario. Es especialmente útil para trabajos como el raspado web y otras operaciones automatizadas.
Browserless también es un poderoso navegador sin cabeza. A continuación, utilizaremos Browserless como ejemplo para rastrear páginas web dinámicas.
Antes de comenzar, debemos tener un servicio Browserless. El uso de Browserless puede resolver tareas complejas de rastreo web y automatización a gran escala, y ahora se ha logrado la implementación en la nube totalmente gestionada.
Browserless adopta una estrategia centrada en el navegador, proporciona capacidades de implementación headless potentes y ofrece un mayor rendimiento y confiabilidad. Puede hacer clic aquí para obtener más información sobre la configuración de los servicios Browserless.
Al principio, necesitábamos obtener la API KEY de Nstbrowser. Puede ir a la página del menú Browserless del cliente Nstbrowser, o puede hacer clic aquí para visitar.

Antes de comenzar, determinemos el objetivo de esta prueba. Usaremos Puppeteer y Playwright para obtener el contenido del título de la página de sitios web dinámicos:

Siga los pasos a continuación para instalar las dependencias:
npm init -y
pnpm add playwright puppeteer-core
const { chromium } = require('playwright');
async function createBrowser() {
const token = ''; // requerido
const config = {
proxy:
'', // requerido; formato de entrada: esquema://usuario:contraseña@host:puerto ej: http://usuario:contraseña@localhost:8080
// plataforma: 'windows', // soporte: windows, mac, linux
// kernel: 'chromium', // solo soporte: chromium
// kernelMilestone: '124', // soporte: 113, 120, 124
// args: {
// '--proxy-bypass-list': 'detect.nstbrowser.io',
// }, // argumentos del navegador
// huella digital: {
// userAgent:
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36',
// },
};
const query = new URLSearchParams({
token: token, // requerido
config: JSON.stringify(config),
});
const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await chromium.connectOverCDP(browserWSEndpoint);
const context = await browser.newContext();
const page = await context.newPage();
page.goto('https://www.nstbrowser.io/en');
// dormir durante 5 segundos
await new Promise((resolve) => setTimeout(resolve, 5000));
const h1Element = await page.$('h1');
const content = await h1Element?.textContent();
console.log(`Playwright: El contenido del elemento h1 es: ${content}`)
await page.close();
await page.context().close();
}
createBrowser().then();

const puppeteer = require('puppeteer-core');
async function createBrowser() {
const token = ''; // requerido
const config = {
proxy:
'', // requerido; formato de entrada: esquema://usuario:contraseña@host:puerto ej: http://usuario:contraseña@localhost:8080
// plataforma: 'windows', // soporte: windows, mac, linux
// kernel: 'chromium', // solo soporte: chromium
// kernelMilestone: '124', // soporte: 113, 120, 124
// args: {
// '--proxy-bypass-list': 'detect.nstbrowser.io',
// }, // argumentos del navegador
// huella digital: {
// userAgent:
// 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36',
// },
};
const query = new URLSearchParams({
token: token, // requerido
config: JSON.stringify(config),
});
const browserWSEndpoint = `ws://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint,
defaultViewport: null,
});
const page = await browser.newPage();
await page.goto('https://www.nstbrowser.io/en');
// dormir durante 5 segundos
await new Promise((resolve) => setTimeout(resolve, 5000));
const h1Element = await page.$('h1');
if (h1Element) {
const content = await page.evaluate((el) => el.textContent, h1Element); // utilizar page.evaluate para obtener el contenido de texto del elemento h1
console.log(`Puppeteer: El contenido del elemento h1 es: ${content}`);
} else {
console.log('No se encontró ningún elemento h1.');
}
await page.close();
}
createBrowser().then();

Rastrear páginas web dinámicas siempre es más complicado que rastrear páginas web ordinarias. Es fácil encontrar varios problemas durante el proceso de rastreo. A través de la introducción de este blog, debe haber aprendido: