Like si estas tomando esta sección del curso durante la cuarentena 2020 y no hay sitios web de aerolíneas para scrappear.
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
Aún no tienes acceso a esta clase
Crea una cuenta y continúa viendo este curso
Aportes 60
Preguntas 22
Like si estas tomando esta sección del curso durante la cuarentena 2020 y no hay sitios web de aerolíneas para scrappear.
si alguién más obtuvo un status code 403: access denied lo resolví así:
agent = {"User-Agent":"Mozilla/5.0"}
r = requests.get(url, headers=agent)
A mi no me funcionó tal como explico el profesor. La forma que encontré de poder abrir el navegador controlable fue:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
Para que les funcione deben primero instalar webdriver-manager así:
pip install webdriver-manager
En firefox lo hice así
from selenium import webdriver
options = webdriver.FirefoxOptions()
options.add_argument("-private")
driver = webdriver.Firefox(executable_path="./geckodriver", options=options)
driver.get(url)
driver.close()
En este vídeo de youtube explican mejor https://www.youtube.com/watch?v=N-rdcdWmYck&list=PLjM3-neCG6qx4RFeq2X-TpWS_tJTk1qZP&index=2
Con la libreria webdriver-manager, pueden descargar automaticamente el ultime driver para chrome y otros, ademas de obtener el path automaticamente.
https://pypi.org/project/webdriver-manager/
import requests
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
driver = webdriver.Chrome(ChromeDriverManager().install()
driver.get(url)```
Para correr selenium en edge en modo incognito hay que instalar otra libreria de selenium
pip install msedge-selenium-tools selenium==3.141
una vez tengamos esta librería la importamos así;
from msedge.selenium_tools import Edge, EdgeOptions
de esta forma la configuración seria la siguiente;
options = EdgeOptions()
options.use_chromium = True
options.add_argument('-inprivate')
driver = Edge(executable_path='C:/Users/<UserSystem>/Downloads/edgedriver/msedgedriver.exe', options=options)
de esta forma correra en modo incognito en edge y las demas instrucciones del driver en adelante tal cual la clase…
quizá les puede ayudar.
Tip: Si haces el request como dice el profe y te sale un status code 403 quiere decir que fue rechazada( busca que es el codigo 403 de HTTP). Esto sucede porque tu User-Agent es el que trae por defecto el modulo requests:
print(response.status_code)
print(response.request.headers)
Te dara como Output:
403
{'User-Agent': 'python-requests/2.24.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
Solo tienes que modificar este Header usando el User-Agent que usa tu navegador, en mi caso es:
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0
Puedes encontrarlo en El inspector de tus dev tools , en el apartado de red.
Para que te funcione solo modificas el header asi:
headers ={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0'
}
response = requests.get(url, headers=headers)
print(response.status_code)
print(response.request.headers)
y te dará un Output así:
200
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
Si quieres entender el porqué modificando el User-Agent si te da un request con código 200, busca para qué funciona.
Después de varias horas de investigar, les dejo las siguientes consideraciones:
Es recomendable que descargues el controlador del explorador que utiliza Jupyter Notebook para hacer launch
Si utilizas Anaconda puedes ahorrarte muchos problemas simplemente yendo a “Environments” e instalar directo selenium
En Safari debes de seguir las instrucciones que vienen en la página web :
Asegúrese de que el menú Desarrollar esté disponible. Se puede activar abriendo las preferencias de Safari (Safari > Preferencias en la barra de menús), yendo a la pestaña Avanzado y asegurándose de que la casilla de verificación Mostrar menú Desarrollar en la barra de menús esté marcada.
Habilitar Automatización Remota en el menú Desarrollar. Esto se hace a través de Desarrollar > Permitir automatización remota en la barra de menús.
Autorizar safaridriver lanzar el servicio webdriverd. Para permitir esto debes ir a la consola y correr:
run /usr/bin/safaridriver --enable
Te pedirá que introduzcas tu contraseña de inicio para dar los permisos necesarios.
from selenium import webdriver
url='https://www.latam.com/es_ar/apps/personas/booking?fecha1_dia=25&fecha1_anomes=2019-10&fecha2_dia=12&fecha2_anomes=2019-11&from_city2=MAD&to_city2=BUE&auAvailability=1&ida_vuelta=ida_vuelta&vuelos_origen=Buenos%20Aires&from_city1=BUE&vuelos_destino=Madrid&to_city1=MAD&flex=1&vuelos_fecha_salida_ddmmaaaa=25/10/2019&vuelos_fecha_regreso_ddmmaaaa=12/11/2019&cabina=Y&nadults=1&nchildren=0&ninfants=0&cod_promo='
driver = webdriver.Safari()
driver.get(url)
No se olviden de poner el .exe en
driver = webdriver.Chrome(executable_path=’…/chromedriver.exe’)
sino les va arrojar error como si fuera un problema de versón del Chromedirver
Para este proyecto de scrapear Latam AirLines, realizamos la requests. Pero como son sitios dinámicos y hacen uso de Javascript, en Jupyter notebook, python no puede procesar este lenguaje y por eso hacemos uso de Selenium
import requests
from bs4 import BeautifulSoup
url = 'https://www.latam.com/es_co/apps/personas/booking?fecha1_dia=11&fecha1_anomes=2021-01&fecha2_dia=25&fecha2_anomes=2021-01&from_city2=JFK&to_city2=MDE&auAvailability=1&ida_vuelta=ida_vuelta&vuelos_origen=Medell%C3%ADn&from_city1=MDE&vuelos_destino=Nueva%20York&to_city1=JFK&flex=1&vuelos_fecha_salida_ddmmaaaa=15/11/2020&vuelos_fecha_regreso_ddmmaaaa=30/11/2020&cabina=Y&nadults=2&nchildren=0&ninfants=1&cod_promo=&stopover_outbound_days=0&stopover_inbound_days=0&application=#/'
agent = {"User-Agent":"Mozilla/5.0"}
r = requests.get(url, headers=agent)
r.status_code
s = BeautifulSoup(r.text, 'lxml')
print(s.prettify())
Hasta acá son accedemos al html pero no a la información que buscamos. Ya que necesitamos de interpretar el Javascript.
Importamos selenium
from selenium import webdriver
Declaramos driver para ejecutar el driver de selenium, pero antes declaramos options y agregamos argumentos, en este caso el argumento para abrir el navegador en modo incógnito.
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
driver = webdriver.Chrome(executable_path='./chromedriver', options=options )
Ejecutamos el driver y le pasamos la url
driver.get(url)
Para cerrar el navegador
drive.close()
Para que hagan sus pruebas en tiempos de cuarentena:
Vuelos de LATAM Airlines
(Válido hasta noviembre de 2020)
Hola, para Julio 2021 si la url de LATAM te genera el cod 403, borra cahé, cookies y escribe:
agent = {“User-Agent”:“Mozilla/5.0”}
r = requests.get(url, headers=agent)
Este dato lo habian pasado en un aporte anterior pero no me funcionaba, solo cuando borré el historial fue que funciono.
Para los que tienen el error de UNICODESCAPE se soluciona poniendo una r antes de el path
en mi caso
r’C:\Users\Carlo\Escritorio\chromedriver.exe’
saludos
Si alguno usa Edge les comparto mi código.
<from selenium import webdriver
#instaciar un driver
URL = 'https://www.latam.com/es_ec/apps/personas/booking?fecha1_dia=17&fecha1_anomes=2020-09&fecha2_dia=31&fecha2_anomes=2020-10&from_city2=MIA&to_city2=UIO&auAvailability=1&ida_vuelta=ida_vuelta&vuelos_origen=Quito&from_city1=UIO&vuelos_destino=Miami&to_city1=MIA&flex=1&vuelos_fecha_salida_ddmmaaaa=17/09/2020&vuelos_fecha_regreso_ddmmaaaa=31/10/2020&cabina=Y&nadults=1&nchildren=0&ninfants=0&cod_promo=&stopover_outbound_days=0&stopover_inbound_days=0#/'
driver = webdriver.Edge(executable_path=r"RUTA DONDE SE ENCUENTRE EL EJECUTABLE QUE DESCARGARON .EXE")
driver.get(URL)>
En Chrome hay que ver la versión del Chrome que tengan instalado antes y descargar el driver de Selenium para esa versión de Chrome. Aviso por las dudas 😛
Cuando ejecuto “from selenium import webdriver” en jupyter notebook me sale error de “ModuleNotFoundError: No module named ‘selenium’” y ya instale selenium
No hay caso. No lo puedo hacer andar. Estoy en ubuntu. Leí varios tutoriales en internet y no tengo suerte. Logro abrir el navegador pero se queda trabado 😕
Asi lo logre despues de semanas buscando la solucion a el Chromedriver driver = webdriver.Chrome(executable_path=r’C:\Program Files (x86)\chromedriver.exe’)
Si están trabajando con WSL este enlace les puede ayudar, al aprecer ya funciona en mi entorno, pero no me abre una ventana con se muestra en el curso, alguien tiene idea?
## Run selenium and chrome driver to scrape data from cloudbytes.dev
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
## Setup chrome options
chrome_options = Options()
chrome_options.add_argument("--headless") # Ensure GUI is off
chrome_options.add_argument("--no-sandbox")
# Set path to chromedriver as per your configuration
webdriver_service = Service("/home/enzo-indra/chromedriver/stable/chromedriver")
# Choose Chrome Browser
browser = webdriver.Chrome('/home/enzo-indra/chromedriver/stable/chromedriver', options=chrome_options)
# Get page
browser.get("https://cloudbytes.dev")
# Extract description from page and print
description = browser.find_element(By.NAME, "description").get_attribute("content")
print(f"{description}")
#Wait for 10 seconds
time.sleep(10)
browser.quit()
Este link me funcionó para descargar los nuevos drivers con chrome
https://chromedriver.chromium.org/downloads
Si estás trabajando en la nube, no podrás acceder al driver que hayas instalado en local desde las máquinas virtuales remotas. Pero hay solución.
Básicamente, debes descargar los drivers en tu máquina virtual y configurarlos para que no muestren la interfaz gráfica del navegador. Te dejo los enlaces de los tutoriales para hacerlo.
Accede acá: https://deepnote.com/@joshzwiebel/Custom-Datasets-with-Selenium-and-XPath-CYA2QRnkTbWQYqDQ2v36KQ
Creo que podrías hacer lo mismo que se hace en Deepnote. Yo no lo he probado aún. Pero te dejo un tutorial (diferente) de alguien que ya le funcionó.
Accede acá: https://stackoverflow.com/questions/51046454/how-can-we-use-selenium-webdriver-in-colab-research-google-com
Cabe recalcar que esto también lo puedes hacer en local para Linux (o WSL) y que, de hecho, podría resultar más eficiente al no usar interfaces gráficas.
Para los que están usando Brave con correr este código debe ser suficiente:
options = Options()
options.binary_location = '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser’
driver_path = '/usr/local/bin/chromedriver/chromedriver’
driver = webdriver.Chrome(options = options, executable_path = driver_path)
Donde /usr/local/bin = donde está el driver
Me salía el siguiente error:
ModuleNotFoundError: No module named 'selenium'
Si te sucede, es probable que estés trabajando desde un entorno virtual en el que ya tengas selenium instalado, sin embargo debes instalarlo tambien antes de acceder a tu entorno virtual.
Si alguien conoce la explicación de ello que nos lo haga saber porfavor! Así entendemos la lógica.
En Windows para usar el ‘executable_path’ hacen referencia a la ruta donde dejen el driver, en mi caso fue esta:
executable_path='C:/Users/jhony/Downloads/edgedriver/msedgedriver.exe'
(edge versión 90)
Esto de selenium es una locura
Yo lo hice de la siguiente manera en Firefox con Ubuntu 20.04. Muestro imagen del codigo y de mis archivos en carpeta.
Me funciono bien con Opera
En opera en lugar del
options.add_argument('--incognito')
se pone private:
options.add_argument('private')
Pues tocara intentar con alguna otra aerolinea porque Latam ya no tiene vuelos =S
Para Ubuntu 18.04, en lenguage Python y con el browser Firefox desde el virtualenvirontment:
1.Descargar el último paquete displonible de geckodriver (https://github.com/mozilla/geckodriver/releases)
2.Descomprimir y desempaquetar el paquete: sudo tar -xvzf geckodriver-v0.27.0-linux64.tar.gz (el paquete obtenido se
llamará “geckodriver”)
3.Dar permisos de ejecución al paquete obtenido: sudo chmod +x geckodriver
4.Mover el paquete dentro de la carpeta de ficheros binarios para que el OS puede ejecutarlos: sudo mv geckodriver /path/venv/bin
5.Escribir en un fichero *.py (en mi caso le he llamado test_selenium.py) lo siguiente:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://www.google.com")
driver.close()
6.Activar el virtual environtment:
cd /path/venv
source venv/bin/activate
7.Ir al path del fichero *.py (test_selenium.py) y ejecutar
python3 test_selenium.py
Estando en 2022 ya no es necesario descargar el webdriver. Dado que excecutable path está deprecated, hay que instalar la librería “webdriver-manager” que te descarga automáticamente el webdriver y te lo guarda en cache.
pip install webdriver-manager
Luego, este es el código para instanciar el webdriver con las opciones:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
options.add_argument('--incognito')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
Para los que están tomando el curso en 2022, de acuerdo a la documentación de Selenium “executable_path” está deprecated. La nueva forma de instanciar un driver es la siguiente (al menos para el caso para Microsoft Edge):
from selenium import webdriver
from selenium.webdriver.edge.service import Service
#Pueden installar webdriver_manager con pip
from webdriver_manager.microsoft import EdgeChromiumDriverManager
#Para abrir Edge en modo incógnito
options = webdriver.EdgeOptions()
options.add_argument('-inprivate')
#Instanciar el driver
driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()),options=options)
Alguien pudo ejecutar esta parte de Selenium en WSL2? 😦 he intentado muchas formas pero me voy en errores, creo qeu algo tiene que ver el GUI pero no estoy seguro, si alguién tiene m’as información agradecería que la compartiera, no me abre una pestaña de chrome.
Este es el ERROR
WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
si lo estan haciendo en windows y les sale el error del PATH, esto me funciono a mi:
Chrome
driver = webdriver.Chrome(executable_path=r’C:\Users\User\chromedriver’)
Firefox
driver = webdriver.Firefox(executable_path=r’C:\Users\User\geckodriver’)
Saludos, si alguien usa Firefox en Linux, a mi me sirvió este método:
Primero instale: geckodriver-autoinstaller
pip install geckodriver-autoinstaller
Y luego usar el siguiente codigo:
from selenium import webdriver
import geckodriver_autoinstaller
geckodriver_autoinstaller.install()
# Check if the current version of geckodriver exists,
# and if it doesn't exist, download it automatically,
# then add geckodriver to path.
driver = webdriver.Firefox()
driver.get(url)
Fecha de este aporte: 22-junio-2021
Para quienes estén usando Windows 10 y usen anaconda. Tuve problemas a con el comando del maestro porque esta usando la versión de 3.9.4 de Python, pero Selenium aún no es compatible de con Python 3.9.
Resolví el problema creando un nuevo ambiente virtual con: el siguiente comando desde la terminal:
conda create -n env_webdriver Python=3.8.10 anaconda
Luego instalé selenium con el comando:
conda install -c conda-forge selenium
Finalmente bajé el driver para Chrome en la versión, de la pagina que dejó el maestro al cambiar a esta unidad:
ChromeDriver 91.0.4472.101
Así el navegador ya puede ser contralado por Python y Selenium.
Por el momento he encontrado esta página:
https://www.vivaair.com/co/en
Solución para problemas con chromedriver en mac :https://www.youtube.com/watch?v=7R5n0sNSza8
Aumento exponencial de los precios!
SI NO LES FUNCIONA
Comprobar que cuando abra Jupyter este se abra en Chrome:
Descargar el driver para poder generar una interfaz con el navegador.
Saber que version de navegador se tiene
Instalar Selenium y webdriver-manager:
Ahora ya se puede volver a trabajar en la Jupyter:
Se coloca los siguientes comandos con los que se abre una nuevo navegador
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
Por si alguien utiliza firefox esta es la manera que me funcionó:
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities[‘marionette’] = True
firefox_capabilities[‘binary’] = 'C:\Users\test\geckodriver.exe’
driver = webdriver.Firefox(capabilities=firefox_capabilities)
Para los que quieran trabajar con Brave, allí les va el código:
driver_path = "C:/ruta/completa/del/chromedriver.exe"
brave_path = "C:/ruta/completa/del/navegador/brave.exe"
option = webdriver.ChromeOptions()
option.binary_location = brave_path
option.add_argument("--incognito")
driver = webdriver.Chrome(executable_path=driver_path, chrome_options=option)
Yo utilizo firefox y la opcion de --incognito no funciona, en su lugar se debe usar -private para obtener el mismo efecto.
Para firefox no funciona --incognito, se debe usar -private
Por otro lado, al traer la pagina de latam me arroja un status_code 403 , alguien sabe como resolverlo?
Latam se declaro en quiebra en estados unidos!!!
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
driver = webdriver.Chrome(executable_path='chromedriver.exe',options=options)
url = '...'
driver.get(url)```
Funciona en MS Edge, recuerden poner el ejecutable en el PATH, también configurar el firewall para que no les bloquee la ventana.
Vengo del 2020 y actualmente no hay vuelos XD, intenté con BOA y Amaszonas por la flexibilización de lo que llaman cuarentena y la estructura es distinta, probé con esta página: ‘https://www.cheapoair.com/’ de momento funciona bien 😃
Hola compañeros para esta clase intenté con tres páginas:
1.- Latam me arrojaba un error 403 es decir, me fue rechazada la conexión todas las veces que intenté.
2.- Aeroméxico que también rechazaba la conexión.
3.- Interjet esta aerolinea sí me funcionó para practicar.
No puedo usar la pagina del ejemplo por coronavirus
A mi solo me funciono de esta manera
PATH = './chromedriver.exe'
options = webdriver.ChromeOptions()
options.add_argument('--incognito')
options.add_argument('disable-extensions')
options.add_argument('--no-sandbox')
driver = webdriver.Chrome(PATH,options = options)
driver.get(url)
me da acceso denegado, como soluciono para seguir el curso?
para acoplar al jupiter
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
En la notebook pueden seleccionar el ejecutable y le dan copy path, y ese es el argumento de executable_path
Es 1 de Enero del 2021 y estoy muy emocionado con aprender Selenium
Para los que les aparece el error “ModuleNotFoundError: No module named ‘selenium’” es por que no han instalado selenium en Anaconda, deben ir a Anaconda Navigator y abrir el CMD.exe promp y ahi pegar el código: conda install -c conda-forge selenium de esta forma correrá el modulo Selenium.
excelente
interesante
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.