Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Sitios dinámicos y Selenium

12/30
Recursos

Aportes 60

Preguntas 22

Ordenar por:

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

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

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 :

  1. 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.

  2. 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.

  3. 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.

  • Regresando a la clase… Cuando estes corriendo el código en Jupyter Notebook desde **Safari **debes hacer estos cambios:
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?

https://cloudbytes.dev/snippets/run-selenium-and-chrome-on-wsl2#step-2-install-latest-chrome-for-linux

## 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

Selenium para Deepnote o Google Colab

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.

Deepnote

Accede acá: https://deepnote.com/@joshzwiebel/Custom-Datasets-with-Selenium-and-XPath-CYA2QRnkTbWQYqDQ2v36KQ

Google Colaboratory

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:

  1. Ir a configuracion
  2. Elegir un navegador web predeterminado
  3. Escoger Google Chrome

Descargar el driver para poder generar una interfaz con el navegador.
Saber que version de navegador se tiene

  1. Se coloca en el navegador about://version
  2. Ir a https://sites.google.com/a/chromium.org/chromedriver/downloads
  3. Descargar el driver que le corresponde
    Asegurarse que el archivo descargado este cargado en la Jupyter y que esta fuera de un archivo comprimido(Zip).

Instalar Selenium y webdriver-manager:

  1. Abrir Anaconda navigator
  2. Abrir CDM.exe Prompt
    Se debe abrir la consola (ventana de fondo negro)
  3. Colocar los siguientes comandos
    pip install selenium
    pip install webdriver-manager
  4. Hacer Enter

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