es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Desplázate hacia abajo al final de una página web (selenium/python)

Estoy tratando de obtener todas las imágenes de esta página web: “https://www.airbnb.com/rooms/43871809/photos?guests=1&adults=1”

Estoy usando XPath para obtener todas las imágenes, pero si no desplazo hacia abajo hasta el final, XPath solo obtiene 13 imágenes cuando debería obtener 39.
Estoy utilizando el siguiente código:

s = Service(‘D:\Selenium driver\chromedriver2.exe’)
driver = webdriver.Chrome(service=s)
url = ‘https://www.airbnb.com/rooms/43871809/photos?guests=1&adults=1’
driver.get(url)
time.sleep(4)
driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”)
images = driver.find_elements_by_xpath(‘//div[@class=”1oaklsk”]/div/div/picture/img’)

He probado otros métodos para realizar la acción de desplazamiento, pero creo que el problema radica en la página. ¿Alguien puede proporcionarme una solución para el desplazamiento o cualquier otro método para obtener las 39 imágenes?

P.D: Soy nuevo en esto y aún estoy aprendiendo, agradezco su ayuda. Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la página web que estás intentando raspar tiene una galería cargada dinámicamente y las imágenes solo se cargan cuando se ven al hacer scroll. Para poder recuperar las 39 imágenes, deberás implementar el scroll en tu script.

    Aquí tienes un enfoque que podrías intentar:

    s = Service('D:\Selenium driver\chromedriver2.exe')
    driver = webdriver.Chrome(service=s)
    url = 'https://www.airbnb.com/rooms/43871809/photos?guests=1&adults=1'
    driver.get(url)
    
    # Obtén el conjunto inicial de imágenes
    images = driver.find_elements_by_xpath('//div[@class="_1oaklsk"]/div/div/picture/img')
    
    # Sigue haciendo scroll hasta que se carguen todas las imágenes
    while len(images) < 39:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2) # Espera a que se carguen las nuevas imágenes
        new_images = driver.find_elements_by_xpath('//div[@class="_1oaklsk"]/div/div/picture/img')
        if len(new_images) == len(images): # No se han cargado nuevas imágenes, salir del bucle
            break
        images = new_images
    
    print(f"Se han obtenido {len(images)} imágenes.")
    

    Este script primero obtiene el conjunto inicial de imágenes usando tu selector XPath existente. Luego, hace scroll repetidamente hasta el final de la página, esperando unos segundos para que se carguen nuevas imágenes y comprobando si se han añadido nuevas imágenes. Deja de hacer scroll una vez que se hayan obtenido las 39 imágenes o si no se han añadido nuevas imágenes después de hacer scroll.

    Ten en cuenta que este no es el enfoque más eficiente, ya que implica hacer scroll repetidamente en toda la página incluso si solo se agregan algunas imágenes nuevas. Un enfoque más avanzado implicaría detectar cuando la última imagen de la galería está a la vista y luego hacer scroll solo una pequeña cantidad para cargar el siguiente conjunto de imágenes. Sin embargo, esto debería ser suficiente para tu tarea actual.

    ¡Buena suerte con tu web scraping!

Comments are closed.