Aprovechando las posibilidades de Selenium en Python

0
8124

Índice de contenidos


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.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad