Selenium es un marco de automatización web de código abierto muy popular, que se utiliza principalmente para la automatización de pruebas en navegadores. Además, también se puede usar para resolver problemas de scraping web dinámico.
Selenium tiene 3 componentes principales:
¿Qué es Browserless?
Nstbrowserless es un servicio basado en la nube para headlesschrome que ejecuta operaciones web y ejecuta scripts de automatización sin requerir una interfaz gráfica. Es particularmente útil para automatizar tareas como el web scraping y otros procesos automatizados.
¿Es Browserless bueno para el web scraping?
¡Sí, absolutamente! Nstbrowserless puede realizar scraping web complejo y cualquier otra tarea de automatización en la nube. Liberará el servicio local y el almacenamiento de tus dispositivos. Nstbrowserless funciona con un navegador anti-detect y una característica de headlesschrome. Ya no tienes que preocuparte por ser detectado y enfrentar bloqueos web.
Combinar Browserless y Selenium mejora la automatización web al permitir que Selenium ejecute scripts de prueba en un entorno headlesschrome basado en la nube proporcionado por Browserless. Esta configuración es eficiente para tareas a gran escala como el web scraping, ya que elimina la necesidad de un navegador físico mientras maneja contenido dinámico e interacciones con el usuario.
¿Tienes alguna idea maravillosa o dudas sobre el web scraping y Browserless?
¡Veamos qué están compartiendo otros desarrolladores en Discord y Telegram!
Usando Node.js en Selenium, los desarrolladores pueden controlar headlesschrome para realizar varias operaciones, como web scraping, pruebas automatizadas, generación de capturas de pantalla, etc.
Esta combinación aprovecha las características eficientes y no bloqueantes de Node.js y las capacidades del navegador headlesschrome para lograr una automatización y procesamiento de datos eficientes.
Ingresa el siguiente comando en la terminal:
npm install selenium-webdriver
Si la terminal informa un error, verifica si tu computadora tiene un entorno de Node.js:
node --version
¿No tienes un entorno de Node.js? Por favor, instala primero la última versión del entorno de Node.js.
Selenium es conocido por sus poderosas capacidades de automatización de navegadores. Admite la mayoría de los navegadores principales, incluidos Chrome, Firefox, Edge, Opera, Safari e Internet Explorer.
Como Chrome es el más popular y potente entre ellos, lo usarás en este tutorial.
import { Builder, Browser } from 'selenium-webdriver';
async function run() {
const driver = new Builder()
.forBrowser(Browser.CHROME)
.build();
await driver.get('https://www.yahoo.com/');
}
También puedes agregar cualquier personalización que desees. Vamos a hacer que nuestros scripts sean headlesschrome:
import { Builder, Browser } from 'selenium-webdriver';
import chrome from 'selenium-webdriver/chrome';
const options = new chrome.Options();
options.addArguments('--remote-allow-origins=*');
options.addArguments('--headless');
async function run() {
const driver = new Builder()
.setChromeOptions(options)
.forBrowser(Browser.CHROME)
.build();
await driver.get('https://www.yahoo.com/');
}
¡Ahora puedes visitar cualquier sitio web!
Una vez que tengas el HTML completo de la página web, puedes proceder a extraer los datos requeridos. En este caso, vamos a analizar el título y el contenido de todas las noticias en la página.
Para lograr esta tarea, debes seguir estos pasos:
DevTools es una herramienta invaluable en el web scraping. Te ayuda a inspeccionar el HTML, CSS y JavaScript cargados actualmente. También puedes obtener información sobre las solicitudes de red realizadas a la página y sus tiempos de carga correspondientes.
Los selectores CSS y las expresiones XPath son las estrategias de selección de nodos más confiables. Puedes usar cualquiera de ellas para ubicar los elementos, pero en este tutorial, por simplicidad, utilizaremos los selectores CSS.
Vamos a usar DevTools para encontrar el selector CSS correcto. Abre la página web objetivo en tu navegador y haz clic derecho en el elemento del producto > Inspeccionar para abrir DevTools.

Puedes ver que la estructura de cada título de noticia está compuesta por una etiqueta h3 y una etiqueta a, y podemos usar el selector h3[data-test-locator="stream-item-title"] para ubicarlas.
Usamos el mismo método para encontrar el selector p[data-test-locator="stream-item-summary"] para el contenido de las noticias.
Define el selector CSS usando la información anterior y ubica el producto usando los métodos findElements() y findElement().
Además, usa el método getText() para extraer el texto interno del nodo HTML, y finalmente almacena el nombre y el precio extraídos en un arreglo.
const titlesArray = [];
const contentArray = [];
const newsTitles = await driver.findElements(By.css('h3[data-test-locator="stream-item-title"]'));
const newsContents = await driver.findElements(By.css('p[data-test-locator="stream-item-summary"]'));
for (let title of newsTitles) {
titlesArray.push(await title.getText());
}
for (let content of newsContents) {
contentArray.push(await content.getText());
}
¡Hemos obtenido los datos de web scraping! Ahora necesitamos exportarlos a un archivo CSV.
Importa el módulo fs incorporado de Node.js, que proporciona funciones para trabajar con el sistema de archivos:
import fs from 'node';
Luego, inicializa una variable de cadena llamada newsData con una fila de encabezado que contenga los nombres de las columnas ("title, content\n").
let newsData = 'title,content\n';
A continuación, recorre los dos arreglos (titlesArray y contentsArray) que contienen los títulos y el contenido de las noticias. Para cada elemento del arreglo, añade una línea después de newsData con una coma separando el título y el contenido.
for (let i = 0; i < titlesArray.length; i++) {
newsData += `${titlesArray[i]},${contentsArray[i]}\n`;
}
Utiliza la función fs.writeFile() para escribir la cadena newsData en un archivo llamado yahooNews.csv. Esta función acepta tres parámetros: el nombre del archivo, los datos a escribir y una función de callback para manejar cualquier error encontrado durante el proceso de escritura.
fs.writeFile("yahooNews.csv", newsData, err => {
if (err) {
console.error("Error:", err);
} else {
console.log("¡Éxito!");
}
});
Al ejecutar nuestro código, obtendremos un resultado similar a este:

Felicidades, has aprendido a usar Selenium y headlesschrome: NodeJS para hacer scraping.
Usar el modo headlesschrome en Browserless puede evitar automáticamente la detección web y el bloqueo web en la mayor medida posible. Pero combina estas estrategias para lograr un scraping más eficiente y una experiencia fluida.
A continuación se muestra un código de ejemplo que utiliza Selenium y Node.js para simular el comportamiento real del usuario. El código muestra cómo establecer el User-Agent, simular operaciones con el mouse, manejar contenido dinámico, simular la entrada del teclado y controlar el comportamiento del navegador.
Antes de usarlo, asegúrate de tener instalados selenium-webdriver y chromedriver.
const { Builder, By, Key, until } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const path = require('path');
// Iniciar el navegador
(async function example() {
// Configurar opciones de Chrome
let chromeOptions = new chrome.Options();
chromeOptions.addArguments('headless'); // Usar modo headless
chromeOptions.addArguments('window-size=1280,800'); // Establecer el tamaño de la ventana del navegador
// Crear una instancia de WebDriver
let driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(chromeOptions)
.build();
try {
// Establecer User-Agent y otros encabezados de solicitud
await driver.executeCdpCmd('Network.setUserAgentOverride', {
userAgent: 'Tu User-Agent personalizado',
});
// Navegar a la página objetivo
await driver.get('https://example.com');
// Simular movimiento y clics del mouse
let element = await driver.findElement(By.css('selector-for-clickable-element'));
await driver.actions().move({ origin: element }).click().perform();
// Tiempo de espera aleatorio
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
await sleep(Math.random() * 5000 + 2000); // Esperar aleatoriamente entre 2 y 7 segundos
// Manejar contenido dinámico y esperar a que cargue un elemento específico
await driver.wait(until.elementLocated(By.css('#dynamic-content')), 10000);
// Simular entrada de teclado
let searchInput = await driver.findElement(By.css('#search-input'));
await searchInput.sendKeys('Node.js', Key.RETURN);
// Desplazamiento aleatorio
await driver.executeScript('window.scrollBy(0, window.innerHeight);');
} finally {
// Cerrar el navegador
await driver.quit();
}
})();
Usar un servidor proxy para ocultar tu dirección IP real puede evitar eficazmente el bloqueo de IP. Puedes optar por rotar el proxy para usar una dirección IP diferente para cada solicitud, reduciendo así el riesgo de bloqueo.
Controla la frecuencia de scraping para evitar enviar un gran número de solicitudes en un corto período de tiempo, lo que puede reducir la posibilidad de activar mecanismos anti-scraping. Puedes establecer un intervalo de tiempo apropiado para enviar solicitudes y simular el comportamiento normal de navegación.
Si el sitio web utiliza CAPTCHA para protección, puedes usar un servicio de reconocimiento de CAPTCHA de terceros para resolver estos desafíos automáticamente o configurar Selenium para manejar CAPTCHA.
Algunos sitios web utilizan huellas del navegador para identificar herramientas automatizadas. Configurar diferentes huellas del navegador o usar un navegador anti-detect con cambio de huella incorporado puede ayudar a evitar la detección del sitio web.
Usar Browserless junto con Selenium para procesar contenido cargado dinámicamente (como solicitudes AJAX) puede asegurar que se capture toda la información renderizada dinámicamente en la página web, no solo el contenido estático.
Selenium en sí mismo proporciona una variedad de métodos para encontrar elementos en la página, incluyendo:
<input> o <button>, adecuado para búsquedas extensas..class-name, adecuado para localizar rápidamente elementos con nombres de clase específicos.#element-id, que es particularmente efectivo para encontrar rápidamente elementos específicos.div > p.class-name.//div[@id='example'].Así, en Selenium WebDriver, podemos localizar elementos en una página web a través del método find_element. Solo necesitas agregar los requisitos específicos al usarlo. Por ejemplo:
find_element_by_id: Encontrar un elemento por su ID único.find_element_by_class_name: Encontrar un elemento por su nombre de clase CSS.find_element_by_link_text: Encontrar un elemento de enlace por su texto de enlace.En ciertas situaciones, como una red lenta o un navegador, tu script puede fallar o mostrar resultados inconsistentes.
En lugar de esperar un intervalo fijo, elige esperar de manera inteligente, como esperar a que aparezca un nodo específico o se muestre en la página. Esto asegura que los elementos web estén correctamente cargados antes de interactuar con ellos, reduciendo las posibilidades de errores como elemento no encontrado y elemento no interactuable.
El siguiente fragmento de código implementa la estrategia de espera. El método until.elementsLocated define la condición de espera, asegurando que WebDriver espere hasta que el elemento especificado sea encontrado o se alcance el tiempo máximo de espera de 5000 milisegundos (5 segundos).
const { Builder, By, until } = require('selenium-webdriver');
const yourElements = await driver.wait(until.elementsLocated(By.css('.your-css-selector')), 5000);
En NodeJS, puedes tomar capturas de pantalla simplemente llamando a una función. Sin embargo, hay algunas consideraciones para asegurar que las capturas de pantalla se capturen correctamente:
import fs from 'node';
import { Builder, Browser } from 'selenium-webdriver';
async function screenshot() {
const driver = new Builder()
.forBrowser(Browser.CHROME)
.build();
await driver.get('https://www.yahoo.com/');
const pictureData = await driver.takeScreenshot();
fs.writeFileSync('screenshot.png', pictureData, 'base64');
}
screenshot();
¿Hay una forma más sencilla de lograr todas
las tareas especializadas? ¡Claro que sí! Nstbrowser proporciona servicios RPA completamente gratuitos. Simplemente configurando el flujo de trabajo que necesitas, puedes lograr fácilmente todos los requisitos de scraping.
Obtener datos de elemento
Esperar solicitud
Captura de pantalla
Una de las características destacadas de usar una herramienta de automatización de navegador como Selenium es la capacidad de aprovechar el propio motor JavaScript del navegador. Esto significa que puedes inyectar y ejecutar código JavaScript personalizado en el contexto de la página web con la que estás interactuando.
const javascript = 'window.scrollBy(100, 100)';
await driver.executeScript(javascript);
En este tutorial de Selenium Node.js, aprendiste cómo usar headlesschrome con Selenium para configurar un proyecto WebDriver en Node.js, hacer scraping de datos de sitios web dinámicos, interactuar con contenido dinámico y abordar desafíos comunes de scraping web.
¡Ahora es un buen momento para construir tu propio proceso de scraping web! Con la ayuda de RPA Nstbrowser, todo lo complejo se simplificará.