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(‘Input 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 *