No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
16 Hrs
17 Min
9 Seg

Construyendo Funciones

16/30
Recursos

Aportes 22

Preguntas 2

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Si la función “obtener_datos_escalas” no trae ningún dato, coloquen al principio de la misma estas líneas:

#Abrir modal
boton_escalas = vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]//button')
boton_escalas.click()

y al final estas otras:

# Cerrar modal 
driver.find_element_by_xpath('//div[@class="modal-dialog"]//button[@class="close"]').click()

Ya que el profesor olvidó el importantísimo paso de abrir y cerrar el modal 😅

Anotaciones y Ejercicios Curso de Web Scraping - Modulo I
La pagina cambio mucho pero no te preocupes te dejo esta y todas las anotaciones del curso actualizados al 2023, tome nota de los comentarios y ejercicios resueltos de cada sección. Lleve en cuenta las explicaciones del docente y más! Espero te sirva. 👌
(si quieres apoyar deja una estrella a la repo ✌⭐)

Solución al reto final:

def obtener_tiempos(vuelo):
    """Función que a partir de un vuelo devuelve un diccionario con los tiempos
       de cada viaje por escala
    """
    
    #Abrir modal
    boton_escalas = vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]//button')
    boton_escalas.click()
    
    segments = vuelo.find_elements_by_xpath(
        '//div[@class="segments-graph"]/div[@class="segments-graph-segment"]'
    )
    
    flights_durations = {}
    
    for i, segment in enumerate(segments):
        duration = segment.find_element_by_xpath('.//span[@class="duration flight-schedule-duration"]//time').get_attribute('datetime')
        flights_durations[i] = duration
    
    return flights_durations

    # Cerrar modal 
    driver.find_element_by_xpath('//div[@class="modal-dialog"]//button[@class="close"]').click()

Les comparto las funciones y funcionan al 26-junio-2021

Le agregue la funcion time.sleep adentro del codigo, para que este esperara a que la pagina cargara antes de ejecutarse. Les dejo el codigo.

# Podemos agregarle opciones al driver para utilizar los distintos modos del Chrome
from selenium import webdriver
from bs4 import BeautifulSoup
import time

def obtener_precios(vuelo):
    # Funcion que retorna una lista de diccionarios con las distintas tarifas
    precios = []
    # Ahora hay que click sobre el vuelo
    vuelo.find_element_by_xpath('.//div[@class="flight-container"]/button').click()
    time.sleep(0.5)

    fare_type = vuelo.find_elements_by_xpath('.//table[@class="fare-options-table"]//thead//th[contains(@class, "fare")]//span')
    currency = vuelo.find_elements_by_xpath('.//table[@class="fare-options-table"]//tfoot//td[contains(@class, "fare")]//span[@class="currency-symbol"]')
    tarifas = vuelo.find_elements_by_xpath('.//table[@class="fare-options-table"]//tfoot//td[contains(@class, "fare")]//span[@class="value"]')

    for i in range(len(tarifas)):
        nombre = fare_type[i].text
        moneda = currency[i].text
        valor = tarifas[i].text
        dict_tarifa = {nombre : {'Moneda':moneda, 'Valor': valor}}
        precios.append(dict_tarifa)

    vuelo.find_element_by_xpath('.//div[@class="flight-container"]/button').click()
    return precios


def obtener_datos_escalas(vuelo):
# Funcion que retorna una lista de diccionariso con la informaci[on de las escalas de cada vuelo
    info_escalas = []
    vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]/button').click()
    time.sleep(0.5)

    segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-cLQEGU hyoued"]')
    
    segmentos_procesados = 0

    tiempo_escala = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU dnKRNG"]//span[@class="sc-esjQYD dMquDU"]/time') 

    for segmento in segmentos:

        city = segmento.find_elements_by_xpath('.//div[@class="sc-bwCtUz iybVbT"]/abbr')
        de_city = city[0].text
        ar_city = city[1].text

        schedule = segmento.find_elements_by_xpath('.//div[@class="sc-bwCtUz iybVbT"]/time')
        de_schedule = schedule[0].get_attribute('datetime')
        ar_schedule = schedule[1].get_attribute('datetime')

        flight_no = segmento.find_element_by_xpath('.//div[@class="airline-flight-details"]/b').text
        airplane = segmento.find_element_by_xpath('.//div[@class="airline-flight-details"]/span[@class="sc-gzOgki uTyOl"]').text

        if segmento != segmentos[-1]:
            duration_stop = tiempo_escala[segmentos_procesados].get_attribute('datetime')
            segmentos_procesados =+ 1
        else:
            duration_stop = ''

        data_dict = {
            'Origen': de_city,
            'Dep time': de_schedule,
            'Destino': ar_city,
            'Arr Time': ar_schedule,
            'Numero vuelo': flight_no,
            'Modelo Avion': airplane,
            'Duracion escala': duration_stop
        }
        info_escalas.append(data_dict)

    driver.find_element_by_xpath('//div[@class="modal-header sc-dnqmqq cGfTsx"]/button').click()

    return info_escalas


def obtener_tiempos(vuelo):
# Funcion que retorna un diccionario con los horarios de salida y llegada de cada vuelo, incluyendo la duracion.
# Nota: La duracion del vuelo no es la hora de llegada - la hora de salida porque puede haber diferencia de horarios en las ciudades.
    tiempos = []
    vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]/button').click()

    segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-cLQEGU hyoued"]')  
    for segmento in segmentos:
        city = segmento.find_elements_by_xpath('.//div[@class="sc-bwCtUz iybVbT"]/abbr')
        de_city = city[0].text
        ar_city = city[1].text

        schedule = segmento.find_elements_by_xpath('.//div[@class="sc-bwCtUz iybVbT"]/time')
        de_schedule = schedule[0].get_attribute('datetime')
        ar_schedule = schedule[1].get_attribute('datetime')

        duration = segmento.find_element_by_xpath('.//span[@class="sc-esjQYD dMquDU"]/time').get_attribute('datetime')
        data_dict = {
            'Origen': de_city,
            'Dep time': de_schedule,
            'Destino': ar_city,
            'Arr Time': ar_schedule,
            'Duracion del vuelo': duration
        }
        tiempos.append(data_dict)
    
    driver.find_element_by_xpath('//div[@class="modal-header sc-dnqmqq cGfTsx"]/button').click()

    return tiempos


def main():

    time.sleep(8)
    try:
        driver.find_element_by_xpath('//div[@class="slidedown-footer"]/button[@class="align-right secondary slidedown-button"]').click()
    except:
        pass
    try:
        driver.find_element_by_xpath('//div[@class="lightbox-container"]//span[@class="close"]').click()
    except:
        pass

    # Para seleccionar las cosas, necesitamos usar un XPATH
    vuelos = driver.find_elements_by_xpath('//li[@class="flight"]')
    vuelo = vuelos[10]
    
    precios = obtener_precios(vuelo)
    print(precios)

    info_escalas = obtener_datos_escalas(vuelo)
    print(info_escalas)

    tiempos = obtener_tiempos(vuelo)
    print(tiempos)

    driver.close()

if __name__ == "__main__":

    url = 'https://www.latam.com/es_co/apps/personas/booking?fecha1_dia=16&fecha1_anomes=2021-01&auAvailability=1&ida_vuelta=ida&vuelos_origen=Bogot%C3%A1&from_city1=BOG&vuelos_destino=Lima&to_city1=SCL&flex=1&vuelos_fecha_salida_ddmmaaaa=20/01/2021&cabina=Y&nadults=1&nchildren=0&ninfants=0&cod_promo=&stopover_outbound_days=0&stopover_inbound_days=0&application=#/'
    options = webdriver.ChromeOptions()
    options.add_argument('--incognito')
    driver = webdriver.Chrome(executable_path='./chromedriver', options=options)
    driver.get(url)

    main()

La pagina de lan ha cambiado, no se puede seguir el ejemplo del profesor, los tag de datetime y otros elementos sucesivos ya no existen. deberian actualizar el curso

#Realizamos la funcion que va a retornar las escalas
def obtener_datos_escala(vuelo):
    
    #Abrir modal
    boton_escalas = vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]//button')
    boton_escalas.click()
    
    segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU hyoued"]')
    tiempo_escala = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU dnKRNG"]//span[@class="sc-esjQYD dMquDU"]/time')    
    info_escalas = []
    
    for segmento in segmentos:
        escala = segmento.find_elements_by_xpath('.//div[@class="sc-bwCtUz iybVbT"]/abbr[@class="sc-hrWEMg hlCkST"]')
        #origen
        origen = escala[0].text
        #destino
        destino = escala[1].text
        #duracion
        duracion = segmento.find_element_by_xpath('.//span[@class="sc-esjQYD dMquDU"]/time').get_attribute('datetime')
        #vuelo
        vuelo = segmento.find_element_by_xpath('.//div[@class="airline-flight-details"]//b').text
        #avion
        avion = segmento.find_element_by_xpath('.//span[@class="sc-gzOgki uTyOl"]').text
        #duracion de la escala
        if segmento != segmentos[-1]:
            duracion_escala = tiempo_escala[0].get_attribute('datetime')
        else:
            duracion_escala = ''
        data_dict = {
            'origen':origen,
            'destino':destino,
            'duracion':duracion,
            'numero_vuelo':vuelo,
            'modelo_avion':avion,
            'duracion_escala':duracion_escala,
        }
        print(data_dict)
        info_escalas.append(data_dict)
   
    # Cerrar modal 
    driver.find_element_by_xpath('//div[@class="modal-content sc-iwsKbI eHVGAN"]//button[@class="close"]').click()    
   
            
    return(info_escalas)```

Solución

def obtener_tiempos(vuelo):
    salida = vuelo.find_element_by_xpath('.//div[@class="departure"]/time').get_attribute('datetime')
    llegada = vuelo.find_element_by_xpath('.//div[@class="arrival"]/time').get_attribute('datetime')
    duracion = vuelo.find_element_by_xpath('.//span[@class="duration"]/time').get_attribute('datetime')
    tiempos = {
        'hora_salida': salida,
        'hora_llegada': llegada,
        'duracion': duracion
    }

Me gusta la metodología de desarrollo de las funciones del profesor de este curso.

Este es mi resultado al reto:

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document
(Session info: chrome=80.0.3987.116)

alguien sabe solucionarlo

Desafío:

def get_info_vuelos(vuelo):
   info_vuelo = {
        'hora_salida': vuelo.find_element_by_css_selector('.departure time').get_attribute('datetime'),
        'hora_llegada': vuelo.find_element_by_css_selector('.arrival time').get_attribute('datetime'),
        'duracion': vuelo.find_element_by_css_selector('.duration time').get_attribute('datetime')
    }
    return info_vuelo
def obtener_tiempos(vuelo):
    """
    Función que retorna un diccionario con los horarios de salida y llegada de cada vuelo, incluyendo la duración
    """
    hora_salida = vuelo.find_element_by_xpath('.//div[@class="departure"]/time').get_attribute('datetime')
    hora_llegada = vuelo.find_element_by_xpath('.//div[@class="arrival"]/time').get_attribute('datetime')

    duracion = vuelo.find_element_by_xpath('.//span[@class="duration"]/time').get_attribute('datetime')
    data_dict={
        'hora_salida':hora_salida,
        'hora_llegada':hora_llegada,
        'duracion'.duracion
    }
    return data_dict```
def getTarifas(travel):
    travel.click()
    tarifas = travel.find_elements_by_xpath('.//div[@class="fares-table-container"]//tfoot//td[contains(@class, "fare-")]')
    tarifas_info = []
    for tarifa in tarifas:
        tipo = tarifa.find_element_by_xpath('.//input[@name="selected-fare"]').get_attribute('id')
        price = tarifa.find_element_by_xpath('.//span[@class="value"]/span').text
        tarifas_info.append({'tipo': tipo, 'precio': price})
    return tarifas_info

tarifas = getTarifas(vuelo)
tarifas

Solución al reto:

#Desafio: Obtener los tiempos de partida o llegada del vuelo según la escala del sitio y la duración entre esos intervalos.

def time_by_scale(vuelo):
    puntos_escala = vuelo.find_elements_by_xpath('//div[@class="sc-esOvli iQSbOQ"]/span[@class="sc-bsbRJL bMMExG"]')
    intervalos_tiempo = vuelo.find_elements_by_xpath('//div[@class="sc-esOvli iQSbOQ"]/span[@class="sc-cmthru ipcOEH"]')

    dict_nodo = {}
    nodos=[]
    for punto in puntos_escala:
        try:
            nodo = punto.find_element_by_xpath('.//div[@class="sc-bwCtUz 
 iybVbT"]/span').text
            if puntos_escala.index(punto) == 0:
                dict_nodo['Oigen']= nodo
    
            else:
                dict_nodo[f'Destino {puntos_escala.index(punto)}']=nodo
            
                intervalo = intervalos_tiempo[puntos_escala.index(punto)]
            try:
                duracion = intervalo.find_element_by_xpath('.//span[@class="sc-esjQYD dMquDU"]/time').get_attribute('datetime')
                if duracion != None:
                    dict_nodo['Duración']=duracion
            except:
                pass
        except: 
            pass
        
    nodos.append(dict_nodo)

    return nodos

Estos fueron los resultados para un vuelo en especifico:
[{‘Oigen’: ‘Salida a las 18 Horas 55 Minutos, de Benito Juárez Intl.’,
‘Destino 1’: ‘Llegada a las 06 Horas 15 Minutos, a A. Merino Benítez Intl.’,
‘Duración’: ‘8:20’}]

La función del reto:

def obtener_tiempos(vuelo):
    '''Obtener las horas de salida y llegada, y la duracion del vuelo'''
    
    tiempos = []
    
    hora_salida = vuelo.find_element_by_xpath('.//div[@class="departure"]/time').get_attribute('datetime')
    hora_llegada = vuelo.find_element_by_xpath('.//div[@class="arrival"]/time').get_attribute('datetime')
    duracion = vuelo.find_element_by_xpath('.//span[@class="duration"]/time').get_attribute('datetime').replace('PT', '').lower()
    
    dict_tiempos = {
        'hora_salida': hora_salida,
        'hora_llegada': hora_llegada,
        'duracion': duracion
    }
    
    tiempos.append(dict_tiempos)
    
    return tiempos

Este es el resultado del reto

def obtener_tiempos(vuelo):
    """Funcion que retorna un diccionario con los horarios de salida 
    y llegada de cada vuelo, incluyendo la duracion.
    """
    hora_salida = vuelo.find_element_by_xpath('.//div[@class="departure"]/time').get_attribute('datetime')
    hora_llegada = vuelo.find_element_by_xpath('.//div[@class="arrival"]/time').get_attribute('datetime')
    duracion_vuelo = vuelo.find_element_by_xpath('.//span[@class="duration"]/time').get_attribute('datetime').replace('PT','')
    dict_times = {
        'hora_salida':hora_salida,
        'hora_llegada':hora_llegada,
        'duracion_vuelo':duracion_vuelo
    }
    return dict_times

Reto:

# obtener horaio de salida, llegada y duración de cada vuelo
def obtener_tiempos(vuelo):
    tiempos = []
    # obtener hora de salida
    hora_salida = vuelo.find_element_by_xpath('.//div[@class="departure"]/time').get_attribute('datetime')
    
    # obtener hora de llegada
    hora_llegada = vuelo.find_element_by_xpath('.//div[@class="arrival"]/time').get_attribute('datetime')
    
    # duración del vuelo
    duracion = vuelo.find_element_by_xpath('.//span[@class="duration"]/time').get_attribute('datetime')
    duracion_vuelo = duracion.replace('PT', '').replace('H', 'h ').replace('M', 'min ')
    
    schedules = {
        'hora_salida':hora_salida,
        'hora_llegada':hora_llegada,
        'duracion_vuelo':duracion_vuelo
    }
    tiempos.append(schedules)
    
    return tiempos

Para el vuelo:

def get_times(flight):
    '''
    Returns a dictionary with times of the flight
    '''
    time_start = flight.find_element_by_xpath('.//div[@class="time"]').text
    time_end = flight.find_element_by_xpath('.//div[@class="location" and position()>1]')
    t_end = time_end.find_element_by_xpath('.//div[@class="time"]').text
    duration = flight.find_element_by_xpath('.//div[@class="duration"]').text
    times= {
        'time_start':time_start,
        'time_end':t_end,
        'duration':duration,
    }
    return times

Para cada vuelo:

def get_times_flights():
    '''
    Returns a list with times of each flight
    '''
    times_flights=[]
    flights = driver.find_elements_by_xpath('//div[@class="flight"]')
    for flight in flights:
        time_start = flight.find_element_by_xpath('.//div[@class="time"]').text
        time_end = flight.find_element_by_xpath('.//div[@class="location" and position()>1]')
        t_end = time_end.find_element_by_xpath('.//div[@class="time"]').text
        duration = flight.find_element_by_xpath('.//div[@class="duration"]').text
        times= {
            'time_start':time_start,
            'time_end':t_end,
            'duration':duration,
        }
        times_flights.append(times)
    return times_flights

hola alguien me podría ayudar para seleccionar el número de vuelo? no entiendo porque no funciona pero las páginas tienen clases que se repiten. Intente generar una lista pero no lo selecciona 😦

```<code>

#Número de vuelo
segmento.find_element_by_xpath(’.//div[@class=“airline-flight-details”]/b’)

<code>