Titiritero versus Selenio: ¿Qué elegir para Web Scraping?

Elija y compre proxies

Titiritero versus Selenio: ¿Qué elegir para Web Scraping?

¿Estás tratando de decidir entre Puppeteer y Selenium para el web scraping? Ambos son potentes marcos de automatización del navegador y tomar la decisión correcta depende de sus necesidades específicas de scraping y de los recursos disponibles.

Para ayudarle a tomar una decisión informada, hemos destacado las diferencias clave entre Puppeteer y Selenium en la siguiente tabla. Luego, profundizaremos en los detalles y brindaremos un ejemplo de extracción de cada marco para demostrar su efectividad en la extracción de datos de páginas web.

CriteriosTitiriteroSelenio
Idiomas compatiblesSólo JavaScript es oficialmente compatible, pero hay puertos PHP y Python no oficiales.Java, Python, C#, Ruby, PHP, JavaScript y Kotlin
Soporte del navegadorCompatibilidad con Chromium y Firefox experimentalChrome, Safari, Firefox, Opera, Edge e Internet Explorer
Actuación60% más rápido que el selenioRápido
Soporte del sistema operativoWindows, Linux y macOSWindows, Linux, macOS y Solaris
ArquitecturaArquitectura basada en eventos con instancias de navegador sin cabezaProtocolo JSONWire en el controlador web para controlar la instancia del navegador
Requisitos previosEl paquete JavaScript es suficienteEnlaces de Selenium (para el lenguaje de programación seleccionado) y controladores web del navegador
ComunidadComunidad más pequeña en comparación con SeleniumDocumentación bien establecida y una gran comunidad.

Procedamos a analizar estas bibliotecas en detalle y realicemos un ejemplo de extracción con cada una para ilustrar su eficiencia en la extracción de datos de una página web.

Logotipo del titiritero

Titiritero

Titiritero es una biblioteca Node.js que proporciona una API de alto nivel para controlar Chrome o Chromium a través del protocolo DevTools. Está diseñado para automatizar tareas en Chrome o Chromium, como tomar capturas de pantalla, generar archivos PDF y navegar por páginas.

Puppeteer también se puede utilizar para probar páginas web simulando interacciones del usuario, como hacer clic en botones, completar formularios y verificar los resultados mostrados.

Ventajas del titiritero

  • Facilidad de uso: Simple y directo de usar.
  • Incluye cromo: No se requiere configuración adicional.
  • Modo sin cabeza: Se ejecuta en modo sin cabeza de forma predeterminada, pero se puede configurar para que se ejecute en modo de navegador completo.
  • Arquitectura basada en eventos: Elimina la necesidad de realizar llamadas de suspensión manuales en su código.
  • Capacidades integrales: Puede tomar capturas de pantalla, generar archivos PDF y automatizar todas las acciones del navegador.
  • Gestión del rendimiento: Ofrece herramientas para registrar el tiempo de ejecución y el rendimiento de carga para optimizar y depurar su raspador.
  • SPA arrastrándose: Capaz de rastrear aplicaciones de página única (SPA) y generar contenido pre-renderizado (renderizado del lado del servidor).
  • Grabación de guión: Permite crear scripts de Puppeteer grabando acciones en el navegador usando la consola DevTools.

Desventajas del titiritero

  • Soporte de navegador limitado: Admite menos navegadores en comparación con Selenium.
  • Centrado en JavaScript: Admite principalmente JavaScript, aunque existen puertos no oficiales para Python y PHP.

Ejemplo de web scraping con Puppeteer

Repasemos un tutorial de web scraping de Puppeteer para extraer elementos de la categoría Crimen y Suspense del sitio web de Danube.

Tienda del Danubio: crimen y suspense

Para comenzar, importe el módulo Puppeteer y cree una función asincrónica para ejecutar el código Puppeteer:

const puppeteer = require('puppeteer'); 

async function main() { 
    // Launch a headless browser instance 
    const browser = await puppeteer.launch({ headless: true });

    // Create a new page object 
    const page = await browser.newPage();

    // Navigate to the target URL and wait until the loading finishes
    await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });

    // Wait for the left-side bar to load
    await page.waitForSelector('ul.sidebar-list');

    // Click on the first element and wait for the navigation to finish
    await Promise.all([
        page.waitForNavigation(),
        page.click("ul[class='sidebar-list'] > li > a"),
    ]);

    // Wait for the book previews to load
    await page.waitForSelector("li[class='preview']");

    // Extract the book previews
    const books = await page.evaluateHandle(
        () => [...document.querySelectorAll("li[class='preview']")]
    );

    // Extract the relevant data using page.evaluate
    const processed_data = await page.evaluate(elements => {
        let data = [];
        elements.forEach(element => {
            let title = element.querySelector("div.preview-title").innerHTML;
            let author = element.querySelector("div.preview-author").innerHTML;
            let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
            let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;

            let result = { title, author, rating, price };
            data.push(result);
        });
        return data;
    }, books);

    // Print out the extracted data
    console.log(processed_data);

    // Close the page and browser respectively
    await page.close();
    await browser.close();
}

// Run the main function to scrape the data
main();

Rendimiento esperado

Cuando ejecuta el código, el resultado debería parecerse al siguiente:

[
    {
        title: 'Does the Sun Also Rise?',
        author: 'Ernst Doubtingway',
        rating: '★★★★☆',
        price: '$9.95'
    },
    {
        title: 'The Insiders',
        author: 'E. S. Hilton',
        rating: '★★★★☆',
        price: '$9.95'
    },
    {
        title: 'A Citrussy Clock',
        author: 'Bethany Urges',
        rating: '★★★★★',
        price: '$9.95'
    }
]

Otro ejemplo de uso de titiritero

Además de extraer datos de páginas web, Puppeteer se puede utilizar para una variedad de tareas de automatización. Un caso de uso común es generar un PDF de una página web. Veamos un ejemplo en el que se utiliza Puppeteer para generar un PDF desde una página web.

Generando un PDF con Puppeteer

Paso 1: importar Puppeteer y crear una función asincrónica

const puppeteer = require('puppeteer');

async function generatePDF() {
    // Launch a headless browser instance
    const browser = await puppeteer.launch({ headless: true });

    // Create a new page object
    const page = await browser.newPage();

    // Navigate to the target URL
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    // Generate a PDF from the web page
    await page.pdf({
        path: 'example.pdf', // Output file path
        format: 'A4',        // Paper format
        printBackground: true, // Include background graphics
    });

    // Close the page and browser respectively
    await page.close();
    await browser.close();
}

// Run the function to generate the PDF
generatePDF();

Opciones adicionales de titiritero

Puppeteer ofrece varias opciones para generar archivos PDF que se pueden personalizar según sus necesidades. Estas son algunas de las opciones que puede utilizar:

  • path: La ruta del archivo para guardar el PDF.
  • format: El formato del papel (por ejemplo, 'A4', 'Carta').
  • printBackground: si se deben incluir los gráficos de fondo.
  • landscape: Ajustado a true para orientación horizontal.
  • margin: especifique los márgenes del PDF (superior, derecho, inferior, izquierdo).

Ejemplo con opciones adicionales:

const puppeteer = require('puppeteer');

async function generatePDF() {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    await page.pdf({
        path: 'example.pdf',
        format: 'A4',
        printBackground: true,
        landscape: true,
        margin: {
            top: '20px',
            right: '20px',
            bottom: '20px',
            left: '20px',
        },
    });

    await page.close();
    await browser.close();
}

generatePDF();

Salida de ejemplo

Al ejecutar el código anterior se creará un archivo PDF llamado example.pdf en el directorio actual con el contenido de la página web https://example.com.

Puppeteer es una herramienta versátil para tareas de automatización web, desde extraer datos hasta generar archivos PDF. Su facilidad de uso y sus potentes funciones lo convierten en una excelente opción para automatizar una amplia gama de actividades del navegador. Ya sea que esté recopilando datos, generando informes o probando páginas web, Puppeteer proporciona las herramientas que necesita para realizar el trabajo de manera eficiente.

Logotipo de selenio

Selenio

Selenio es una herramienta de automatización web y pruebas de extremo a extremo de código abierto que se utiliza a menudo para el web scraping. Sus componentes principales incluyen Selenium IDE, Selenium WebDriver y Selenium Grid.

  • IDE de selenio: Se utiliza para registrar acciones antes de automatizarlas.
  • Controlador web de selenio: Ejecuta comandos en el navegador.
  • Rejilla de selenio: Habilita la ejecución paralela.

Ventajas del selenio

  • Facilidad de uso: Simple y directo de usar.
  • Ayuda de idioma: Admite varios lenguajes de programación como Python, Java, JavaScript, Ruby y C#.
  • Automatización del navegador: Puede automatizar navegadores como Firefox, Edge, Safari e incluso navegadores QtWebKit personalizados.
  • Escalabilidad: Es posible escalar Selenium a cientos de instancias utilizando servidores en la nube con diferentes configuraciones de navegador.
  • Multiplataforma: Funciona en Windows, macOS y Linux.

Desventajas del selenio

  • Configuración compleja: Los métodos de configuración de Selenium pueden ser complejos.

Muestra de raspado web con selenio

Al igual que con Puppeteer, veamos un tutorial sobre web scraping con Selenium usando el mismo sitio de destino. Extraeremos los avances de los libros de la categoría Crimen y Suspense del sitio web de Danube.

Tienda del Danubio: crimen y suspense

Paso 1: importe los módulos necesarios y configure Selenium

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--headless")

Paso 2: Inicialice Chrome WebDriver

driver = webdriver.Chrome(options=options)

Paso 3: navegue hasta el sitio web de destino

time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")

Paso 4: haga clic en la categoría Crimen y suspense y extraiga vistas previas de libros

time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")

Paso 5: Defina una función para extraer datos de la vista previa de cada libro

def extract(element):
    title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
    author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
    rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
    price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
    return {"title": title, "author": author, "rating": rating, "price": price}

Paso 6: recorra las vistas previas, extraiga los datos y salga del controlador

extracted_data = []
for element in books:
    data = extract(element)
    extracted_data.append(data)

print(extracted_data)
driver.quit()

Rendimiento esperado

Al ejecutar el código anterior se producirá un resultado similar al siguiente:

[
    {'title': 'Does the Sun Also Rise?', 'author': 'Ernst Doubtingway', 'rating': '★★★★☆', 'price': '$9.95'},
    {'title': 'The Insiders', 'author': 'E. S. Hilton', 'rating': '★★★★☆', 'price': '$9.95'},
    {'title': 'A Citrussy Clock', 'author': 'Bethany Urges', 'rating': '★★★★★', 'price': '$9.95'}
]

Ejemplo adicional de selenio: tomar una captura de pantalla

Además de extraer datos, Selenium también se puede utilizar para tomar capturas de pantalla de páginas web. A continuación se muestra un ejemplo de cómo tomar una captura de pantalla de una página web usando Selenium.

Paso 1: importe los módulos necesarios y configure Selenium

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--headless")

Paso 2: Inicialice Chrome WebDriver

driver = webdriver.Chrome(options=options)

Paso 3: navegue hasta el sitio web de destino

url = "https://example.com"
driver.get(url)

Paso 4: toma una captura de pantalla

driver.save_screenshot("example_screenshot.png")

Paso 5: salga del controlador

driver.quit()

Selenium es una herramienta versátil para tareas de automatización web, incluido el web scraping y la toma de capturas de pantalla. Su compatibilidad con múltiples lenguajes de programación y navegadores, junto con su escalabilidad, lo convierte en una opción poderosa para diversas necesidades de automatización. Ya sea que esté extrayendo datos o generando informes, Selenium brinda las capacidades para automatizar sus tareas de manera eficiente.

Titiritero vs. Selenio: Comparación de velocidad

¿Es Puppeteer más rápido que Selenium? La respuesta es sí: Puppeteer es generalmente más rápido que Selenium.

Para comparar la velocidad de Puppeteer y Selenium, utilizamos el sandbox de Danube-store y ejecutamos los scripts presentados anteriormente 20 veces, promediando los tiempos de ejecución.

Prueba de velocidad de selenio

Usamos el time Módulo en Python para medir el tiempo de ejecución del script Selenium. La hora de inicio se registró al principio y la hora de finalización al final del guión. La diferencia entre estos tiempos proporcionó la duración total de la ejecución.

Aquí está el script completo utilizado para Selenium:

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def extract(element):
    title = element.find_element(By.CSS_SELECTOR, "div.preview-title").text
    author = element.find_element(By.CSS_SELECTOR, "div.preview-author").text
    rating = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-rating").text
    price = element.find_element(By.CSS_SELECTOR, "div.preview-details p.preview-price").text
    return {"title": title, "author": author, "rating": rating, "price": price}

# Start the timer
start_time = time.time()

options = webdriver.ChromeOptions()
options.add_argument("--headless")

# Create a new instance of the Chrome driver
driver = webdriver.Chrome(options=options)

url = "https://danube-webshop.herokuapp.com/"
driver.get(url)

# Click on the Crime & Thrillers category
time.sleep(1)
crime_n_thrillers = driver.find_element(By.CSS_SELECTOR, "ul[class='sidebar-list'] > li")
crime_n_thrillers.click()
time.sleep(1)

# Extract the book previews
books = driver.find_elements(By.CSS_SELECTOR, "div.shop-content li.preview")

extracted_data = []
for element in books:
    data = extract(element)
    extracted_data.append(data)

print(extracted_data)

# End the timer
end_time = time.time()
print(f"The whole script took: {end_time - start_time:.4f} seconds")

driver.quit()

Prueba de velocidad del titiritero

Para el guión de Puppeteer, utilizamos el Date objeto para medir el tiempo de ejecución. La hora de inicio se registró al principio y la hora de finalización al final del guión. La diferencia entre estos tiempos proporcionó la duración total de la ejecución.

Aquí está el script completo utilizado para Puppeteer:

const puppeteer = require('puppeteer');

async function main() {
    const start = Date.now();

    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto('https://danube-webshop.herokuapp.com/', { waitUntil: 'networkidle2' });

    await page.waitForSelector('ul.sidebar-list');

    await Promise.all([
        page.waitForNavigation(),
        page.click("ul[class='sidebar-list'] > li > a"),
    ]);

    await page.waitForSelector("li[class='preview']");
    const books = await page.evaluateHandle(
        () => [...document.querySelectorAll("li[class='preview']")]
    );

    const processed_data = await page.evaluate(elements => {
        let data = [];
        elements.forEach(element => {
            let title = element.querySelector("div.preview-title").innerHTML;
            let author = element.querySelector("div.preview-author").innerHTML;
            let rating = element.querySelector("div.preview-details > p.preview-rating").innerHTML;
            let price = element.querySelector("div.preview-details > p.preview-price").innerHTML;

            let result = { title, author, rating, price };
            data.push(result);
        });
        return data;
    }, books);

    console.log(processed_data);
    await page.close();
    await browser.close();

    const end = Date.now();
    console.log(`Execution time: ${(end - start) / 1000} seconds`);
}

main();

Resultados de la prueba de rendimiento

Las pruebas de rendimiento mostraron que Puppeteer es aproximadamente 60% más rápido que Selenium. Esta ventaja de velocidad hace que Puppeteer sea una opción más adecuada para proyectos que requieren automatización y raspado web de alta velocidad, especialmente cuando se trabaja con navegadores basados en Chromium.

Resumen de resultados de velocidad:

Prueba de velocidad de titiritero versus selenio

El siguiente cuadro ilustra la diferencia de rendimiento entre Puppeteer y Selenium:

Ampliar las aplicaciones de Puppeteer para proyectos que requieren un web scraping rápido y eficiente es la opción óptima en este contexto.

Titiritero versus selenio: ¿cuál es mejor?

Entonces, ¿cuál es mejor entre Selenium y Puppeteer para raspar? No hay una respuesta directa a esa pregunta, ya que depende de múltiples factores, como el soporte de biblioteca a largo plazo, el soporte entre navegadores y sus necesidades de web scraping.

Puppeteer es más rápido, pero en comparación con Selenium, admite menos navegadores. Selenium también admite más lenguajes de programación en comparación con Puppeteer.

Conclusión

Aunque usar Puppeteer o Selenium es una buena opción para el web scraping, ampliar y optimizar su proyecto de web scraping puede ser un desafío porque las medidas anti-bot avanzadas pueden detectar y bloquear estas bibliotecas. La mejor manera de evitar esto es mediante el uso de una API de raspado web, como OneProxy.

Uso de Puppeteer con servidores proxy

Para utilizar Puppeteer con un servidor proxy, puede pasar la configuración del proxy en el args opción al iniciar la instancia del navegador. He aquí un ejemplo:

const puppeteer = require('puppeteer');

async function main() {
    const proxyServer = 'http://your-proxy-server:port';
    
    const browser = await puppeteer.launch({
        headless: true,
        args: [`--proxy-server=${proxyServer}`]
    });

    const page = await browser.newPage();
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });

    // Perform your web scraping tasks here

    await browser.close();
}

main();

Usando Selenium con servidores proxy

Para usar Selenium con un servidor proxy, puede configurar las opciones de proxy usando el webdriver.Proxy clase. He aquí un ejemplo:

from selenium import webdriver
from selenium.webdriver.common.proxy import Proxy, ProxyType

proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "your-proxy-server:port"
proxy.ssl_proxy = "your-proxy-server:port"

capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)

options = webdriver.ChromeOptions()
options.add_argument("--headless")

driver = webdriver.Chrome(desired_capabilities=capabilities, options=options)
driver.get("https://example.com")

# Perform your web scraping tasks here

driver.quit()

El uso de servidores proxy con Puppeteer y Selenium puede ayudar a evitar las restricciones basadas en IP y reducir el riesgo de ser bloqueado, mejorando la eficiencia de sus tareas de web scraping. Proxies rotativos de OneProxy puede optimizar aún más este proceso, proporcionando una experiencia de scraping perfecta.

Preguntas frecuentes (FAQ)

Puppeteer y Selenium son marcos de automatización del navegador que se utilizan para el raspado web, las pruebas y la automatización de tareas del navegador. Puppeteer es una biblioteca Node.js que controla Chrome o Chromium a través del protocolo DevTools, mientras que Selenium es una herramienta de código abierto que admite varios navegadores y lenguajes de programación a través de su API WebDriver.

Titiritero es generalmente más rápido que Selenium. Sin embargo, la diferencia de velocidad puede variar según las tareas y configuraciones específicas utilizadas en sus proyectos de automatización o web scraping.

Puppeteer es conocido por su facilidad de uso, velocidad y capacidad para automatizar tareas en modo sin cabeza de forma predeterminada. Es compatible con Chromium y tiene una sólida arquitectura basada en eventos que elimina la necesidad de realizar llamadas de suspensión manuales en el código.

Puppeteer admite menos navegadores en comparación con Selenium y se centra principalmente en JavaScript, aunque existen puertos no oficiales para otros lenguajes como Python y PHP.

Puede configurar Puppeteer para utilizar un servidor proxy pasando la configuración del proxy en el args opción al iniciar el navegador.

Selenium admite múltiples lenguajes de programación (Python, Java, JavaScript, Ruby, C#) y puede automatizar varios navegadores, incluidos Firefox, Edge, Safari y navegadores personalizados como QtWebKit. También permite una amplia escalabilidad a través de técnicas como la configuración de servidores en la nube con diferentes configuraciones de navegador.

Selenium puede ser más complejo de configurar en comparación con Puppeteer, especialmente cuando se configura para diferentes navegadores y entornos.

Puede configurar un servidor proxy en Selenium usando el webdriver.Proxy clase.

Ejecutamos las mismas tareas de web scraping en el sandbox de la tienda Danube usando Puppeteer y Selenium. Cada script se ejecutó 20 veces y se calcularon los tiempos de ejecución promedio para comparar el rendimiento.

Los resultados mostraron que Puppeteer es aproximadamente 60% más rápido que Selenium, lo que lo convierte en una mejor opción para tareas de automatización y raspado web de alta velocidad.

OneProxy puede ayudarte a evitar que te bloqueen. OneProxy maneja la omisión anti-bot, proporciona proxies rotativos, navegadores sin cabeza, reintentos automáticos y más, lo que garantiza una experiencia de web scraping perfecta.

Proxies del centro de datos
Proxies compartidos

Una gran cantidad de servidores proxy rápidos y confiables.

A partir de$0.06 por IP
Representantes rotativos
Representantes rotativos

Proxies rotativos ilimitados con modelo de pago por solicitud.

A partir de$0.0001 por solicitud
Proxies privados
Proxies UDP

Proxies con soporte UDP.

A partir de$0.4 por IP
Proxies privados
Proxies privados

Proxies dedicados para uso individual.

A partir de$5 por IP
Proxies ilimitados
Proxies ilimitados

Servidores proxy con tráfico ilimitado.

A partir de$0.06 por IP
¿Listo para usar nuestros servidores proxy ahora mismo?
desde $0.06 por IP