¿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.
Criterios | Titiritero | Selenio |
---|---|---|
Idiomas compatibles | Sólo JavaScript es oficialmente compatible, pero hay puertos PHP y Python no oficiales. | Java, Python, C#, Ruby, PHP, JavaScript y Kotlin |
Soporte del navegador | Compatibilidad con Chromium y Firefox experimental | Chrome, Safari, Firefox, Opera, Edge e Internet Explorer |
Actuación | 60% más rápido que el selenio | Rápido |
Soporte del sistema operativo | Windows, Linux y macOS | Windows, Linux, macOS y Solaris |
Arquitectura | Arquitectura basada en eventos con instancias de navegador sin cabeza | Protocolo JSONWire en el controlador web para controlar la instancia del navegador |
Requisitos previos | El paquete JavaScript es suficiente | Enlaces de Selenium (para el lenguaje de programación seleccionado) y controladores web del navegador |
Comunidad | Comunidad más pequeña en comparación con Selenium | Documentació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.
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 atrue
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.
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:
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.