Al día de hoy las clases son:
- sc-hZSUBg gfeULV
- sc-cLQEGU hyoued
segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU hyoued"]')
Scrapy, Tesseracts y Proxies
Introducción, definiciones y ética
Introducción y definiciones
Ética y Legalidad
Configuración del entorno de trabajo con Jupyter
HTML: Requests y BeautifulSoup
Descargando una página web
Parseando HTML con BeautifulSoup
Extrayendo información
Manejo de errores
Descargando contenido
Contenido multimedia
Unificando el scraper
Scraping JavaScript con Selenium
Instalación y configuración de Selenium
Sitios dinámicos y Selenium
Selección de elementos
Interactuando con los elementos
Scrapeando escalas y tarifas
Construyendo Funciones
Construyendo la función para unificar el scraper
Demoras dinámicas
Comentarios finales
APIs
Introducción a APIs
Utilizando APIs: Construir una URL
Utilizando APIs: Tokens y Búsqueda
Obteniendo la discografía
Obteniendo los albums
Fin del proyecto + bonus
Scrapy, Tesseract y Proxies
Scrapy
Ejecutando el scraper con scrapy
Proxies
Tesseract
Conclusión y cierre del curso
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. Aprovecha el precio especial.
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Martín Sokolowicz
Aportes 43
Preguntas 8
Al día de hoy las clases son:
segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU hyoued"]')
Esto parece magia, me motiva este tema 😄
si alguno tuvo problemas que no le figuraban los nombres de las clases como los menciona Martin, buscar en el codigo el nombre, al parecer los actualizaron.
En el mio funciono este:
boton_escalas=vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]/button')
boton_escalas.click()
##aca prestar atencion a los nombres de las calses, los cambiaron
segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg bOhNnO"]/div[@class="sc-cLQEGU hyoued"]')
segmentos
escalas = len(segmentos) - 1
escalas```
ACTUALIZACIJÓN MARZO
river = webdriver.Chrome()
driver.get(url)
boton_escalas = driver.find_element(By.XPATH, '//a [@id="itinerary-modal-0-dialog-open"]')
boton_escalas.click()
Si están usando Selenium 4, es posible que “find_element_by_xpath” muestre un “deprecated warning”. De esta forma pueden evitar ese warning:
from selenium.webdriver.common.by import By
vuelos = driver.find_element(by=By.XPATH, value='su_xpath')
En la página donde intento hacer este ejercicio, los DIV no tienen clase y esto no me ha permitido continuar con el ejercicio.
Ayuda !
segmentos = driver.find_elements(by=By.XPATH, value='//section[@data-test="section-info-leg"]')
Si tuvieron problemas con el código de los segmentos, este es el código con las actualizaciones (hasta hoy) de la página de Latam. Espero les sirva.
segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU hyoued"]')
segmentos
Anotaciones y Ejercicios Curso de Web Scraping - Modulo I
Te dejo 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 ✌⭐)
Algunos datos a los cuales queremos acceder se encuentran dentro de otro link o al darle clic en un enlace, ejemplo un modal dentro de la pagina. Para esto debemos usar selenium donde le indicaremos o donde le daremos ese clic.
Realizamos la ruta del botón de escalas
boton_escalas = vuelo.find_element_by_xpath('//div[@class="flight-summary-stops-description"]/button')
boton_escalas
<selenium.webdriver.remote.webelement.WebElement (session="f0d01af0f1c79510eb9c5ec81bc44761", element="15479a9d-8078-47d9-8e60-96e9d7282c71")>
Para dar clic en el botón ya identificado solo ejecutamos el método .click()
boton_escalas.click()
Automáticamente nos abre el menú de itenerario de vuelo
Ya abierto el modal. Realizamos la ruta para identificar la cantidad de escalas del vuelo. En este caso le quitamos el punto para buscar en toda la web.
‘elements’ es en plural porque traeremos varios elementos. Y cuando imprimimos segmentos nos traerá los tramos del vuelo.
segmentos = vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div[@class="sc-cLQEGU hyoued"]')
segmentos
[<selenium.webdriver.remote.webelement.WebElement (session="f0d01af0f1c79510eb9c5ec81bc44761", element="0f5c204d-0940-4470-8edc-e592d0c35a53")>,
<selenium.webdriver.remote.webelement.WebElement (session="f0d01af0f1c79510eb9c5ec81bc44761", element="2a025999-cd97-4ced-bb73-776093229228")>,
<selenium.webdriver.remote.webelement.WebElement (session="f0d01af0f1c79510eb9c5ec81bc44761", element="31a1563e-472e-4d94-9c0b-42a6d965b41b")>]
Para la cantidad de escalas podemos contar los tramos y restar 1 y obtendremos la cantidad de escalas para el vuelo scrapeado.
escalas = len(segmentos) - 1
escalas
Ya que las paginas cambian constantemente, la clase ya no es la del video, entonces utilice el xpath que me lleve al button sin necesidad de usar la clase.
button_escalas = vuelo.find_element_by_xpath("./div/div/div/div[2]/button")
Para los que les da error al hacer click, estoy usando wsl de windows y me salio error . Pueden usar esto
driver.execute_script("arguments[0].click();", boton_escalas)
19/08/23 reto
<code>
inf=vuelo.find_elements_by_xpath('.//div[@class="card-flightstyle__ContainerFlightInfo-sc__sc-16r5pdw-15 ewHafW flight-information"]')
inf
inf=vuelo.find_elements_by_xpath('.//div[@class="card-flightstyle__ContainerFlightInfo-sc__sc-16r5pdw-15 ewHafW flight-information"]')
inf
[<selenium.webdriver.remote.webelement.WebElement (session="ea05b97804add61a7bf72c013618c57e", element="5611D6FA00F7D3035ACB67349E0E276A_element_700")>,
<selenium.webdriver.remote.webelement.WebElement (session="ea05b97804add61a7bf72c013618c57e", element="5611D6FA00F7D3035ACB67349E0E276A_element_701")>]
dep=inf[0]
arr=inf[1]
dep
<selenium.webdriver.remote.webelement.WebElement (session="ea05b97804add61a7bf72c013618c57e", element="5611D6FA00F7D3035ACB67349E0E276A_element_700")>
arr
<selenium.webdriver.remote.webelement.WebElement (session="ea05b97804add61a7bf72c013618c57e", element="5611D6FA00F7D3035ACB67349E0E276A_element_701")>
#departure time
dep_time=dep.find_element_by_xpath('./span[@class="card-flightstyle__TextHourFlight-sc__sc-16r5pdw-18 kKmcWo"]').text
dep_time
'12:25 a. m.'
#fligth origin
dep_site=dep.find_element_by_xpath('./span[@class="card-flightstyle__TextIATA-sc__sc-16r5pdw-19 ksoviQ"]').text
dep_site
'CUN'
#estimated fligth duration [0]
dur=vuelo.find_element_by_xpath('.//span[@class="card-flightstyle__TextTotalTimeFlight-sc__sc-16r5pdw-20 fuxJTD" ] ').text
dur
'13 h 30 min'
arr_time=arr.find_element_by_xpath('.//span[@class="card-flightstyle__TextHourFlight-sc__sc-16r5pdw-18 kKmcWo"]').text
arr_time
'3:55 p. m.'
arr_site=arr.find_element_by_xpath('./span[@class="card-flightstyle__TextIATA-sc__sc-16r5pdw-19 ksoviQ"]').text
arr_site
'AEP'
Aqui está mi version de la parte de los segmentos
segmentos = vuelo.find_elements(by=By.XPATH,value ='//article[@class="itinerarystyle__Wrapper-sc__sc-1n97ky6-0 hfhDJj"]/div/section')
segmentos
Aquí dejo mi version, que funciona para el vuelo seleccionado en la clase anterior
boton_escalas = vuelo.find_element(By.XPATH,'.//div[@class="card-flightstyle__ContainerFooterCard-sc__sc-16r5pdw-24 iMBDQD"]/a')
boton_escalas.click()```
a fecha del 04/09/2020 el primer div sigue siendo sc-hZSUBg gfeULV y el segundo sc-cLQEGU hyoued
Hoy 06.01.2023
boton_escalas = primervuelo.find_elements(by=By.XPATH, value='.//a[@class="sc-gzVnrw fXIzxI"]')[0]
boton_escalas
Al día de hoy:
Boton:
boton_escalas = vuelo.find_element(by = By.XPATH, value = ‘//div[@id = “ContainerFooterCard0”]/a’)
Segmentos:
segmentos = vuelo.find_elements(by = By.XPATH, value = ‘//article[@class = “sc-kyCyAI eyGAeO”]/div/section[@data-test = “section-info-leg”]’)
boton_escalas = vuelo.find_element(by=By.XPATH, value = './/div[@class = "sc-lhLRcH frITtA"]/a')
boton_escalas
boton_escalas.click()
segmentos = vuelo.find_elements(by=By.XPATH, value = '//div[@class = "MuiDialogContent-root sc-fjdhpX jvVjjf"]//section[@class = "sc-fEVUGC gIelIH"]')
segmentos
escalas = len(segmentos) - 1
escalas
Bueno mi aporte al 29 de Octubre de 2022, tengan en cuenta que hasta este punto cambio bastante, así que les dejo mi código para los segmentos.
# Segmentos de la escala
segmentos = vuelo.find_elements(by=By.XPATH,value='//article/div/section/div')
segmentos
Para hoy 22 02 2022
Este es el código valido
segmentos = vuelo.find_elements(By.XPATH, '//div[@class="sc-cMhqgX foSIcH"]/div[@class="sc-iuJeZd ksIjax"]')
<python>
vuelos = driver.find_elements_by_xpath('//li[@class="sc-eAudoH rtrCi"]')
vuelo = vuelos[0].find_element_by_xpath('.//div[@class="sc-izvnbC eqFECQ flight-information"]/span[1][@class="sc-gMcBNU gwIRwm"]')
vuelo.text
# Close Chrome window
driver.close()
</python>
Al día de hoy el código es (21/09/2021):
boton_escalas = vuelo.find_element_by_xpath('.//itinerary-element[@class="stops -hover-pointer"]')
boton_escalas
segmentos = vuelo.find_elements_by_xpath('//div[@id="detail-container"]//div[@class="detail-component"]')
segmentos
Función para obtener la info de todos los vuelos seleccionados
def itinerario_vuelo(vuelo):
escalas = []
# Se da click sobre el enlace de escalas
boton_escalas = vuelo.find_element_by_xpath('.//div[contains(@class,"eMunVf")]/a')
boton_escalas.click()
time.sleep(0.5)
secciones = vuelo.find_elements_by_xpath('//section[@data-test="section-info-leg"]')
for seccion in secciones:
escalas.append(seccion.find_element_by_xpath('//div[contains(@class, "airline-wrapper")]').text)
time.sleep(0.5)
# Se cierra la ventana emergente
boton_escalas_close = vuelo.find_element_by_xpath('//div[@role="dialog"]/button')
boton_escalas_close.click()
return escalas
Julio 2021, Hasta esta clase, los nodos de la pag de LATAM sigue siendo los mismos usados por el prof.
Al día de hoy:
boton_escalas = vuelo.find_element_by_xpath('.//div[@class="sc-gJqsIT egdVkV"]/a')
segmentos = vuelo.find_elements_by_xpath('//section[@data-test="section-info-leg"]')
Muy chevere el curso, pero como que se les olvida que algunos estamos desde windows y que todo es simplemente diferente.
ayuda por favor!!, al cargar la página me sale un popup que dice "un nuevo mundo.
una nueva forma de volar."
cómo puedo cerrarlo usando selenium, no veo ningún botón de cerrar. solo un span[class=“close”] que al paracer no es clickeable.
Necesito de su ayuda comunidad. Cómo puedes acceder al elemento donde introduces el usuario en la siguiente página: https://forcebeatcolombia.enel.com/geocallcod/
Lo he intentado todo sin mucho éxito. Mi idea es usar selenium para automatizar el login de la página. Les estaría muy agradecido mi Twitter es @luiscarlospxr
Para los que tuvieron un problema similar. Usando exactamente el código como lo usaba el profesor no pude acceder a la pantalla con las escalas, solo hay que hacer unos ajustes de acuerdo a como esté el código html.
En mi caso, el botón para las escalas estaba referenciado como
<span class="connection-message" style="">
De esta forma, en mi caso, el código quedó de la siguiente forma
boton_escalas = vuelo.find_element_by_xpath('.//span[@class="connection-message"]')
Para actualizar un poco, en el apartado de obtener las escalas, en el sitio web de latam ya no aparecen las clases ‘segments-graph’ y ‘segments-graph-segment’. Ahora aparecen clases acortadas que son ‘difíciles’ de ubicar, un como me aparecieron a mi fue ‘sc-epnACN’ y ‘fVwNvS’ respectivamente.
Super clases. 💪```
boton_escalas=vuelo.find_element_by_xpath('.//div[@class="flight-summary-stops-description"]/button')
boton_escalas
boton_escalas.click()
segmentos=vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg bOhNnO"]/div[@class="sc-cLQEGU hyoued"]')
segmentos
Hola, tengo una pregunta. ¿Por qué los elementos de una lista me los retorna en desorden ? Por ejemplo en la página de Latam vemos un lista de vuelos, pero cuando intento acceder al vuelo[2] por ejemplo me retorna el último.
Etiquetas actualizadas :
segmentos = vuelo.find_elements_by_xpath('//div [@class="sc-hZSUBg jmgyeh"]/div [@class="sc-cLQEGU hyoued"]')
Imprimir las rutas de cada trayecto
rutas = vuelo.find_elements_by_xpath('//abbr[@class = "sc-hrWEMg hlCkST"]')
for i in range(0,len(rutas),2):
print(f'De {rutas[i].text} a {rutas[i+1].text}')
Resultado:
De BOG a GRU
De GRU a LIS
De LIS a MAD
esta es otra forma de hacerlo y ayuda a muchos que escribieron que el sitio tiene otras clases diferentes
segmentos = vuelo.find_elements_by_xpath('//div[contains(@class, "sc-hZSUBg")]/div[contains(@class, "sc-cLQEGU")]')
Para cerrar el cuadro de diálogo del itinerario de vuelo:
cerrar_escalas = vuelo.find_element_by_xpath('//button[@class="close"]/i[@class="icon-int-close"]')
cerrar_escalas.click()
Totalmente atorado en esta clase. Las clases que me figuran a mi son bastante más simples que las que veo en comentarios. Aún así no llego a ningún lado. Debería ser fácil encontrar la ruta con xpath, pero ahora el programa no para de tirarme errores.
Para cumplir el reto use el siguiente código:
vuelos = wd.find_elements_by_xpath('//li/div/div/div[@class="sc-yZwTr lklTPR"]')
vuelo = vuelos[0]
datos = vuelo.find_elements_by_xpath('./div/div[@class="sc-fjhmcy dbJOiq flight-information"]/span[@class="sc-lnmtFM ewiHQE"]')
print(salida)
salida = datos[0].text
llegada = datos[1].text
duracion = vuelo.find_element_by_xpath('./div/div[@class="sc-fjhmcy dbJOiq flight-duration"]/span[@class="sc-FQuPU dkpBdw"]').text
Pero creo que las clases se generan automáticamente entonces no serviría para generalizar las búsquedas.
interesante
xpath a la fecha de hoy
vuelo.find_elements_by_xpath('//div[@class="sc-hZSUBg gfeULV"]/div')```
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?