Módulo Selenium

El módulo Selenium fue inicialmente diseñado como una herramienta de automatización de pruebas, pero en el scraping web se utiliza principalmente para resolver el problema de que requests no puede ejecutar directamente código JavaScript.

En esencia, Selenium funciona controlando un navegador, simulando completamente las operaciones del navegador como la navegación, la entrada de texto, los clics, los desplazamientos, etc., para obtener el resultado después de que la página ha sido renderizada. Es compatible con múltiples navegadores.

Con el módulo Selenium podemos realizar estas operaciones adicionales en comparación con requests:

  • Ejecutar código JavaScript
  • Simular operaciones de navegador, como si un humano estuviera operando

Preparación

# Instalación del módulo
pip install selenium

# Para diferentes navegadores, instalar el controlador correspondiente
# Por ejemplo, para Google Chrome, visite el siguiente enlace
https://registry.npmmirror.com/binary.html?path=chromedriver/
# La ruta anterior es un espejo que contiene muchos controladores de navegadores

En el sitio web, necesitamos descargar el controlador correspondiente a la versión de nuestro navegador:

Después de descargar el archivo comprimido, descomprímalo y coloque el archivo ejecutable chromedriver.exe en una ubicación adecuada.

Uso básico

Abrir el navegador

from selenium import webdriver
navegador = webdriver.Chrome(executable_path='chromedriver.exe')
# Chrome abre Google Chrome, es necesario especificar la ruta del controlador

Acceder a una página

from selenium import webdriver
import time

navegador = webdriver.Chrome(executable_path='chromedriver.exe') 
navegador.get('https://www.baidu.com/s?ie=UTF-8&wd=%E4%BD%A0%E4%B8%AA%E5%B8%85%E9%80%BC')  # Ingrese una URL, el navegador irá a esa dirección
time.sleep(8)

Al final del programa, el navegador parece cerrarse automáticamente porque el objeto del navegador es reciclado. Por eso, hacemos una pausa de varios segundos para ver cómo se ve la interfaz abierta.

Obtener el contenido de la página actual

navegador.page_source  # Texto en formato HTML

Navegación sin interfaz

El módulo Selenium proporciona varias opciones de navegación para mejorar la eficiencia del acceso a las páginas.

from selenium.webdriver.chrome.options import Options

opciones_chrome = Options()
# Especificar la resolución del navegador
opciones_chrome.add_argument('window-size=1920x3000') 
# Ocultar las barras de desplazamiento, para manejar algunas páginas especiales
opciones_chrome.add_argument('--hide-scrollbars')
# No cargar imágenes, para mayor velocidad
opciones_chrome.add_argument('blink-settings=imagesEnabled=false') 
# El navegador no proporciona una página visual. En Linux, si el sistema no admite visualización, el programa fallará sin esta opción
opciones_chrome.add_argument('--headless') 
# Especificar manualmente la ubicación del navegador a usar (especificar el controlador, si se configura en las opciones, no será necesario usar executable_path)
opciones_chrome.binary_location = r"chromedriver.exe"

# Iniciar el navegador
navegador = webdriver.Chrome(options=opciones_chrome)
navegador.get('URL')
# Similar a un timeout, espera la carga, pero espera como máximo 10 segundos
navegador.implicitly_wait(10)  
# Imprimir el resultado para verificar que, aunque ocultamos la interfaz, realmente solicitamos los datos
print(navegador.page_source)  

Resumen de los usos básicos

  • webdriver.Chrome(options=opciones_chrome) crea un objeto del navegador según la configuración, suponiendo que se almacena en la variable navegador
  • La configuración opciones puede especificar resolución, barras de desplazamiento, carga de imágenes, interfaz visible, controlador del navegador, etc.
  • Atributos y métodos del objeto navegador | Atributo | Significado | |---|---| | get('URL') | Ingresa la URL en la barra de direcciones para acceder | | page_source | Texto de recursos de la página actual solicitada | | implicitly_wait(seg) | Espera a que se cargue la página, esperando como máximo 'seg' segundos |

Usos avanzados

Buscar etiquetas

from selenium.webdriver.common.by import By

metodo = By.ID    # Buscar según el atributo id de la etiqueta
valor = 'login'   # El valor a buscar es 'login'
etiqueta = navegador.find_element(metodo, valor)   # Busca una, devuelve la etiqueta
etiquetas = navegador.find_elements(metodo, valor)   # Busca todas, las organiza en una lista

Las etiquetas buscadas se basan en los métodos de búsqueda proporcionados por By:

Tipo Significado
ID Atributo id
NAME Atributo name
TAG_NAME Tipo de etiqueta
CLASS_NAME Atributo class
LINK_TEXT Texto interno de la etiqueta
PARTIAL_LINK_TEXT Coincidencia difusa del texto de la etiqueta
CSS_SELECTOR Selector CSS

Todos usan el valor para proporcionar el valor final de búsqueda, como:

# Buscar todas las etiquetas p que son hijas de la etiqueta con id d1
navegador.find_elements(by=By.CSS_SELECTOR, value='#d1>p')
# Buscar el botón de inicio de sesión (caracterizado por el texto interno "Iniciar sesión")
boton = navegador.find_element(by=By.LINK_TEXT, value='Iniciar sesión')

Obtener atributos de etiqueta

En el paso anterior de búsqueda de etiquetas, se devuelve un objeto de etiqueta, suponiendo que se almacena en la variable etiqueta.

El objeto etiqueta tendrá los siguientes atributos:

Atributo Significado
etiqueta.get_attribute('nombre_del_atributo') Obtiene el valor del atributo especificado en la etiqueta
etiqueta.id Valor del atributo id común
etiqueta.location Información de ubicación de la etiqueta
etiqueta.tag_name Tipo de etiqueta, como la etiqueta a es 'a'
etiqueta.size Información de tamaño de la etiqueta

Esperar a que se carguen los elementos

Hay dos tipos de espera, pero generalmente solo se usa el mencionado anteriormente:

navegador.implicitly_wait(10)

Espera a que el navegador cargue las etiquetas, pero si después del tiempo especificado no se cargan, lanza una excepción.

Operaciones con elementos y navegador

Después de obtener los objetos etiqueta y navegador, podemos realizar algunas operaciones de eventos:

Método Operación
etiqueta.click() Hacer clic en la etiqueta
etiqueta.send_keys() Introducir contenido en etiquetas input
etiqueta.clear() Limpiar el contenido de etiquetas input
navegador.maximize_window() Maximizar la ventana del navegador
navegador.save_screenshot('principle.png') Guardar captura de pantalla en la ruta especificada
navegador.window_handles Lista de pestañas
navegador.switch_to.window(navegador.window_handles[0]) Cambiar a la primera pestaña
navegador.switch_to.frame('id_del_frame') Cambiar a la etiqueta frame con el id especificado
navgeador.get_cookies() Obtener todas las cookies de esta página, obteniendo una lista de dicccionarios
navegador.add_cookie(cookie) Agregar cookies al navegador
navegador.back() Volver a la página anterior
navegador.forward() Avanzar a la siguiente página

Hay muchas más operaciones, no se detallan aquí. En general, todas las operaciones del navegador que puede realizar un humano tienen métodos de objeto correspondientes.

Ejecutar código JavaScript

Correspondiente al modo de desarrollador, podemos ejecutar código JavaScript en la consola.

navegador.execute_script('instrucciones_js')  # Lo entre comillas se considera envuelto en etiquetas script

Podemos usar esta función para completar las siguientes operaciones:

Desplazar la pantalla del navegador

navegador.execute_script('scrollTo(0,document.documentElement.scrollHeight)')

Abrir una nueva pestaña (nueva página)

navegador.execute_script('window.open()')

A veces, los métodos de etiqueta proporcionados por Selenium, como click, pueden fallar (posiblemente porque la detección anti-scraping lo detectó). Entonces podemos usar la ejecución de código JavaScript para ejecutar, necesitamos pasar parámetros adicionales en execute_script: execute_script(instrucciones_js, parametro1, parametro2). En este caso, el código JavaScript necesita procesar estos parámetros, como se muestra a continuación.

boton_login = navegador.find_element(By.LINK_TEXT, 'Iniciar sesión')
navegador.execute_script("arguments[0].click()", boton_login)  # arguments es un resumen de los parámetros adicionales, que se pueden insertar en las instrucciones JavaScript.

Cadenas de acciones

Selenium admite acciones además de las acciones básicas, como mantener presionado el mouse y arrastrar, a veces se puede usar para códigos de verificación de deslizamiento, etc.

drag_and_drop toma una etiqueta y la coloca en una posición, esta acción es de salto, podría ser detectada como no humana.

acciones = ActionChains(navegador) # Obtener el objeto de cadena de acciones
acciones.drag_and_drop(origen, destino) # Colocar la acción en la cadena de acciones, lista para la ejecución secuencial
acciones.perform()

click_and_hold mantiene presionado el mouse
move_by_offset se mueve según el desplazamiento

# Mover hacia la derecha a velocidad constante
ActionChains(navegador).click_and_hold(origen).perform()
distancia = destino.location['x'] - origen.location['x']
recorrido = 0
while recorrido < distancia:
    ActionChains(navegador).move_by_offset(xoffset=2, yoffset=0).perform()
    recorrido += 2

De hecho, este movimiento uniforme también podría ser detectado por algunas estrategias, pero el scraping y la detección anti-scraping son como un juego de ajedrez, cada uno con sus movimientos.

Etiquetas: automatización-web web-scraping Selenium Python

Publicado el 6-13 02:36