El BORME es el órgano oficial de publicación del Registro Mercantil de España para los actos jurídicos que por disposición legal deben darse a conocimiento público. Estos boletines, disponibles en boe.es/diario_borme, se publican de manera periódica para cada provincia y se presentan en documentos con formato PDF en los cuales se encuentra mucha información acerca de los movimientos de todas las empresas registradas legalmente en España. El problema es que esa información resulta poco explotable en el formato en el cual se presenta al público debido a que “rastrear” los movimientos de una determinada empresa o de una completa actividad económica supone una larga y tediosa tarea de investigación de tener que realizarlo manualmente.
Este artículo describe el propósito de OSBEX, la semilla de una plataforma de explotación de información del BORME realizado íntegramente con componentes Open Source, por lo cual la implementación de este se hará accesible para todo el mundo y cualquier persona que lo desea podrá colaborar en su desarrollo, modificar o distribuir el código de la forma que considere conveniente además de no necesitar ningún tipo de licencia de producto.
OSBEX se crea con la finalidad de cubrir una alternativa Open Source a las existentes soluciones cerradas para la exploración de información del BORME que como veremos más adelante tienen desventajas y limitaciones que se cubrirán de manera abierta y ampliable con esta solución. Toda la implementación está completamente automatizada por lo que tanto el proceso de levantamiento de la plataforma como de ingesta de datos se realiza con el mínimo esfuerzo para el usuario.
El código fuente original de la implementación se aloja en github.com/iv-vz/osbex con visibilidad pública.
Estado actual del proyecto
Actualmente el proyecto se puede considerar una prueba de concepto hasta que se determine que realmente pueda tener utilidad en el mercado y ocupar un lugar en él.
A medida que la plataforma progrese será necesario realizar cierta refactorización tecnológica del stack, además de un completo plan de desarrollo y de puesta en producción que se detallarán en el apartado correspondiente de este documento, además de unas posibles futuras líneas de mejora/ampliación del mismo.
Finalidad y competencia en el mercado
Analizando y buscando vemos que ya existen portales que se alimentan del BORME. Por ejemplo:
- librebor.me presenta datos sobre las empresas, aunque ofrece únicamente listing de información. Tiene una API de pago para poder consultar los datos estructurados del BORME.
- En este punto ya tenemos una ventaja puesto que nos ahorramos ese coste, ya que la información que se extrae con OSBEX está muy estructurada para facilitar las búsquedas o integrarlo con otros sistemas manteniendo siempre un estándar de presentación de los datos en los documentos gracias a Opendistro.
- www.infocif.es también es un portal que ofrece información sobre empresas y permite establecer un sistema de pago por alarmado muy interesante, cuando una empresa tiene un cambio interno, pacta con otra empresa, aumenta su capital, etc… permite notificación de ello.
- Al utilizar opendistro existen mecanismos para poder realizar este tipo de alarmado, creando disparadores cuando se presentan ciertas casuísticas en los datos. Esto es ampliable hacia muchos horizontes y tiene integración nativa con muchos canales de notificación (correo, telegram, redes sociales, …). En esta POC no estará procedimentado su uso aunque se puede realizar leyendo la documentación de opendistro.
- El Instituto Nacional de Estadística ine.es ofrece datos estadísticos basados en las mismas fuentes.
- Con OSBEX se quiere centralizar la información en un único aplicativo además de que permite una visualización sencilla y fácil de parametrizar para ver los datos imprescindibles en el menor tiempo posible. Además, se pueden crear todas las vistas o paneles que se deseen en los cuadros de mandos para obtener un resultado personalizado.
Este proyecto quizá podría ser la semilla que en un futuro pueda hacer “competencia” a alguna de esas plataformas ofreciendo mejoras como el enriquecimiento de la información de una empresa mediante otras fuentes de datos y contar con un portal web y una API, aunque la idea actual es poder explotar automáticamente y de forma gratuíta el BORME hasta todos sus límites, lo que ya nos ofrece una ventaja inicial.
Desde el punto de vista tecnológico, OSBEX utiliza un conjunto de componentes muy maduros y utilizados en grandes empresas que nos permite un almacenamiento y representado de la información que resulta muy versátil, completo y ampliable.
A nivel de infraestructura se sientan bases CaaS lo que nos permitirá de ser necesario realizar una migración hacia un orquestrador de contenedores como puede ser Kubernetes con el mínimo esfuerzo. Otra ventaja de utilizar contenedores es que se reducen drásticamente los tiempos de desarrollo al existir imágenes ya construidas de algunos de los componentes entre otras ventajas.
Presentación de tecnologías y flujo
Todo el aplicativo tiene un modelo CaaS (Container as Service) Docker y moldeado con docker-compose para esta prueba de concepto, por lo que la única dependencia para poder utilizarlo es tener instalado el servicio de Docker además de docker-compose en un host Windows o Linux. Al levantarse la infraestructura por primera vez, este automáticamente cubrirá todas las dependencias descargando las imágenes pertinentes o construyéndolas y levantando finalmente los contenedores en base a las imágenes y las instrucciones establecidas.
Diagrama de flujo del docker-compose de OSBEX en versión POC
La aplicación se presenta como un entorno de varios contenedores docker y conjuntado con docker-compose. Una vez se levante la infraestructura, se habrán creado 5 componentes:
- borme-extractor: Es el componente encargado de comunicarse con el BORME (escrito en Python). Según la configuración que hayamos establecido para cada provincia, comenzará a solicitarle los XML y los boletines en formato PDF y realizará la lectura de los mismos para convertirlos en formato entendible (JSON) y preformateado para logstash (siguiente componente) (1.). Una vez realizada la conversión de un boletín, lo enviará mediante HTTP (POST) a logstash (2.).
- logstash-oss: Logstash es un componente del stack de Elastic que permite realizar ingestión de datos desde muchas fuentes, realizar procesado y enviarselo a distintos destinos. En esta implementación se ocupa de recibir los boletines en formato JSON manteniéndose siempre a la escucha con un servidor HTTP levantado en su parte. Una vez reciba un boletín, realiza múltiples transformaciones y cortes para estructurar los datos correctamente con previsión a optimizar e ingestar los datos a OpenDistro también mediante HTTP (3.).
- opendistro (elasticsearch): Es una base de datos no relacional optimizada para el almacenamiento de datos en series temporales. Almacena los datos y documentos que a su vez se guardan en índices de Elastic, que le permite buscar / encontrar información de manera muy ágil. Una vez recibidos los datos de logstash permanecen guardados y estructurados a la espera de consulta.
- grafana: Permite crear completas visualizaciones gráficas y de representación de la información desde diferentes fuentes. En este caso realiza consultas a opendistro (4.) cada vez que un usuario visualiza un cuadro de mandos (5.).
— - kibana: Aunque en este caso no pertenece al flujo de datos de OSBEX, este componente también es parte del stack de elastic y permite realizar múltiples operaciones contra elasticsearch (opendistro) para la gestión de los índices, visualizar los datos almacenados “en crudo” además de poder crear también otros tipos de representaciones.
Escenarios de actuación
Instalar Docker + docker-compose
La instalación de docker y docker-compose se realizará siguiendo los pasos de la documentación oficial:
- Install Docker Engine [https://docs.docker.com/engine/install/]
- Install Docker Compose [https://docs.docker.com/compose/install/]
Al tratarse de una instalación clásica independientemente del sistema operativo que se elija no se detalla el proceso de instalación en este documento puesto que el funcionamiento será el mismo en todos los SO.
Será necesario seguir las instrucciones en función de qué SO se esté utilizando.
Clonar/descargar el repositorio de código en local
Es necesario tener el código de OSBEX en local para poder levantar la aplicación y comenzar a trabajar con ella. Para ello ejecutaremos el siguiente comando si tenemos instalado git en local:
git clone git@github.com:iv-vz/osbex.git
En caso de no tener git instalado en local, abrimos manualmente este enlace en el navegador para descargarnos la última versión del código en formato .zip
https://github.com/iv-vz/osbex/tree/main
Luego descomprimir el .zip
Nos encontraremos con esta estructura de archivos / directorios
Configuración de la extracción por provincias
Antes de empezar a recolectar/ingestar es necesario establecer para cada provincia desde qué fecha queremos ingestar datos del BORME. Consultar en: https://www.boe.es/diario_borme/calendarios.php para saber en cada provincia cual es la primera fecha de publicación de los boletines en caso de querer ingestar desde que se comenzaron a publicar en boe.es.
- Para configurar la extracción es necesario editar el YAML checker.yml ubicado en ./borme-extractor-app/config/checker.yml con cualquier editor y en la sección zones, por ejemplo con la siguiente configuración:
zones: A CORUÑA: last_checked: '2020-01-01' LUGO: last_checked: '2020-01-01' PONTEVEDRA: last_checked: '2020-01-01'
Estamos indicando que queremos ingestar solamente las provincias de A Coruña, Pontevedra y Lugo con las fechas establecidas. Simplemente añadir a continuación las provincias necesarias respetando el formato YAML. Las provincias deben de anotarse tal y como aparecen en boe.es/borme_diario.
Este fichero irá actualizando las fechas para cada provincia según se vayan descargando nuevos boletines y marcando la fecha de ese último descargado.
El fichero final debe ser similar a este y no se debe cambiar el resto de parámetros fuera de la sección “zones” para una ingesta normal.
Levantar OSBEX
Ubicarse en una shell a la raíz del directorio del proyecto y levantar el entorno de docker con docker-compose up -d. Comenzará a construir / descargar las imágenes de los contenedores y levantarlos. Una vez todo esté operativo, borme-extractor comenzará automáticamente a descargarse los boletines y a ingestarlos internamente.
Al ejecutar ese comando automáticamente comenzará a construir o descargarse las imágenes en función de lo definido en el fichero docker-compose.yml en la raíz del proyecto y levantar los contenedores con sus configuraciones.
Acceder a la interfaz de OSBEX
Una vez levantado el entorno, abrir grafana en un navegador con http://localhost:3000 y autenticarse con las credenciales por defecto (admin/admin).
Página principal
Llegaremos a la página principal de OSBEX donde se puede visualizar un menú con 4 opciones:
Buscar empresas
Permite en base a criterios encontrar empresas de un determinado tipo y llevarnos a la página de “Detalle empresa”.
Con los filtros de Zona y Actividad económica podemos filtrar qué empresas queremos visualizar.
Para ir a los detalles de una empresa, pinchar sobre el nombre de la empresa.
Detalle empresa
Visualiza los datos disponibles acerca de una empresa
Aquí se pueden visualizar la cantidad de veces que ha escrito en el BORME, cuantas recapitalizaciones ha publicado la empresa, un mapa y el detalle de cada publicación.
Además desde los filtros en la parte superior podemos buscar empresas por nombre y en todas las provincias disponibles.
En Razón Social se puede escribir y los resultados se irán filtrando según encuentre coincidencia
Indicadores estadísticos
En esta sección se pueden ver paneles con distintos tipos de gráficos para explotar de manera estadística información del BORME. A día de hoy podemos visualizar:
- Constitución vs disolucíon de empresas por provincias seleccionadas
- Timeline constitución de empresas por categoría y por provincias seleccionadas
- Proproción de constitución de empresas por categoría y por provincias seleccionadas
En la sección Zona, podemos seleccionar varias provincias:
Lo que cambiará la contextualización de los gráficos para sumar los datos de las provincias seleccionadas.
Además podemos acotar las gráficas para visualizar únicamente datos entre dos fechas personalizadas:
Estado ingestión boletines
Este panel permite de un vistazo visualizar el estado de la ingestión de los boletines en la plataforma.
Al ubicarse en el dashboard “ESTADO INGESTION BORME” podemos ver cuántos PDFs se han procesado y para cada provincia las fechas de los mismos.
Parar OSBEX
Ubicarse en una shell al directorio del proyecto y parar el entorno de docker con docker-compose stop. Esto únicamente detendrá los contenedores y se podrán volver a levantar con la instrucción de levantamiento según sea necesario.
Eliminar OSBEX
Primero parar OSBEX. Ubicarse en una shell al directorio del proyecto y eliminar completamente el entorno de docker con docker-compose rm -f. Esto eliminará todo el entorno aunque los datos de OSBEX permanecen en el volumen. Para eliminar todos los volúmenes inutilizados, ejecutar: docker volume prune. Esto eliminará DEFINITIVAMENTE todos los recursos de OSBEX, incluidos los datos descargados del BORME.
Configuraciones avanzadas
Las configuraciones más avanzadas se documentan en el README.md de github.com/iv-vz/osbex además de los comentarios en los propios códigos utilizados.
Conclusiones finales, líneas de ampliación
- Inicialmente la idea estaba más centrada en extraer indicadores analíticos y como línea de ampliación sería interesante obtener más, pero esta tarea es tediosa y requiere de mucho análisis para tener claro qué extraer y cómo hacerlo.
- Esta semilla puede en un futuro ampliar sus funcionalidades como aportar un árbol de relaciones entre personas / empresas, buscador de personas y sus implicaciones, etc.
- En caso de evolución, sería necesario refactorizar el modo de presentación del producto para poder utilizarlo en entornos productivos.
- Otra posibilidad sería albergar y centralizar OSBEX en un servidor con un acceso abierto al público (o restringido por funcionalidades y precio) , aunque para ello sería necesario buscar cierta financiación para el costo y mantenimiento del mismo además de analizar si hay un lugar en el mercado para ello.
Webgrafía
Enlaces de interés utilizados para la elaboración del proyecto o del documento:
- Install Docker Engine [https://docs.docker.com/engine/install/]
- Install Docker Compose [https://docs.docker.com/compose/install/]
- Opendistro Alerting [https://opendistro.github.io/for-elasticsearch/features/alerting.html]
- Grafana Documentation [https://grafana.com/docs/]
- Logstash Documentation [https://www.elastic.co/guide/en/logstash/master/index.html]
- Opendistro Documentation [https://opendistro.github.io/for-elasticsearch-docs/]
- Docker Compose Doc. [https://docs.docker.com/compose/]