Proceso RPA en Python para integración de datos

Actualmente, la limpieza e integración de diferentes datos en la empresa se está convirtiendo en el día a día de muchos desarrolladores.

Existen diferentes fuentes y de muy diversas características, como bases de datos relacionales, sistemas de ficheros, plataformas de datos de terceros y datos que vienen directamente de fuentes públicas de internet. Cualquier fuente de datos puede ser de valor en algún punto de nuestra estrategia de datos.

Algunas de las fuentes no siempre están disponibles, pueden pertenecer a terceros y su extracción no siempre puede ser vía conexión ODBC, API ,SFTP. Además de encontrarnos con fuentes que debemos integrar extrayendo desde el origen de datos u obtener el fichero y cargar la información a mano desde una web.

Caso de uso en Apache Digital

Como Consultora de Innovación y Marketing Digital, tratamos con muchos tipos de clientes diferentes y no todos nos ofrecen sus datos de la misma forma.

Hay clientes que, por cuestiones internas, nos facilitan parte de la información en ficheros vía sftp, mientras que otros nos comparten el acceso a una plataforma de reporting, donde los datos se obtienen a mano y de donde necesitamos obtener varias métricas y dimensiones adicionales. 

Esto nos supone un problema, porque el flujo de información que queremos integrar está descoordinado y no automatizado, ya que nos vemos forzados a incluir ficheros a mano; el primer mes podríamos tener un solo fichero, pero, en función de cómo avancen las necesidades del cliente, podríamos tener más.

Para ahorrar horas y automatizar el flujo de datos en el conjunto de nuestro proyecto, crearemos un bot cuyo objetivo es navegar por el buscador, hacer login en la plataforma, descargar el fichero y enviarlo. De este modo, ahorramos tiempo y ganamos en orden, coordinación y eficiencia.

Para automatizar estos procesos, podemos recurrir a procesos RPA o automatización robótica. Existen muchas herramientas para ello como Uipath. En nuestro caso de uso, nos apoyaremos de Selenium, Python y Pythongui como librerías principales para construir nuestro proceso.

  • Selenium Client API de python: Con ella podremos crear tareas que se van a ejecutar en nuestro buscador: como hacer login, descargar un fichero, etc. Selenium es un software que, además, permite realizar pruebas en la web.
  • Pythonautogui: es una librería que nos permite guiar el ratón e interaccionar con elementos del ordenador en función de las coordenadas XY de la pantalla. Esta dependencia nos ayuda mucho para interacciones ocasionales con elementos que se encuentren fuera del buscador.
  • Python: versión 3.8

El proceso debe realizar las siguientes acciones:

  1. Abrir el navegador y acceder a la URL objetivo
  2. Navegar hasta la URL objetivo
  3. Introducir User, Pass y hacer login
  4. Seleccionar los datos de un reporte objetivo y descargarlo en formato .csv
  5. Obtener el fichero y renombrarlo

Exposición del código:

1.Abrir el navegador.

Como paso previo a ordenar a Selenium que abra el navegador, debemos realizar varias configuraciones. La primera es importar Selenium e indicarle la ruta donde tenemos el driver. Nosotros usamos Chrome.

El enlace de descarga es el siguiente:

Importamos Selenium mediante import Selenium y configuraremos el driver del siguiente modo:

Sobre el objeto webdriver de Selenium, buscamos nuestro buscador y le pasamos como variable el path donde se encuentra en nuestro sistema. A continuación, seleccionamos la URL a la que queremos acceder.

2.Navegar hasta la url objetivo:

Ahora que hemos probado el navegador, solamente debemos incluir la url objetivo que queramos poner en el parámetro URL.

3.Introducir User, Pass y hacer login:

En este paso, debemos buscar el navegador qué objetos son los que permiten la interacción con el user y pass para hacer login. Por lo tanto, debemos seleccionar el rectángulo de usuarios, hacer click derecho e inspeccionar el elemento.

El elemento id se llama indentifierId. Para llamar a este elemento desde Selenium usaremos la siguiente instrucción:

El objeto find_element_by_id(<NOMBRE OBJETO>) llamará al elemento de la web. Nosotros además usaremos el objeto send_keys, que nos permitirá enviar las claves a ese objeto e interaccionar con él.

Ahora debemos pulsar el botón siguiente. Para estos casos, no es tan simple encontrar el objeto correspondiente, una forma alternativa de encontrar objetos es mediante la ruta XPATH, que marca el lugar del objeto en el html. Para localizar la ruta XPATH debemos realizar los siguientes pasos:

Seleccionar elemento–>inspeccionar elemento–>click derecho–>copiar—> como xpath

La instrucción quedaría definida del siguiente modo:

4.Seleccionamos los datos del reporte objetivo.

En mi caso el fichero está en un e-mail, pero la metodología es la misma, inspeccionar el elemento vía id o bien xpath, incorporarlo al objeto de Selenium e interaccionar con él.

En este caso, y a modo de bonus, hemos incorporado una función llamada WebDriverWait. Esta función no se ejecuta hasta que el elemento visual se ha cargado en la página, espera N segundos e interacciona con él. En nuestro caso, seleccionamos el objeto donde se encuentra el fichero, realizamos un click y entramos, después el fichero lo descargamos.

5.Renombramos el fichero y lo enviamos

Renombramos el fichero con el comando os.rename en python.

Ahora el fichero ya está listo para ser enviado. Nosotros nos apoyamos en la librería oficial de GCS para realizar el envío a nuestro bucket.

https://cloud.google.com/storage/docs/uploading-objects

En este punto, el proceso ya ha finalizado y el fichero está en nuestro GCS.

Como podemos apreciar, el proceso ha incorporado los datos en nuestro Bucket de Google Cloud. Nosotros disponemos de una tabla en BQ con la capacidad de leer los ficheros de ese directorio en el bucket. De este modo, ya tenemos los datos en un mismo punto, junto con los otros orígenes de datos. Así, ya podemos empezar a integrar en nuestro Data Warehouse.

Orquestación del proceso y tecnologías implicadas 

¿Dónde se encontrará la máquina donde va a ejecutarse el proceso?

Nosotros disponemos de una máquina virtual windows, sobre la que hemos creado un directorio llamado proceso donde estará localizado el proceso de python que vamos a ejecutar. Nos apoyaremos en Task Scheduler de Windows para determinar la hora y la frecuencia con la que vamos a querer ejecutar nuestro proceso. En nuestro caso, sería cada día a las 9 de la mañana. A esa hora, el proceso de Python va a ejecutarse y en varios minutos dispondremos, cada día, de nuestro fichero en GCS y en nuestra BBDD.

Dado que trabajamos en Cloud, no tenemos la máquina activa las 24h del día y por ello nos apoyamos en Cloud Functions, que nos permiten delimitar a qué horas debe encenderse la máquina virtual y a qué hora se apaga.

Las Cloud Functions son las siguientes:

El concepto es simple, debemos usar nuestras credenciales de GCP, determinar el proyecto, la ubicación de la máquina y la instalación sobre la que queremos trabajar, una vez ejecutado el código la máquina se apagará/encenderá.

  • Encendido:
  • Apagado

Nosotros establecemos el encendido de la máquina a las 8 de la mañana y su apagado a las 19 horas de la tarde. De modo que a las 9h se activó la tarea y la ejecución del fichero en Python.

Conclusión

Mediante el proceso creado, hemos automatizado un flujo de trabajo. Gracias a ello ahorramos horas que podemos dedicar a mejorar y mantener procesos más relevantes para el proyecto. Además, alcanzamos nuestro objetivo principal, que es el de automatizar un nuevo flujo de trabajo e integrarlo con el resto de datos en nuestro ecosistema de trabajo.

Como todo proceso, puede fallar y vamos a necesitar realizar un control de errores firme para detectar si algunos de los ficheros no están descargados y cargados en el sistema.

Las principales ventajas son:

  • Automatización de una tarea manual
  • Extracción de una nueva fuente de datos
  • Oportunidad de integrar una fuente de dato
  • Proceso sencillo

Las principales desventajas son:

  • Si el rendimiento del servidor web de origen es bajo, nuestro proceso puede ser inestable
  • Cambios en front visuales afectarán al proceso
  • Solo es para tareas sencillas
Contact