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.

Rascando un sitio web dinámico usando Selenium o Beautiful Soup

Estoy intentando hacer web scraping en este sitio web dinámico para obtener los nombres de los cursos y los horarios de las clases ofrecidos durante un semestre: https://www.utsc.utoronto.ca/registrar/timetable

El problema es que cuando ingresas al sitio web por primera vez, aún no se muestran los cursos, solo después de seleccionar las “Sesiones” y hacer clic en “Buscar cursos” comenzarán a aparecer los cursos.

Aquí es donde comienzan los problemas:

1) No puedo usar

html = urlopen(url).read()

con urllib.request, ya que solo mostrará el HTML de la página cuando no haya nada.

2) Hice una búsqueda rápida sobre cómo hacer web scraping en sitios web dinámicos y encontré un código como este:

import requests
url = 'https://www.utsc.utoronto.ca/registrar/timetable'

r= requests.get(url)
data = r.json()
print(data)

sin embargo, cuando lo ejecuto, devuelve “JSONDecodeError: Expecting value” y no tengo idea de por qué ocurre esto cuando ha funcionado en otros sitios web dinámicos.

Realmente no tengo que usar Selenium o Beautiful Soup, así que si hay mejores alternativas, con gusto las probaré. También me preguntaba cuando:

html = urlopen(url).read()

¿Cuál es el formato del HTML que se devuelve? Quiero saber si puedo simplemente copiar el HTML cambiado al inspeccionar el sitio web después de seleccionar las sesiones y hacer clic en buscar.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución:

    La mejor manera de hacer web scraping en este sitio web dinámico es usar Selenium. Selenium es un marco de automatización web que se puede utilizar para controlar un navegador web y para sacar datos de sitios web dinámicos.

    Para usar Selenium, necesitarás instalar el paquete Selenium y un driver web para el navegador que desees usar. Una vez que hayas instalado el paquete Selenium y el driver web, puedes utilizar el siguiente código para hacer web scraping de los nombres de los cursos y los horarios de las clases:

    from selenium import webdriver
    
    # Crear una instancia de un webdriver
    driver = webdriver.Chrome()
    
    # Navegar hacia el sitio web
    driver.get('https://www.utsc.utoronto.ca/registrar/timetable')
    
    # Seleccionar la(s) sesión(es)
    session_select = driver.find_element_by_id('session_select')
    session_select.click()
    
    # Hacer clic en el botón Search for Courses
    search_button = driver.find_element_by_id('search_button')
    search_button.click()
    
    # Sacar los nombres de los cursos y los horarios de las clases
    courses = driver.find_elements_by_class_name('course_name')
    for course in courses:
        print(course.text)
    
    lectures = driver.find_elements_by_class_name('lecture_time')
    for lecture in lectures:
        print(lecture.text)
    

    El HTML que devuelve urlopen(url).read() es el HTML de la página cuando no se ha seleccionado nada. Para obtener el HTML de la página después de seleccionar la(s) sesión(es) y hacer clic en el botón de Search for Courses, puedes utilizar el atributo driver.page_source.

Comments are closed.