Introducci贸n a Selenium y Python

    Introducci贸n

    La automatizaci贸n del navegador web est谩 ganando popularidad y han surgido muchos marcos / herramientas para ofrecer servicios de automatizaci贸n a los desarrolladores.

    La automatizaci贸n del navegador web se usa a menudo con fines de prueba en entornos de desarrollo y producci贸n, aunque tambi茅n se usa a menudo para extraer datos de fuentes p煤blicas, an谩lisis y procesamiento de datos.

    Realmente, lo que hagas con la automatizaci贸n depende de ti, sin embargo, solo aseg煤rate de que lo que est谩s haciendo sea legal, ya que los “bots” creados con herramientas de automatizaci贸n a menudo pueden infringir las leyes o los t茅rminos de servicio de un sitio.

    Selenio es una de las herramientas m谩s utilizadas para la automatizaci贸n del navegador web y ofrece una gran cantidad de funciones y poder sobre un navegador.

    Es compatible con muchos lenguajes como C #, Java, Perl, PHP y Ruby, aunque por el bien de este tutorial, lo usaremos con Python en Windows.

    驴Qu茅 es el selenio?

    Selenium es una gran herramienta que permite a los desarrolladores simular usuarios finales con solo unas pocas l铆neas de c贸digo. Con las herramientas que ofrece, es muy f谩cil usar p谩ginas web y simular un ser humano, aunque es dif铆cil replicar el comportamiento humano.

    Para combatir los “bots”, que est谩n destinados a replicar a los humanos, se utilizan muchos sistemas sofisticados para reconocer el comportamiento similar al humano, que es pr谩cticamente imposible de replicar con herramientas de programaci贸n.

    Si est谩 creando una aplicaci贸n con Selenium, aseg煤rese de cumplir con todas las leyes asociadas con la Automatizaci贸n del navegador web, o simplemente util铆cela con fines de prueba en su propio entorno de producci贸n.

    Algunas de las tareas m谩s populares que se realizan con Selenium incluyen, entre otras:

    • Hacer clic en los botones
    • Ingresando texto
    • Extrayendo texto
    • Acceso a cookies
    • Pulsando teclas

    Prerrequisitos

    Antes de comenzar, tendremos que hacer algunas cosas para configurar:

    • Instalar Google Chrome en tu computadora: simularemos un usuario en Google Chrome, aunque podr铆as simular otros navegadores, pero para este art铆culo usar茅 Google Chrome.
    • Obtener chromedriver.exe, porque para simular realmente el navegador, necesitar谩 una ruta a este ejecutable en su computadora.
    • Instala el paquete de selenio utilizando pip install selenium en la l铆nea de comando.

    Los basicos

    Muy bien, ahora estamos listos para comenzar a trabajar con Selenium. Lo primero que deber谩 hacer es iniciar el navegador:

    from selenium import webdriver
    
    EXE_PATH = r'pathtochromedriver.exe'
    driver = webdriver.Chrome(executable_path=EXE_PATH)
    driver.get('https://google.com')
    

    Ejecutar esto abrir谩 Google Chrome y lo navegar谩 a https://google.com.

    Aqu铆, es importante tener en cuenta que la conexi贸n a la p谩gina web se realiza con el get(URL) funci贸n de la driver objeto.

    Como habr谩s notado, el driver es el selenio WebDriver objeto, lo usa para acceder al navegador mediante programaci贸n, por ejemplo:

    print(driver.page_source)
    

    El c贸digo anterior imprime el c贸digo HTML fuente de toda la p谩gina. Si necesita recopilar datos, esto es muy 煤til.

    Elementos de localizaci贸n

    Por lo general, no necesita el contenido de una p谩gina completa, sino elementos espec铆ficos.

    Para hacerlo, primero deber谩 detectar su objetivo en la p谩gina, y para eso puede usar el Inspeccionar elemento herramienta en Google Chrome.

    Eso significa que si necesita el contenido de un determinado elemento en la p谩gina, para obtener el ID de las etiquetas puede hacer lo siguiente (en una sesi贸n regular de Google Chome):

    • Haga clic derecho en el elemento
    • Elija “Inspeccionar”
    • Y en la nueva ventana, puede echar un vistazo al HTML del elemento y la ID estar谩 despu茅s id=.

    Al obtener los elementos que necesitamos, podemos realizar diferentes tipos de operaciones sobre ellos.

    Obtener elementos por ID

    Si tiene un ID exacto del elemento que est谩 buscando, es f谩cil recuperarlo:

    element = driver.find_element_by_id('element_id')
    

    Obtener elementos por nombre

    Similar al enfoque anterior:

    element = driver.find_element_by_name('element_name')
    

    Obtener elementos por clase

    Y nuevamente, similar al enfoque anterior:

    element = driver.find_element_by_class_name('element_class_name')
    

    Obtener elementos por etiqueta HTML

    En algunos casos, es posible que desee obtener todos los elementos mediante una etiqueta determinada:

    links = driver.find_elements_by_tag_name('a')
    

    En este caso, links est谩 poblado con todos a etiquetas, que ahora contiene cada enlace de la p谩gina. Esto puede resultar 煤til para el rastreo web.

    Obtener elementos mediante XPath

    No todos los elementos tienen una ID, o tal vez no desee acceder a todos a Etiqueta HTML. Hay otras formas de recuperar un elemento muy espec铆fico, como XPath, que es otra forma de recuperar elementos. Con XPath, puede encontrar elementos de manera m谩s f谩cil y eficiente:

    tag_list = driver.find_elements_by_xpath("//tag[@attr="val"]")
    

    tag_list ahora contiene cada uno tag que tiene y atributo attr ajustado a val:

    <tag attr="val">Foo</tag>
    

    Ahora puedes iterar tag_list, e interactuar con cada selenio WebElement en eso.

    Puede leer m谩s sobre el sistema XPath en Selenium Aqu铆.

    WebElement de selenio

    Un selenio WebElement pr谩cticamente representa un elemento HTML. Puede realizar operaciones en estos elementos de forma similar a como lo har铆a como usuario final.

    Estas operaciones incluyen:

    • Accediendo a propiedades simples del elemento, como el texto dentro (element.text)
    • Accediendo a elementos padres, que tambi茅n son de tipo WebElement (element.parent)
    • Acceder a atributos espec铆ficos, como el href de un a etiquetaelement.get_attribute('href'))
    • Buscando dentro de 茅l (de la misma manera que buscar铆as en driver)
    • Haciendo clic en 茅l (element.click())
    • Ingresando texto si es posible (element.send_keys(鈥業nput Text'))

    Selenium WebDriver

    WebDriver es parecido a WebElementsin embargo, la principal diferencia es su alcance. El alcance de este 煤ltimo es el elemento en s铆, mientras que el alcance del primero es la p谩gina completa.

    Puedes hacer muchas cosas con Selenium WebDriver tambi茅n, pr谩cticamente cualquier cosa que puedas hacer como humano con un navegador normal.

    Algunas otras cosas muy 煤tiles son:

    • Ejecutando JavaScript: driver.execute_script("script")
    • Guardar una captura de pantalla: driver.save_screenshot('image.png')
    • Inicie en “modo sin cabeza”, donde el navegador ahorra tiempo al no mostrar la p谩gina:
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.headless = True
    driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)
    driver.set_window_size(1440, 900)
    

    Tenga en cuenta que el tama帽o de la ventana se establece en (1440, 900), eso es para prevenir todo tipo de errores relacionados con algunos elementos que no se cargan correctamente debido al modo sin cabeza.

    Puede cambiar la resoluci贸n a cualquier otra resoluci贸n razonablemente grande, pero debe asegurarse de que la resoluci贸n se cambie de los valores predeterminados cuando vaya al modo sin cabeza.

    Acceso a cookies

    Es posible que necesite agregar o eliminar cookies del navegador:

    ck = {'some_attr': 'foo', 'some_other_attr': 'bar'}
    driver.add_cookie(ck)
    

    Esto agrega una cookie al navegador, lo que puede ser 煤til si necesita agregar autenticaci贸n o cookies de preferencia, por ejemplo. Es importante asegurarse de que la cookie est茅 en dict formato.

    Tambi茅n es muy f谩cil recuperar las cookies del navegador:

    cookies = driver.get_cookies()
    for ck in cookies:
        print(ck)
    

    El c贸digo anterior imprime cada cookie en el navegador.

    Alterando el HTML

    A veces, es posible que necesite cambiar la propiedad de un elemento determinado.

    Como se mencion贸 anteriormente, puede usar Selenium WebDriver para ejecutar JavaScript, y cambiar las propiedades de los elementos es muy f谩cil de hacer con JavaScript:

    driver.execute_script("arguments[0].setAttribute('attr','value')", element)
    

    Aqu铆 element es el elemento a alterar, attr es el atributo a cambiar y value es el nuevo valor.

    A veces, es posible que deba descargar un archivo de un sitio web:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    
    options = Options()
    options.add_experimental_option("prefs", {
        "download.default_directory": r"pathtodirectory",
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "safebrowsing.enabled": True
    })
    
    driver = webdriver.Chrome(executable_path=EXE_PATH, chrome_options=options)
    

    Puede especificar la ruta de la ubicaci贸n de guardado definiendo download.default_directory, como pathtodirectory.

    Pulsando teclas

    import time
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.keys import Keys
    
    action = ActionChains(driver)
    for _ in range(3):
        action.send_keys(Keys.ARROW_DOWN)
        time.sleep(.1)
    action.perform()
    

    Este c贸digo presiona la flecha hacia abajo (Keys.ARROW_DOWN) 3 veces. Despu茅s de cada action.send_keys(Keys.ARROW_DOWN) el programa espera un poco. Esto se recomienda para asegurarse de que se registren todas las claves.

    Si simplemente disparamos varios comandos, es posible que se pierdan en el proceso y no se registren.

    Keys contiene todas las teclas del teclado, lo que significa que tambi茅n puede utilizar este m茅todo para tabular (Keys.TAB) entre los elementos de la p谩gina, lo que facilita la interacci贸n con ella (Keys.RETURN y Keys.SPACE son muy importantes tambi茅n).

    Hacer clic en los botones

    Tenga en cuenta que puede presionar las teclas para navegar entre los elementos de una p谩gina, por ejemplo, puede usar Tabulaciones y Espacios para completar las casillas de verificaci贸n y usar las teclas de flecha para navegar entre los elementos del men煤 desplegable.

    Por supuesto, una forma m谩s natural de seleccionar casillas de verificaci贸n y elementos desplegables ser铆a simplemente recuperar el elemento usando el controlador y hacer clic en 茅l:

    checkbox = driver.find_element_by_id('checkbox')
    checkbox.click()
    

    Ingresando formularios

    Tambi茅n puede simular pulsaciones de teclas dentro de los propios elementos:

    element.send_keys(Keys.CONTROL, 'a')
    element.send_keys(value)
    

    De esta forma, las claves se registran dentro del element, de modo que si desea completar un textarea, podr铆as hacerlo as铆.

    Por cierto, este c贸digo usa un atajo de teclado (CTRL + A) para seleccionar todo el texto dentro del elemento. La siguiente l铆nea reemplaza el texto seleccionado con el value ingres贸.

    Para registrar atajos de teclado, pase todas las teclas deseadas en los par谩metros a send_keys.

    Desplazamiento

    A veces, partes de la p谩gina se cargan solo despu茅s de desplazarse hacia abajo (como un feed de Instagram o cualquier otra p谩gina de desplazamiento infinito). Esto se puede hacer f谩cilmente mediante la ejecuci贸n de un simple script de JavaScript:

    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    

    El c贸digo anterior usa un comando de JavaScript para desplazarse hasta la parte inferior de la p谩gina, ahora puede usar driver.page_source nuevamente y obtenga el nuevo contenido.

    Conclusi贸n

    El selenio es una de las herramientas m谩s utilizadas para la automatizaci贸n del navegador web y ofrece una gran cantidad de funciones y poder sobre un navegador controlado por humanos.

    Se utiliza principalmente para pruebas / automatizaci贸n de entornos de producci贸n o integraci贸n, aunque tambi茅n se puede utilizar como raspador web con fines de investigaci贸n, etc. Aseg煤rese de cumplir con todas las leyes cuando practique el raspado web de contenido p煤blico para no infringir ninguna leyes.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *