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.

Scrapear un sitio web en Python con la biblioteca requests-html, no obtuvo todos los elementos al ser seleccionados por beautifulsoup.

Intentando rastrear <https: edition.cnn.com/world=""> con Python utilizando el fragmento de código a continuación. El problema es que al usar BeautifulSoup para analizar el contenido, no obtengo todos los datos que quiero. Obtiene unos 20 elementos, pero hay muchos más elementos que deberían haber sido seleccionados.

from requests_html import HTMLSession
from bs4 import BeautifulSoup as bs

url = "https://edition.cnn.com/world"
s = HTMLSession()
response = s.get(url)
response.html.render(wait=20)
soup = bs(response.content, 'html.parser')
results = soup.select('div.cd__wrapper')
print(len(results))  # devuelve 20 aproximadamente

Básicamente, debería usar Selenium, pero dado que no solo se trata de este sitio web, podría resultar molesto. Aparentemente, el sitio web utiliza algunos scripts de JavaScript al cargarse, lo que está causando este problema.

Me pregunto cuál es el ajuste necesario aquí o si es posible hacer esto sin verse obligado a usar Selenium.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema con el código está relacionado con el hecho de que el sitio web utiliza JavaScript para cargar cierto contenido después de la respuesta HTML inicial. Por lo tanto, los elementos seleccionados por BeautifulSoup son solo aquellos que están presentes en la respuesta original pero no aquellos que se cargan dinámicamente.

    Una posible solución para este problema es utilizar una biblioteca de Python que pueda ejecutar JavaScript, como Selenium. Sin embargo, esta puede no ser una solución práctica si necesita rastrear múltiples sitios web.

    Otra opción es invertir la ingeniería de las llamadas de API que el sitio web realiza para cargar el contenido faltante y realizar las solicitudes HTTP directamente a esos puntos finales. Esto requiere ciertos conocimientos de desarrollo web y análisis de redes.

    Alternativamente, puede intentar retrasar el análisis hasta que el contenido dinámico se cargue por completo. Puede hacer esto aumentando el tiempo de espera para el proceso de representación o esperando a que se cargue un elemento específico. Por ejemplo, puede agregar el siguiente código para esperar a que se cargue la sección de contenido principal:

    response.html.render(wait=20, scrolldown=1)
    response.html.render(wait=20, scrolldown=2)
    soup = bs(response.html.html, 'html.parser')
    main_content = response.html.find('#main-content', first=True)
    main_content.html.render(wait=1)
    soup = bs(main_content.html, 'html.parser')
    

    El código anterior desplaza hacia abajo la página dos veces para cargar más contenido y espera a que se cargue el elemento #main-content antes de analizar el HTML con BeautifulSoup. Esto puede ayudar a obtener más datos, pero puede que no funcione en todos los casos, especialmente si el sitio web carga contenido dinámicamente en un área no desplazable.

    En resumen, tratar de recopilar datos de un sitio web que utiliza JavaScript para cargar contenido puede ser desafiante y no existe una solución única que funcione para todo. Es posible que deba experimentar con diferentes enfoques para ver cuál funciona mejor en cada caso específico.

Comments are closed.