Introducción al WebScraping con Selenium(Py)

Raspbian, Python y Selenium

Prerrequisitos: saber HTML y Python de forma básica

En este post os vamos a introducir a la práctica de scraping, explicando los conceptos clave e instalación y uso de los comandos más importantes, para que tras haber leído este artículo seáis capaces de sacar la información de vuestras páginas favoritas. Concretamente, usando nuestra pequeña placa Raspberry (cualquiera de ellas valdría en principio, pero se recomienda de la 3 en adelante).

Fundamentalmente hacer scraping es minar datos de una página web sin el uso de ningún tipo de API, es decir, obteniendo el texto directamente del código fuente HTML.

Existen 2 tipos principales de scraping:

  • Headless: es el más rápido y eficiente, requiriendo muy pocos recursos de la máquina para leer el contenido de una web. Sin embargo, en la mayoría de casos no soporta la carga de Javascript (aunque muchos de ellos aseguren hacerlo en la práctica siempre hay problemas), por lo que la página resultante puede estar incompleta. De este tipo hablaremos en otro futuro post.
  • Heavy scraping: usa un navegador al uso, como si tú mismo estuvieras navegando en él. La diferencia es que tú lo estarás controlando y leyendo el código de cada página mediante un driver de navegador. Usaremos este tipo.

Lo primero que necesitaremos es conseguir el driver que controle las acciones del navegador. Como vamos a usar Chromedriver, tendríamos que comprobar la versión Chromium del que tenemos instalado para luego descargar el apropiado en la página de Chrome. Desafortunadamente, Google ya no ofrece soporte para la arquitectura arm de la Raspberry, por lo cual usaremos el compilado proporcionado por la comunidad Raspian:

sudo apt-get install chromium-chromedriver

Suponiendo que ya tienes Python (versión 3) instalado, habrá que bajar la librería Selenium desde el gestor de pip

pip3 install selenium

Entrando ya en el ajo, lo primero que debemos de hacer en nuestro programa python es importar la librería y configurar el driver que usaremos para navegar. Lo encapsularemos en una función:

from selenium import webdriver

def create_web_driver():
    driver = webdriver.Chrome()

    driver.set_window_position(0, 0)
    driver.set_window_size(800, 600) #Opcional
    return driver

Esa es la configuración básica, que nos valdrá para nuestro ejemplo. Ahora, para navegar a una página concreta (pongamos como ejemplo www.coinmarketcap.com), deberemos añadir lo siguiente:

driver = create_web_driver()             # Creamos el objeto driver
driver.get("https://coinmarketcap.com")  # Vamos a una página

Nos encontraremos con una página tal como la que se muestra abajo. Pero lo que queremos es seleccionar la moneda Bitcoin, para que nos lleve a los detalles. ¿Cómo hacemos eso? Lo primero es ver el código fuente de la página, que puede verse haciendo click derecho al enlace donde querremos pinchar e Inspeccionar.

El famoso banner de Aceptación de Cookies siempre es algo molesto, ¿verdad? Aquí no iba a ser menos, porque en muchas ocasiones ocupará la parte de la pantalla en la que queremos pinchar.

Lo primero que deberemos de hacer entonces es buscar la clase de la X que cierra ese mensaje, para poder encontrar el elemento con el driver. Acto seguido, le diremos que haga click para cerrarlo.

cookies_banner = driver.find_element_by_class_name("cmc-cookie-policy-banner__close")
cookies_banner.click() # Cerramos el banner

# Ahora buscamos el <a> mediante el Xpath anterior
bitcoin_element = driver.find_element_by_xpath('//*[@id="__next"]/div/div[2]/div/div/div[2]/table/tbody/tr[1]/td[3]/a')
bitcoin_element.click()

Importante: dentro de la función del xpath hay que encerrar la cadena entre comillas simples.

La etiqueta HTML clickable para bitcoin puede encontrarse mediante la clase, id, selector de css o XPath, que es la forma más directa.

Al correr el código hasta ahora, nos encontraremos en esta página:

Debemos, como antes, buscar en qué etiqueta está la información que buscamos. Para ello inspeccionamos con click derecho el precio, observando que está dentro de una etiqueta <span> cuya clase es cmc-details-panel-price__price. Conseguiremos el elemento mediante este atributo.

bitcoin_price_element = driver.find_element_by_class_name("cmc-details-panel-price__price")
bitcoin_price_string = bitcoin_price_element.text # Este atributo nos dará el string dentro de la etiqueta

print(f"El precio actual del Bitcoin respecto al par USD es: {bitcoin_price_string})
driver.close() # Siempre se debe cerrar el navegador una vez terminado

¡Y ya está! Con este método facilitado por la librería Selenium podremos automatizar acciones en el navegador o leer el contenido de las páginas web para nuestros pequeños programas. Y la Raspberry PI es perfecta para este tipo de tareas repetitivas.

Si te ha gustado el post te animo a echarle un ojo a las posibilidades que ofrece la librería. Además, si tienes curiosidad acerca de otras herramientas y métodos, puedes investigar estos términos:

¡Feliz minado!

Resultado de ejecutar el script completo

Disclaimer: la estructura HTML de una página puede cambiar en cualquier momento, por lo que los selectores mostrados como ejemplo podrían no funcionar en un futuro.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies