Ir al contenido

Web Scraping con Selenium y Python: la guía definitiva para 2024

El web scraping es el proceso de extraer datos de sitios web automáticamente utilizando herramientas de software y scripts. Selenium es una de las herramientas más populares utilizadas para el web scraping debido a sus sólidas capacidades de automatización web. En esta guía completa, exploraremos el web scraping con Selenium usando Python.

Descripción general del raspado web

Antes de sumergirnos en Selenium, primero comprendamos qué es el web scraping y por qué se utiliza.

El web scraping se refiere a técnicas para recopilar datos de sitios web automáticamente a través de scripts y bots en lugar de copiar y pegar manualmente. Luego, los datos extraídos se estructuran y almacenan en una base de datos u hoja de cálculo para su posterior análisis.

Los casos de uso más comunes del web scraping incluyen:

  • Seguimiento de precios – Realice un seguimiento de los precios de los productos en los sitios de comercio electrónico. Ayuda a detectar cambios y errores de precios.

  • Estudio de mercado – Recopile datos sobre competidores, productos, reseñas, etc. de toda la web.

  • Seguimiento de noticias – Extraiga artículos y noticias de sitios de medios. Útil para periodistas y profesionales de relaciones públicas.

  • Investigación – Los científicos sociales utilizan el web scraping para recopilar datos de las redes sociales para estudios de investigación.

  • Construcción de bases de datos – Cree conjuntos de datos estructurados de contactos de empresas, especificaciones de productos, etc. mediante la extracción de sitios web.

El web scraping puede ahorrar enormes cantidades de tiempo y esfuerzo en comparación con la recopilación manual de datos. Sin embargo, asegúrese de raspar de manera ética y seguir las reglas de robots.txt del sitio web.

¿Por qué utilizar Selenium para Web Scraping?

Hay muchas herramientas disponibles para web scraping como BeautifulSoup, Scrapy, Puppeteer, etc. Sin embargo, Selenium se destaca cuando necesitas:

  • Extraiga datos de sitios web complejos y dinámicos que cargan contenido mediante JavaScript.

  • Interactúe con sitios web haciendo clic en botones, completando formularios, etc. antes de raspar.

  • Extraiga datos ocultos detrás de formularios de inicio de sesión o puertas de pago.

  • Amplíe el scraping para manejar sitios web grandes con miles de páginas.

Selenium automatiza un navegador web real como Chrome o Firefox en lugar de simplemente buscar y analizar HTML como la mayoría de los demás web scrapers. Esto hace posible extraer datos dinámicos.

Además, Selenium tiene una gran comunidad detrás y admite múltiples lenguajes, incluidos Python, Java, C# y JavaScript.

Arquitectura de raspado web de Selenium

Antes de pasar al código, comprendamos cómo realiza Selenium el web scraping:

Arquitectura de selenio para web scraping

  • Selenium interactúa con el navegador mediante un API de controlador web.

  • WebDriver inicia y controla un navegador como Chrome.

  • Ejecuta código de raspado y scripts escritos en Python, Java, etc.

  • Las páginas web son renderizadas y procesadas por el navegador.

  • Los datos extraídos se recopilan y estructuran según la lógica del script.

  • Puede implementar el raspador en sus propias máquinas o utilizar una plataforma en la nube.

Esta arquitectura permite a Selenium eliminar incluso sitios complejos con mucho JavaScript que herramientas como Requests no pueden manejar.

Configurando Selenium con Python

Antes de que podamos comenzar a web scraping, necesitamos configurar Selenium en un entorno Python.

Instalar Python

Asegúrese de tener Python 3.6 o superior instalado en su sistema. Puede descargar la última versión de Python desde python.org.

Instalar selenio

Una vez instalado Python, ejecute el siguiente comando para instalar Selenium:

pip install selenium

Esto instalará el paquete Python Selenium de PyPI.

Instalar controladores web

Selenium WebDriver permite controlar los navegadores para realizar scraping. Debe instalar WebDriver para el navegador que desea utilizar:

Chrome: Descargar el ChromeDriver que coincida con tu versión de Chrome.

Firefox: Consigue el GeckoConductor según su versión de Firefox.

Southern Implants: Instala el Controlador web de Microsoft.

Asegúrese de que el ejecutable de WebDriver esté en la RUTA de su sistema para permitir que Selenium lo detecte.

¡Eso es todo! Ahora estamos listos para comenzar a web scraping con Selenium Python.

Iniciando el navegador

El primer paso es iniciar el navegador a través de Selenium.

Importa Selenium y crea un WebDriver instancia pasando la ruta al ejecutable del controlador del navegador:

from selenium import webdriver

driver = webdriver.Chrome(‘/path/to/chromedriver‘) 

También puedes inicializar una instancia de navegador sin cabeza que no abrirá una ventana visible:

from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
driver = webdriver.Chrome(options=options)

Luego, usa el get() Método para hacer que la instancia del navegador navegue a una URL:

driver.get(‘https://www.example.com‘)

El navegador ahora abrirá la página, renderizará JavaScript, cargará contenido dinámico, etc. ¡Ahora podemos comenzar a raspar!

Localización de elementos de página

Para extraer datos de las páginas, primero debemos encontrar los elementos HTML relevantes. El selenio proporciona la find_element() método para esto:

search_box = driver.find_element(By.NAME, ‘q‘)

Esto ubica el elemento con el atributo name="q". Algunas otras estrategias de localización comunes son:

  • By.ID – Buscar por ID de elemento
  • By.XPATH – Buscar mediante consulta XPath
  • By.CSS_SELECTOR – Buscar usando el selector CSS
  • By.CLASS_NAME – Buscar por nombre de clase CSS
  • By.TAG_NAME – Buscar por nombre de etiqueta HTML

También puede ubicar múltiples elementos usando find_elements() que devuelve una lista.

Extrayendo texto

Después de localizar un elemento, puede extraer su texto utilizando el text atributo:

heading = driver.find_element(By.TAG_NAME, ‘h1‘)
print(heading.text)

Esto imprimirá el <h1> texto del encabezado de la página.

De manera similar, puede obtener el valor de los campos de entrada:

username = driver.find_element(By.ID, ‘username‘)
print(username.get_attribute(‘value‘))

Para hacer clic en enlaces y botones de una página, utilice el click() método en el elemento:

link = driver.find_element(By.LINK_TEXT, ‘Next Page‘)
link.click() 

Esto permite interactuar con contenido paginado, ventanas emergentes, modales, etc.

Llenar formularios

Puede ingresar texto en cuadros de texto y otros elementos de entrada usando send_keys():

search_box.send_keys(‘Web Scraping‘)

Esto permite iniciar sesión en sitios, enviar formularios, etc. antes de realizar el scraping.

Ejecutando JavaScript

Selenium también permite ejecutar JavaScript directamente en páginas usando execute_script():

driver.execute_script(‘alert("Hello World");‘)

Puede usar esto para extraer datos inyectados por JavaScript en el DOM.

Esperando a que se carguen los elementos

Los sitios modernos utilizan AJAX y JavaScript para cargar contenido dinámicamente. En ocasiones, es posible que tengas que esperar a que se carguen ciertos elementos o datos antes de realizar el scraping.

El selenio tiene WebDriverWait y expected_conditions para manejar esto:

from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, ‘someid‘)))

El script ahora esperará hasta 10 segundos para que se pueda hacer clic en el elemento.

Hay muchas condiciones esperadas disponibles, como visibilidad del elemento, cargas AJAX, etc., que puede utilizar para manejar el contenido dinámico de la página.

Desplazarse por las páginas

Para páginas web largas, es posible que tengas que desplazarte hacia abajo para cargar contenido adicional a través de JavaScript. El selenio también puede hacer esto:

# Scroll down the page
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Scroll back to top
driver.execute_script("window.scrollTo(0, 0);")   

Esto permite eliminar páginas web largas. El mismo enfoque de desplazamiento funciona para extraer publicaciones en Facebook, Twitter y otros sitios de redes sociales.

Manejo de inicio de sesión y muros de pago

Algunos sitios requieren iniciar sesión primero antes de realizar el scraping o pueden tener muros de pago que restringen el acceso.

Puede utilizar Selenium para ingresar credenciales, evitar muros de pago y acceder a información restringida para scraping:

username = driver.find_element(By.ID, ‘username‘)
password = driver.find_element(By.ID, ‘password‘)

username.send_keys(‘myusername1234‘) 
password.send_keys(‘mypassword5678‘)

login_button = driver.find_element(By.XPATH, ‘//button[text()="Log in"]‘)
login_button.click()

Esto permite iniciar sesión en sitios como Amazon, eBay, etc. para eliminar contenido privado.

Ejemplo de raspado web de selenio

Juntemos todo en un script de raspador web de Selenium:

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

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# Click cookie consent banner
cookie_btn = driver.find_element(By.ID, ‘cookiebanner-accept‘) 
cookie_btn.click()

# Wait for results to load
results = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "results"))
)

# Extract data from results 
headings = results.find_elements(By.TAG_NAME, ‘h3‘)
for heading in headings:
   print(heading.text)

driver.quit()

Este guión:

  • Inicia Chrome y va a example.com
  • Hace clic en el banner de consentimiento de cookies para habilitar el scraping
  • Espera a que se carguen los resultados.
  • Extrae los textos de los títulos y los imprime.

¡Puedes mejorar esto con capacidades de desplazamiento, inicio de sesión, etc. para crear raspadores potentes!

Consejos para un web scraping eficaz con selenio

A continuación se ofrecen algunos consejos para mejorar la productividad del web scraping con Selenium:

  • Utilice un navegador sin cabeza para un raspado más rápido sin necesidad de renderizar y mostrar la interfaz de usuario

  • Limitar acciones innecesarias como abrir nuevas pestañas, interacciones con el cursor, etc. para raspar más rápido

  • Espere a que se cargue la página y AJAX solicitudes para completar antes de extraer datos

  • Desplazarse incrementalmente al raspar páginas largas para evitar cargar todo a la vez

  • Utilice selectores CSS para legibilidad y rendimiento al localizar elementos

  • Reintentar errores en lugar de detenerse por completo para hacer que los raspadores sean más robustos

  • Solicitudes de aceleración para evitar saturar los servidores y ser bloqueados

  • Corre en la nube utilizando servicios como Selenium Grid para mayor confiabilidad y escala

Alternativas de selenio para web scraping

Aquí hay algunas otras herramientas populares para web scraping que puedes considerar:

  • Hermosa sopa – Biblioteca Python líder para scraping HTML y XML

  • Scrapy – Marco de rastreo web rápido para grandes proyectos de scraping

  • Titiritero – Biblioteca de raspado de Chrome sin cabeza para desarrolladores de JavaScript

  • Dramaturgo – Scrape usando los navegadores Chromium, Firefox y WebKit

  • apificar – Plataforma de web scraping escalable con proxies integrados y Chrome sin cabeza

Cada herramienta tiene sus propias fortalezas y debilidades. Evalúelos según su caso de uso específico al seleccionar una solución de web scraping.

Conclusión

Selenium es una herramienta versátil para crear raspadores web robustos en Python y otros lenguajes. Abre posibilidades como raspar sitios JavaScript, manejar contenido dinámico, acceder a datos restringidos, etc., que de otro modo serían difíciles.

Asegúrese de seguir prácticas éticas de scraping y respetar las restricciones de los sitios web al utilizar Selenium. No sobrecargue los servidores con scraping agresivo.

Con el poder de Selenium, Python y estrategias de scraping sólidas, puede extraer enormes cantidades de datos útiles de la web para aplicaciones de inteligencia empresarial, investigación y ciencia de datos.

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *