Índice de contenidos
- 1. Introducción
- 2. Pasos previos
- 3. Objetivo
- 4. Explicación del código paso a paso
- 5. A tener en cuenta
- 6. Resultado
- 7. Conclusiones
1. Introducción
Hoy en día la recopilación de datos, extracción de imágenes/contenido, seguimiento de
precios o análisis de sentimientos en aplicaciones webs se ha convertido en una fuente
de datos rentable.
En este ejemplo vamos a ver que Selenium no es solo un entorno de pruebas para
aplicaciones web, vamos a dar un paso más y vamos a extraer datos de esta misma web.
A continuación, vamos a analizar estos datos de una manera sencilla para que puedas
ver el potencial de esta herramienta.
2. Pasos previos
- Instalar Python (en mi caso tengo Python 3.6 con Anaconda). Puedes descargarlo aquí. Está para todos los
SSOO. - Instalar Selenium. Si usas Anaconda en window ejecuta tu cmd como
administrador y escribe:conda install -c conda-forge selenium
- Descargar el driver del navegador. En mi caso uso Firefox y lo puedes descargar
desde aquí. En mi caso uso
window 7 64bit por lo que he descargado geckodriver-v0.20.0- win64.zip
3. Objetivo
El objetivo de este tutorial es conocer cuál es el autor de adictosaltrabajo.com con más índice de impacto en sus publicaciones en la web.
4. Explicación del código paso a paso
Lo primero de todo importamos selenium y añadimos la ruta donde se encuentra instalado el driver de firefox que hemos descargado anteriormente.
from selenium import webdriver driver = webdriver.Firefox(executable_path=r'C:\Users\rprast\Downloads\geckodriver-v0.19.1-win64\geckodriver.exe')
En segundo lugar, tendremos que hacer una espera para que la web cargue completamente y accedemos a la web donde se encuentran los usuarios.
driver.implicitly_wait(30) driver.maximize_window() driver.get("https://adictosaltrabajo.com/quienes-somos/")
Une vez seguidos estos pasos, se crean dos listas una para el ratio de índice de impacto
y otra con los nombres.
ratiolist=[] nombreslist=[] i_list=range(1, 143, 1)
Ahora tenemos que extraer el contenido que nos interesa. Que es:
- Nombres
- Publicaciones
- Visitas
Para extraer estos datos iremos a inspeccionar elemento y analizaremos los xpath de
estos campos. El xpath es la posición del elemento en la estructura jerárquica del XML
de la web y se puede copiar fácilmente como se puede ver en el siguiente vídeo:
Por ejemplo, para el caso de los tres primeros nombres, hemos copiado aquí su xpath:
/html/body/div[4]/div[1]/table[1]/tbody/tr/td[2]/div/h4/a /html/body/div[4]/div[1]/table[2]/tbody/tr/td[2]/div/h4/a /html/body/div[4]/div[1]/table[3]/tbody/tr/td[2]/div/h4/a
Analizando estas 3 líneas podemos ver que solo cambia el número de table. De esta
forma podemos ir cambiando este número para obtener el nombre de cada persona.
Este mismo proceso lo hemos hecho para el nombre, visitas y publicaciones.
for i in i_list: nom1=('/html/body/div[4]/div[1]/table['+ str(i+1)) nom2=(']/tbody/tr/td[2]/div/h4/a') nombre=(nom1+nom2) publi1=('/html/body/div[4]/div[1]/table['+ str(i)) publi2=(']/tbody/tr/td[2]/p[2]/a') publicaciones=(publi1+publi2) visi2=(']/tbody/tr/td[2]/p[2]/b') visitas=(publi1+visi2) ...
Ahora ya tenemos las direcciones xpath, ya solo nos queda decirle al objeto driver que
encuentre estos elementos,
for i in i_list: ... nombres=driver.find_element_by_xpath(nombre) publicaciones = driver.find_element_by_xpath(publicaciones) visitas = driver.find_element_by_xpath(visitas) ...
Previamente habíamos definido dos listas (ratio y nombres). La lista de nombres la
iremos rellenando cuando extraemos el texto de nombres. La lista de ratio es la que
representa el índice de impacto, el cual se define con la división entre el número de
visitas y el número de publicaciones. No podemos tener en cuenta un dato relevante como es la fecha de alta del autor, pero para este ejemplo didáctico esta aproximación es más que sufiente.
for i in i_list: ... p=publicaciones.text p1=('publicación') p2=('publicaciones') findstr1= (p.find(p1)) findstr2= (p.find(p2)) if findstr2==-1: p=p[:-12] else: p=p[:-14] p=int(p) v=visitas.text commas_removed = v.replace('.', '') v = float(commas_removed) try: ratio=v/p except: ratio=0 n=nombres.text ratiolist.append(ratio) nombreslist.append(n)
A partir de ahí, encontramos los nombres, publicaciones y visitas partiendo del string de xpath.
Una vez hecho esto extraemos el texto del xpath con .text, eliminamos los puntos y lo pasamos a integer o float.
Una vez calculado el índice de impacto, lo añadimos a la lista de índices de impacto y su autor correspondiente a la lista de autores.
Por último, cerramos la ventana y buscamos el mayor índice de impacto que se encuentra en la lista.
Una vez localizado, escribiremos por pantalla el nombre del autor a quién corresponde dicho índice de impacto.
driver.quit() ratiomax=max(ratiolist) idx = max(range(len(ratiolist)), key = lambda i: ratiolist[i]) print('El autor que tiene mas impacto en sus publicaciones es') print(nombreslist[idx-1])
5. A tener en cuenta
-
Cuando extraemos el texto en las publicaciones hay 2 opciones, publicación o
publicaciones. Esto se ha solventado con un if que sustrae del string
respectivamente 12 (publicación) o 14 caracteres (publicaciones). -
Existe la posibilidad de que algunos autores tengan 0 publicaciones por lo que el
ratio da un error al tener un división con un cero. Esto se ha solventado con un
try donde se asigna 0 como ratio en estos casos.
6. Resultado
El autor que tiene mas impacto en sus publicaciones es:
Enrique Medina Montenegro
7. Conclusiones
Como hemos podido comprobar, esto es una forma rápida de analizar datos procedentes de una aplicación web.
Espero que os haya servido
Un saludo.