Primeros pasos con Selenium y Python

La automatización del navegador web está ganando popularidad y han surgido muchos marcos/herramientas para ofrecer servicios de automatización a los desarrolladores. La automatización del navegador web es a menudo...

Introducción

La automatización del navegador web está ganando popularidad y han surgido muchos marcos/herramientas para ofrecer servicios de automatización a los desarrolladores.

La automatización del navegador web se usa a menudo con fines de prueba en entornos de desarrollo y producción, aunque también se usa a menudo para extraer datos web de fuentes públicas, análisis y procesamiento de datos.

Realmente, lo que haga con la automatización depende de usted, sin embargo, solo asegúrese de que lo que está haciendo sea legal, ya que los "bots" creados con herramientas de automatización a menudo pueden infringir las leyes o los términos de servicio de un sitio. .

Selenio es una de las herramientas más utilizadas para la automatización del navegador web y ofrece una gran cantidad de funciones y potencia sobre un navegador.

Es compatible con muchos lenguajes como C#, Java, Perl, PHP y Ruby, aunque por el bien de este tutorial, lo usaremos con Python en Windows.

¿Qué es el selenio?

Selenium es una gran herramienta que permite a los desarrolladores simular usuarios finales con solo unas pocas líneas de código. Usando las herramientas que ofrece, es muy fácil usar páginas web y simular un ser humano, aunque es difícil replicar realmente el comportamiento humano.

Para combatir los "bots", que están destinados a replicar a los humanos, se utilizan muchos sistemas sofisticados para reconocer el comportamiento similar al humano, que es casi imposible de replicar usando herramientas de programación.

Si está creando una aplicación con Selenium, asegúrese de cumplir con todas las leyes asociadas con la automatización del navegador web, o simplemente utilícela con fines de prueba en su propio entorno de producción.

Algunas de las tareas más populares realizadas con Selenium incluyen, entre otras:

  • Hacer clic en los botones
  • Introducción de texto
  • Extracción de texto
  • Acceder a las Cookies
  • Presionando teclas

Requisitos previos

Antes de comenzar, tendremos que hacer algunas cosas para configurar:

  • Instalar Google Chrome en tu computadora - Estaremos simulando un usuario en Google Chrome, aunque podrías simular otros navegadores, pero para este artículo estaré utilizando Google Chrome.
  • Obtén chromedriver.exe, porque para simular realmente el navegador necesitarás una ruta a este ejecutable en tu computadora .
  • Instala el paquete de selenio usando pip install selenium en la línea de comando.

Lo básico

Muy bien, ahora estamos listos para comenzar a trabajar con Selenium. Lo primero que tendrás que hacer es iniciar el navegador:

1
2
3
4
5
from selenium import webdriver

EXE_PATH = r'path\to\chromedriver.exe'
driver = webdriver.Chrome(executable_path=EXE_PATH)
driver.get('https://google.com')

Ejecutar esto abrirá Google Chrome y navegará a https://google.com.

Aquí, es importante tener en cuenta que la conexión a la página web se realiza con la función get(URL) del objeto driver.

Como habrás notado, el driver es el objeto WebDriver de Selenium, lo usas para acceder al navegador mediante programación, por ejemplo:

1
print(driver.page_source)

El código anterior imprime el código HTML fuente de toda la página. Si necesita recopilar datos, esto es muy útil.

Localización de elementos

Por lo general, no necesita el contenido de una página completa, sino elementos específicos.

Para hacerlo, primero deberá detectar su objetivo en la página, y para eso puede usar la herramienta Inspeccionar elemento en Google Chrome.

Eso significa que si necesita el contenido de un determinado elemento en la página, para obtener la identificación de las etiquetas, puede hacer lo siguiente (en una sesión regular de Google Chome):

  • Click derecho sobre el elemento
  • Elija "Inspeccionar"
  • Y en la nueva ventana, puedes echar un vistazo al HTML del elemento y el ID estará después de id=.

Al obtener los elementos que necesitamos, podemos realizar diferentes tipos de operaciones sobre ellos.

Obtener elementos por ID

Si tiene una identificación exacta del elemento que está buscando, es fácil recuperarlo:

1
element = driver.find_element_by_id('element_id')

Obtener elementos por nombre

Similar al enfoque anterior:

1
element = driver.find_element_by_name('element_name')

Obtener elementos por clase

Y de nuevo, similar al enfoque anterior:

1
element = driver.find_element_by_class_name('element_class_name')

Obtención de elementos por etiqueta HTML

En algunos casos, es posible que desee obtener todos los elementos mediante una determinada etiqueta:

1
links = driver.find_elements_by_tag_name('a')

En este caso, enlaces se completa con todas las etiquetas a, que ahora contienen cada enlace en la página. Esto puede ser útil para fines de rastreo web.

Obtención de elementos por XPath

No todos los elementos tienen una ID, o tal vez no desee acceder a todas las etiquetas HTML a. Hay otras formas de recuperar un elemento muy específico, como XPath, que es otra forma de recuperar elementos. Con XPath, puede encontrar elementos de manera más fácil y eficiente:

1
tag_list = driver.find_elements_by_xpath("//tag[@attr='val']")

tag_list ahora contiene cada etiqueta que tiene un atributo attr establecido en val:

1
<tag attr='val'>Foo</tag>

Ahora puede iterar tag_list e interactuar con cada WebElement de Selenium en él.

Puedes leer más sobre el sistema XPath en Selenium aquí.

Elemento web de selenio {#elemento web de selenio}

Un WebElement de Selenium representa prácticamente un elemento HTML. Puede realizar operaciones en estos elementos de forma similar a como lo haría como usuario final.

Estas operaciones incluyen:

  • Acceder a propiedades simples del elemento, como el texto dentro (element.text)
  • Acceder a los elementos principales, que también son del tipo WebElement (element.parent)
  • Acceder a atributos específicos, como el href de una etiqueta a (element.get_attribute('href'))
  • Buscando dentro de él (de la misma manera que buscaría en driver)
  • Al hacer clic en él (element.click())
  • Ingresar texto si es posible (element.send_keys('Input Text'))

Selenio WebDriver

WebDriver es similar a WebElement, sin embargo, la principal diferencia es su alcance. El alcance de este último es el elemento mismo, mientras que el alcance del primero es la página completa.

También puede hacer muchas cosas con un objeto WebDriver de Selenium, prácticamente cualquier cosa que pueda hacer como ser humano con un navegador normal.

Algunas otras cosas muy útiles son:

  • Ejecutando JavaScript: driver.execute_script("script")
  • Guardar una captura de pantalla: driver.save_screenshot('image.png')
  • Iniciar en "modo sin cabeza", donde el navegador ahorra tiempo al no renderizar la página:
1
2
3
4
5
6
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)
driver.set_window_size(1440, 900)

Tenga en cuenta que el tamaño de la ventana está configurado en (1440, 900), es decir, para evitar todo tipo de errores relacionados con algunos elementos que no se cargan correctamente debido al modo sin cabeza.

Puede cambiar la resolución a cualquier otra resolución razonablemente grande, pero debe asegurarse de que la resolución se cambie de los valores predeterminados cuando se encuentra en modo sin cabeza.

Acceso a cookies {#acceso a cookies}

Es posible que necesite agregar o eliminar cookies del navegador:

1
2
ck = {'some_attr': 'foo', 'some_other_attr': 'bar'}
driver.add_cookie(ck)

Esto agrega una cookie al navegador, lo que puede ser útil si necesita agregar cookies de preferencia o autenticación, por ejemplo. Es importante asegurarse de que la cookie esté en formato dict.

También es muy fácil recuperar las cookies del navegador:

1
2
3
cookies = driver.get_cookies()
for ck in cookies:
    print(ck)

El código anterior imprime cada cookie en el navegador.

Alterando el HTML

A veces, es posible que necesite cambiar la propiedad de un elemento determinado.

Como se mencionó anteriormente, puede usar un WebDriver de Selenium para ejecutar JavaScript, y cambiar las propiedades de los elementos es muy fácil de hacer con JavaScript:

1
driver.execute_script("arguments[0].setAttribute('attr','value')", element)

Aquí element es el elemento a modificar, attr es el atributo a cambiar y value es el nuevo valor.

A veces, es posible que necesite descargar un archivo de un sitio web:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_experimental_option("prefs", {
    "download.default_directory": r"path\to\directory",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True
})

driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)

Puede especificar la ruta de la ubicación de guardado definiendo download.default_directory, como path\to\directory.

Presionando teclas

1
2
3
4
5
6
7
8
9
import time
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

action = ActionChains(driver)
for _ in range(3):
    action.send_keys(Keys.ARROW_DOWN)
    time.sleep(.1)
action.perform()

Este código presiona la flecha hacia abajo (Keys.ARROW_DOWN) 3 veces. Después de cada action.send_keys(Keys.ARROW_DOWN) el programa espera un poco. Esto se recomienda para asegurarse de que todas las claves se registren.

Si simplemente ejecutamos varios comandos, es posible que se pierdan en el proceso y no se registren.

Keys contiene todas las teclas del teclado, lo que significa que también puede usar este método para tabular (Keys.TAB) entre elementos de la página, lo que facilita la interacción con él (Keys.RETURN y Keys .SPACE también son muy importantes).

Hacer clic en los botones

Tenga en cuenta que puede presionar las teclas para navegar entre los elementos de una página, por ejemplo, puede usar las pestañas y los espacios para completar las casillas de verificación y usar las teclas de flecha para navegar entre los elementos del menú desplegable.

Por supuesto, una forma más natural de seleccionar casillas de verificación y elementos desplegables sería simplemente recuperar el elemento usando el controlador y hacer clic en él:

1
2
checkbox = driver.find_element_by_id('checkbox')
checkbox.click()

Introducción de formularios

También puede simular pulsaciones de teclas dentro de los propios elementos:

1
2
element.send_keys(Keys.CONTROL, 'a')
element.send_keys(value)

De esta forma, las claves se registran dentro del elemento, de modo que si quisieras rellenar un textarea, podrías hacerlo así.

Por cierto, este código usa un atajo de teclado (CTRL + A) para seleccionar todo el texto dentro del elemento. La siguiente línea reemplaza el texto seleccionado con el valor ingresado.

Para registrar atajos de teclado, pase todas las teclas deseadas en los parámetros a send_keys.

Desplazamiento

A veces, partes de la página se cargan solo después de que te desplazas hacia abajo (como un feed de Instagram o cualquier otra página de desplazamiento infinito). Esto se puede hacer fácilmente mediante la ejecución de un simple script de JavaScript:

1
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

El código anterior usa un comando de JavaScript para desplazarse hasta la parte inferior de la página, ahora puede usar driver.page_source nuevamente y obtener el nuevo contenido.

Conclusión

Selenium es una de las herramientas más utilizadas para la automatización del navegador web y ofrece una gran cantidad de funciones y potencia en comparación con un navegador controlado por humanos.

Se utiliza principalmente para pruebas/automatización de entornos de producción o integración, aunque también se puede utilizar como raspador web con fines de investigación, etc. Asegúrese de cumplir con todas las leyes cuando practique el raspado web de contenido público para no infringir ninguna ley.