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()```