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)
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.