Ejemplo de WEB SCRAPING la automatización web – Parte 2

Vamos con la segunda parte del ejemplo de web scraping. En esta nueva entrega vamos a mostrar de una manera visual los datos extraídos de nuestro Linkedin utilizando Python.

www.webharvy.com/images/web%20scraping.png

En la entrada anterior generamos un fichero con nuestros contactos, su titular y el tiempo que hace que los tenemos. Vamos a cargar los datos y a pintar algunos gráficos.

Este script no lo voy a encapsular ya que solo es para mostrar alguna de las utilidades disponibles cuando extraemos datos.

Para empezar crearemos un un fichero llamado print.py

Tabla resumen de contenido

Importando librerías

from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
import pandas as pd

También necesitaremos instalar las librerías usando el comando PIP en el terminal:

pip install wordcloud
pip install matplotlib
pip install pandas

Con las librerías ya cargadas podemos empezar con el código

Cargar datos

Lo primero sera cargar los datos y preparar algunas variables que nos acompañaran durante el proceso:

df = pd.read_csv(r"export_in.csv", sep = ';')
 
comment_words = ''
stop_words = ["y", "s", "a","en","de","de la","la","del","l"] + list(STOPWORDS)
stopwords = set(stop_words)

La lista que vemos con el nombre stop_words es donde podemos añadir palabras que no nos interesa que aparezcan en la nube de palabras por no aportar valor. Por ejemplo preposiciones o nombres de empresas.

Preparando los datos

Lo siguiente preparar los datos para poder pintarlos, para ello, utilizaremos el siguiente código:


for val in df.CONTENT:
     

    val = str(val)
 
    # split the value
    tokens = val.split()
     
    # Converts each token into lowercase
    for i in range(len(tokens)):
        tokens[i] = tokens[i].lower()
     
    comment_words += " ".join(tokens)+" "

Lo que vamos a hacer este loop es que para cada titular de nuestros contactos vamos a separar cada una de las palabas » val.split() » y las pasaremos a minúsculas utilizando «lower()».

Pintando la nube de palabras

Vamos a utilizar la librería para preparar una imagen tipo nube de palabras. una vez generada la imagen, la pintaremos por pantalla utilizando la variable ptl:

wordcloud = WordCloud(width = 800, height = 800,
                background_color ='black',
                stopwords = stopwords,
                max_words = 30,
                min_font_size = 12).generate(comment_words)
 
# plot the WordCloud image                      
plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
 
plt.show()

Algunas variables relevantes:

  • width = 800, height = 800 = Tamaño de la imagen
  • max_words = número máximo de palabras a pintar
  • min_font_size = tamaño mínimo de la fuente, como veréis en función de la aparición de las palabras estas tendrán un tamaño mayor cuanta mas frecuencia tengan. Este será el tamaño mínimo.
  • figsize = Tamaño de la ventana de salida

Con esto podremos tener el siguiente resultado al ejecutar nuestro script:

No hay descripción alternativa para esta imagen

Pintando gráfico de crecida de red

Lo siguiente sera separar los datos de como ha crecido nuestra red durante el tiempo, para ello necesitamos primero preparar los datos de la siguiente manera:

index = []
values = {'results':[]}
counter = 0

index.append("")
for val in df.TIME:
    if "meses" in val or "mes" in val:
        if not val in index:
            index.append(val)
            values['results'].append(counter)
            counter = 0
        else:
            counter = counter + 1
values['results'].append(counter)

Este trozo de código no permite analizar todas las fechas de contacto. Si la fecha contiene la palabra mes o messes, sumaremos ese contacto al mes al que se añadió el contacto.

Por último pintaremos el gráfico mediante:

data = pd.DataFrame(values,
                    index=(index))
total = data.sum(axis=1)
plt.bar(total.index, total)
plt.show()

Al ejecutar el script este es el resultado:

No hay descripción alternativa para esta imagen

Podemos hacer el mismo ejercicio pero con los datos de los años anteriores:

index = []
values = {'results':[]}
counter = 0

index.append("")
for val in df.TIME:
    if "años" in val or "año" in val:
        if not val in index:
            index.append(val)
            values['results'].append(counter)
            counter = 0
        else:
            counter = counter + 1
values['results'].append(counter)
No hay descripción alternativa para esta imagen

Script completo

# importing all necessary modules
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv(r"export_in.csv", sep = ';')
 
comment_words = ''
stop_words = ["y", "s", "a","en","de","clinic","ntt","de la","la","del","p","ii","l","deloitte","stratesys","accenture","e","everis","ex","hospital clínic","ibm"] + list(STOPWORDS)
stopwords = set(stop_words)
 
# iterate through the csv file
for val in df.CONTENT:
     
    # typecaste each val to string
    val = str(val)
 
    # split the value
    tokens = val.split()
     
    # Converts each token into lowercase
    for i in range(len(tokens)):
        tokens[i] = tokens[i].lower()
     
    comment_words += " ".join(tokens)+" "
 
wordcloud = WordCloud(width = 800, height = 800,
                background_color ='black',
                stopwords = stopwords,
                max_words = 30,
                min_font_size = 12).generate(comment_words)
 
# plot the WordCloud image                      
plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
 
plt.show()

index = []
values = {'results':[]}
counter = 0

index.append("")
for val in df.TIME:
    if "meses" in val or "mes" in val:
        if not val in index:
            index.append(val)
            values['results'].append(counter)
            counter = 0
        else:
            counter = counter + 1
values['results'].append(counter)

data = pd.DataFrame(values,
                    index=(index))
total = data.sum(axis=1)
plt.bar(total.index, total)
plt.show()

index = []
values = {'results':[]}
counter = 0

index.append("")
for val in df.TIME:
    if "años" in val or "año" in val:
        if not val in index:
            index.append(val)
            values['results'].append(counter)
            counter = 0
        else:
            counter = counter + 1
values['results'].append(counter)

data = pd.DataFrame(values,
                    index=(index))
total = data.sum(axis=1)
plt.bar(total.index, total)
plt.show()

Para ejecutar el script este será el comado:

python print.py

Y hasta aquí la explotación de datos de nuestra red, espero que esta sea un buen punto de partida para vuestros análisis y proyectos.

Aunque este tema no esta relacionado con SAP, como podéis ver, puede ser utilizado par automatizar o hacer test de vuestras aplicaciones SAPUI5.

Si veo que este tema os despierta interés, publicará una tercera parte con una utilidad que os puede hacer todas estas tareas de testing mucho mas fáciles sin necesidad de programar

Como siempre suscribete, dale a la campanita de notificaciones y comparte en redes para estar a la última.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.