No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende Ingl茅s, Programaci贸n, AI, Ciberseguridad y m谩s a precio especial.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

1 D铆as
11 Hrs
14 Min
33 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 鈥渙btener_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:
[{鈥極igen鈥: 鈥楽alida a las 18 Horas 55 Minutos, de Benito Ju谩rez Intl.鈥,
鈥楧estino 1鈥: 鈥楲legada a las 06 Horas 15 Minutos, a A. Merino Ben铆tez Intl.鈥,
鈥楧uraci贸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=鈥渁irline-flight-details鈥漖/b鈥)

<code>