CodeGym /Curso de Java /Python SELF ES /Trabajo con elementos dinámicos en una página web

Trabajo con elementos dinámicos en una página web

Python SELF ES
Nivel 36 , Lección 3
Disponible

1. Entendiendo los elementos dinámicos

Vamos a comenzar con una pequeña introducción a la naturaleza del contenido dinámico. Imagina que estás en un sitio web, y en cuanto haces scroll hacia abajo, aparece más contenido, como una alfombra mágica que se expande continuamente para que puedas volar sobre ella. Esto se llama carga diferida o "lazy loading", una técnica astuta que permite ahorrar recursos cargando el contenido solo cuando es necesario. Confiar en HTML estático en estos casos es como esperar que tu gato te traiga el café de la mañana.

¿Qué son los elementos dinámicos?

Los elementos dinámicos son aquellas partes de una página web que cambian sin necesidad de recargar toda la página. Pueden cargarse mediante solicitudes AJAX o incrustarse en la página a través de JavaScript. Es importante dominar varias estrategias para trabajar con dichos elementos, de modo que tu aplicación sea tan dinámica como el contenido mismo.

2. Estrategias de interacción

Pasemos a la magia práctica. Para manejar elementos dinámicos, necesitamos herramientas que entiendan: "La vida es movimiento, y estoy listo para ello". En nuestro arsenal mágico estará Selenium, ya que permite interactuar con el navegador casi como lo haría un humano.

Trabajo con solicitudes AJAX

AJAX es una tecnología que permite actualizar una parte de la página web sin recargarla completamente. Esto es conveniente para los usuarios, pero complica un poco la vida a los desarrolladores de scrapers. Sin embargo, tenemos un arma secreta: WebDriverWait y expected_conditions de Selenium.

Python

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

# Configuración del driver
driver = webdriver.Chrome()
driver.get("https://example-dynamic-site.com")

# Esperando a que aparezca un elemento
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dynamic_element_id"))
    )
    print(element.text)
finally:
    driver.quit()

Uso de métodos de espera

Al trabajar con elementos dinámicos, es importante dar al navegador tiempo para "llegar" al estado deseado. Los métodos de espera, como WebDriverWait combinado con expected_conditions, nos permiten esperar pacientemente a que se carguen todos los elementos necesarios. Es como arrastrarte al gimnasio: toma tiempo, pero el resultado vale la pena.

Ejemplos:

  • presence_of_element_located: espera a que el elemento aparezca en el DOM.
  • visibility_of_element_located: espera a que el elemento sea visible.
  • element_to_be_clickable: espera a que el elemento sea clickeable.

Por ejemplo, puedes esperar a que un botón sea clickeable así:

Python

button = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[@id='submit']"))
)
button.click()

Desplazamiento de la página

Si tu contenido se carga al desplazarte por la página, necesitarás el arte del "scrolling". Selenium permite usar JavaScript para desplazarte, lo que ayuda a cargar nuevos datos.

Python

# Desplazamiento hasta el final de la página
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Intenta implementar el scrolling en un bucle para cargar todo el contenido:

Python

SCROLL_PAUSE_TIME = 2
driver.get("https://example.com/dynamic-content")

last_height = driver.execute_script("return document.body.scrollHeight")

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Esperar para que la página cargue el contenido
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

3. Ejemplos prácticos de interacción

Ahora que hemos aprendido a esperar y observar, es hora de aplicar estas habilidades en la práctica y capturar todos esos datos dinámicos.

Supongamos que tenemos una página con productos que se cargan al desplazarnos hacia abajo. Necesitamos extraer el nombre y el precio de cada producto:

Python

products = []

while True:
    # Desplazamiento hacia abajo
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    # Esperar a que se carguen nuevos elementos
    WebDriverWait(driver, SCROLL_PAUSE_TIME)

    # Extracción de datos de los productos
    items = driver.find_elements(By.CLASS_NAME, "product-item")
    for item in items:
        name = item.find_element(By.CLASS_NAME, 'product-name').text
        price = item.find_element(By.CLASS_NAME, 'product-price').text
        products.append({'name': name, 'price': price})

    # Comprobar si se cargó algo nuevo
    # (método ingenuo: si la lista items no aumenta, salimos)
    if len(products) == last_known_count:
        break
    last_known_count = len(products)

Cuando los elementos dinámicos no se cargan tan rápido como nos gustaría, es necesario tener paciencia y habilidad. WebDriverWait con su arsenal de condiciones, el desplazamiento de la página y las inyecciones de JavaScript son nuestra clave para conquistar el mundo del contenido dinámico. Como decía el gran Jedi: "Paciencia, joven padawan". En nuestro caso, paciencia significa un scraping exitoso de todos los datos.

Cerramos la sesión de la misma forma que después de un día exitoso de trabajo — con cuidado.

Python

driver.quit()

No olvides: al final es importante asegurarte de que tu código funcione correctamente, sin fallos ni errores. Solo así puedes decir con confianza: "Misión cumplida". ¡Buena suerte en tu viaje por el mundo de los datos dinámicos!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION