DEV Community

Cover image for Web Scraping y Concurrencia - GO
Pedro Chaparro
Pedro Chaparro

Posted on

Web Scraping y Concurrencia - GO

Recursos

Esta implementación fue realizada gracias al trabajo colaborativo. El código fuente y los aportes de cada persona se encuentran en Github.

Introducción

Uno de los métodos más conocidos para la obtención de información desde sitios públicos en internet es el web scraping, que, a partir de diversos métodos como el uso de selectores css o expresiones regulares permite obtener los textos presentes en el HTML del sitio web.

En este caso, el objetivo de la implementación del web scraping es la obtención de títulos, descripciones, etiquetas, enlaces y "miniaturas" de vídeos publicados en la plataforma YouTube con fines netamente de aprendizaje.

Inicialmente, se realizaron 3 implementaciones en los lenguajes de programación Ruby (ver más información), JavaScript (ver más información) y Python (ver más información). A pesar de que las tres implementaciones requerían tiempos relativamente bajos para completar la recolección, se identificó una posible oportunidad de mejora utilizando el lenguaje Go, esto debido a su soporte para la concurrencia.

Implementación y resultados

Para la obtención de los datos requeridos se escogieron diferentes búsquedas (Ejm. How to create websites, Colombian music) y se obtuvieron, al menos, 140 enlaces de los vídeos resultantes de cada búsqueda empleando el paquete go-rod para inicializar un navegador sin interfaz gráfica (headless) y realizar de manera automática el scroll hasta tener el número mínimo de vídeos y obtener los enlaces.

El siguiente paso fue iterar los enlaces obtenidos y, con ayuda del paquete SizedWaitGroup, iniciar de manera concurrente la ejecución de funciones para obtener los datos de cada enlace. A pesar de que Go ofrece de manera estándar el paquete sync con el que se pueden crear WaitGroups, se optó por el paquete SizedWaitGroup para evitar el consumo excesivo de recursos al limitar el número de GoRoutines concurrentes.

Al modificar el límite de GoRoutines concurrentes, se obtuvieron los siguientes resultados:

Tiempo de ejecución requerido según el número de GoRoutines concurrentes

Como se observa en el gráfico, con tan solo pasar de una GoRoutine concurrente (Ejecución secuencial) a dos, el tiempo de ejecución se reduce de 113.6039s a 61.4714s, es decir, un 45.8897% apróximadamente, y al utilizar ocho GoRoutines, se reduce a 28.7748s, lo cual es 74.6709% menos en comparación al tiempo inicial.

Para finalizar, así se ven en la consola las ejecuciones con un límite de 1 y 8 GoRoutines respectivamente (Los primeros 20 segundos corresponden al tiempo para hacer el scroll con el web-driver`):

Ejecución con límite de 1 GoRoutine

Ejecución con límite de 8 GoRoutines

Referencias

Latest comments (0)