Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Construyendo la función para unificar el scraper

17/30
Recursos

Aportes 12

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

super clase, aprendi mucho, y sufrí cambio muchas class, pero gracias 💪


def obtener_precios(vuelo):
    '''
    Función quye retorna una lista de diccionarios con las distintas tarifas
    '''
    tarifas=vuelo.find_elements_by_xpath('.//div[@class="fares-table-container"]//tfoot//td[contains(@class, "fare-")]')
    precios=[]
    for tarifa in tarifas:
        nombre=tarifa.find_element_by_xpath('.//label').get_attribute('for')
        moneda=tarifa.find_element_by_xpath('.//span[@class="price"]/span[@class="currency-symbol"]').text
        valor =tarifa.find_element_by_xpath('.//span[@class="price"]/span[@class="value"]').text
        dict_tarifa={nombre:{'moneda':moneda,'valor':valor}}
        precios.append(dict_tarifa)
        print(dict_tarifa)
    return precios


def obtener_datos_escalas(vuelo):
    '''
    Función  que retorna una lista de diccionarios 
    con las información de las escalas de cada vuelo
    '''
    segmentos=vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg bOhNnO"]/div[@class="sc-cLQEGU hyoued"]')
    info_escalas = []
    for segmento in segmentos:
        origen=segmento.find_elements_by_xpath('.//div[@class="sc-iujRgT jEtESl"]//abbr[@class="sc-hrWEMg hlCkST"]')[0].text
        hra_salida=segmento.find_elements_by_xpath('.//div[@class="sc-iujRgT jEtESl"]//time')[0].get_attribute('datetime')
        destino=segmento.find_elements_by_xpath('.//div[@class="sc-iujRgT jEtESl"]//abbr[@class="sc-hrWEMg hlCkST"]')[1].text
        hra_llegad=segmento.find_elements_by_xpath('.//div[@class="sc-iujRgT jEtESl"]//time')[1].get_attribute('datetime')
        duracion=segmento.find_element_by_xpath('.//span[@class="sc-cmthru ipcOEH"]//time').get_attribute('datetime')
        num_vuelo=segmento.find_element_by_xpath('.//div[@class="sc-hMFtBS dhxqHN"]//b').text
        mod_avion=segmento.find_element_by_xpath('.//div[@class="sc-hMFtBS dhxqHN"]//span[@class="sc-gzOgki uTyOl"]').text
        
        data_dict={
            'origen':origen,
            'hr_salida':hra_salida,
            'destino':destino,
            'hra-llegada':hra_salida,
            'duracion':duracion,
            'num_vuelo':num_vuelo,
            'mod_avion':mod_avion
        }
        info_escalas.append(data_dict)
        
    return info_escalas


def obtener_tiempos(vuelo):
    '''
    Función que retorna un diccionario con los horarios de salida y llegada de cada
    vuelo, incluyendo la duración. 
    Nota: la duración del vuelo no es la hora de llegada - la hora de salida porque
    puede haber diferencia de horarios entre el origen y el destino.
    '''
    # Hora de salida
    salida = vuelo.find_element_by_xpath('.//div[@class="departure"]/time').get_attribute('datetime')
    
    # Hora de llegada
    llegada =  vuelo.find_element_by_xpath('.//div[@class="arrival"]/time').get_attribute('datetime')
    
    # Duracion
    duracion = vuelo.find_element_by_xpath('.//span[@class="duration"]/time').get_attribute('datetime')
    
    tiempos = {'hora_salida': salida, 'hora_llegada': llegada, 'duracion': duracion}
    return tiempos


def obtener_info(driver):
    #cerrar ventana emergente innecesaria que impide siguiente paso
    driver.find_element_by_xpath('//div[@class="tooltip-container sc-kUaPvJ ikSqYE"]//button[@class="close"]').click()
    
    
    vuelos=driver.find_elements_by_xpath('//li[@class="flight"]')
    print(f'Se encontraron{len(vuelos)} vuelos.')
    print('iniciando Scraping...')
    info=[]
    
    for vuelo in vuelos:
        #obtener tiempo generales
        tiempos=obtener_tiempos(vuelo)
        #clickeamos sobre el b oton de las escalas
        vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]/button').click()
        escalas=obtener_datos_escalas(vuelo)
        #cerramos el modelos
        driver.find_element_by_xpath('//div[@class="modal-content sc-iwsKbI eHVGAN"]//button[@class="close"]').click()
        #clickeamos el vuelo para ver los precios
        vuelo.click()
        precios=obtener_precios(vuelo)
        vuelo.click()
        info.append({'precios':precios,'tiempo':tiempos, 'escalas':escalas})
    return info
        

url='https://www.latam.com/pt_br/apps/personas/booking?fecha1_dia=01&fecha1_anomes=2020-09&from_city1=GRU&to_city1=LIS&ida_vuelta=ida_vuelta&fecha2_dia=11&fecha2_anomes=2020-09&from_city2=LIS&to_city2=GRU&cabina=Y&nadults=1&nchildren=0&ninfants=0&app=deal-finder#/'


options=webdriver.ChromeOptions()
options.add_argument('--incognito')
driver=webdriver.Chrome(executable_path='./chromedriver', options=options)


driver.get(url)

obtener_info(driver)


Como comentario, tuve que agregar un time.sleep de 0.5 seg antes de abrir el modal de las escalas, supongo que debido a la animación de la ventana de precios de la sección anterior me estaba generando un error, con eso lo solucioné.

Les comparto la función que no requiere tiempos de espera y funciona al 26-junio-2021, las funciones de cada sección están en la lección anterior

Tuve que colocar varios:

time.sleep(0.5)

no olvidar importar:

import time

para poder hacer uso.

Si alguien tiene problemas con cerrar el modal de las escalas, quizás esto le sirva (cambiando el class):

yo use sleep ya que lo habia aprendido en cursos anteriores aqui en platzi use 15 segundo despues del get url y antes de los ciclos tambien

Mi código quedo de la siguiente manera al día 9/12/2021:
Nota: para mí fue muy importante importar la librería time para que mi código corriera adecuadamente:

import time

def obtener_info(driver):
    vuelos = driver.find_elements_by_xpath('//li[@class="sc-eAudoH rtrCi"]')
    print(f'Se encontraron {len(vuelos)} vuelos.')
    print('Iniciando scraping...')
    info = []
    for vuelo in vuelos:
        #obtenemos los tiempos generales de cada vuelo
        tiempos = obtener_tiempos(vuelo)
        # Clickeamos sobre el boton de las escalas
        vuelo.find_element_by_xpath('.//div[@class="sc-blIhvV cUAiPA"]/a').click()
        time.sleep(0.5)
        escalas = obtener_datos_escalas(vuelo)
        # Obtenemos información de duración de las escalas:
        escalas_duracion = escalas_info(vuelo)
        # Cerramos el modal
        driver.find_element_by_xpath('//div[@class="MuiPaper-root MuiDialog-paper MuiDialog-paperScrollPaper MuiDialog-paperWidthFalse MuiPaper-elevation24 MuiPaper-rounded"]/button[@class="MuiButtonBase-root MuiIconButton-root sc-fAjcbJ dxeORj"]').click()
        # Clickeamos el vuelo para ver los precios
        vuelo.find_element_by_xpath('.//div[@class="sc-fdQOMr ibkvFX"]').click()
        time.sleep(0.5)
        precios = obtener_precios(vuelo)
        # Clickeamos el vuelo para cerrar la pestaña de precios y pasar al siguiente ciclo
        vuelo.find_element_by_xpath('.//button[@class="MuiButtonBase-root MuiButton-root MuiButton-text xp-Button-null MuiButton-textSizeSmall MuiButton-sizeSmall MuiButton-disableElevation"]').click()
        time.sleep(0.5)
        # Añadimos el diccionario a nuestra lissta definida anteriormente:
        info.append({'precios':precios, 'tiempos': tiempos, 'escalas':escalas, 'duracion de escalas': escalas_duracion})
    return info

# Nota: Es muy importante colocar timesleep() después del click para que el navegador responda.

Hola, pasaron cosas y el codigo del profe quedo viejito, la función final a mi me quedo asi:
Asegurense del q resto de funciones les andes UwU
e **import time ** al principio

def obtener_info(driver):
    vuelos = driver.find_elements_by_xpath('//li[@class="flight"]')
    print(f'Se encontraron {len(vuelos)} vuelos.')
    print('Iniciando scraping...')
    info = []
    counter = 1
    for vuelo in vuelos:
        # Obtenemos los tiempos generales del vuelo
        tiempos = obtener_tiempos(vuelo)
        # Clickeamos el botón de escalas para ver los detalles
        vuelo.find_element_by_xpath('(//div[@class="flight-summary-stops-description"])[%d]//button[@class="sc-bdVaJa fuucJY"]'%counter).click()
        escalas = obtener_datos_escalas(vuelo)
        # Cerramos el pop-up con los detalles
        vuelo.find_element_by_xpath('//div[@class="modal-header sc-dnqmqq cGfTsx"]//button[@class="close"]').click()
        # Clickeamos el vuelo para ver los precios
        vuelo.click()
        time.sleep(0.5)
        precios = obtener_precio(vuelo)
        info.append({'precios':precios, 'tiempos':tiempos, 'escalas': escalas})
        counter += 1
    return info

driver.close()
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
driver = webdriver.Chrome(executable_path="/chromedriver.exe", options=options)
driver.get(url)
time.sleep(10)
news_tab = driver.find_element_by_xpath('//div[@id="normal-slidedown"]')
news_tab.find_element_by_tag_name('button').click()
data = obtener_info(driver)

salute

Este curso esta repoderoso, tiene muchisima información y apenas vamos en la mitad… Estoy gratamente sorprendido 😄

¿Alguien tiene problemas al scrapear precios de amazon? request encuentra precios que no están en la página a simple vista

Todo en uno:

options = webdriver.ChromeOptions()
options.add_argument('--incognito')
driver = webdriver.Chrome(executable_path='../chromedriver', options=options)
driver.get(url)
time.sleep(5)
# cerrar ventanas emergentes
driver.find_element_by_xpath('.//div[@class="slidedown-footer"]/button[@class="align-right secondary slidedown-button"]').click()
obtener_info(driver)

Es posible que al ejecutar su código este se interrumpa por las ventanas emergentes que genera la página, en las que solicitan autorización para enviar correos y demás. Las siguientes líneas de código cerrarán estas dos ventanas:

driver.find_element_by_xpath('//div[@class="onesignal-slidedown-dialog"]//div[@class="slidedown-footer"]//button[@class="align-right secondary slidedown-button"]').click()
    driver.find_element_by_xpath('//div[@class="lightbox-container"]//div[@class="lightbox-top"]/span[@class="close"]').click()```