• Carlos Loyo

Introducción a Scrapping con Selenium

Hola amigos blogueros,


Ante que nada quiero aclarar que el código en cuestión es de un gran amigo Víctor Rodríguez


Web scraping es el proceso de recopilar información de forma automática/masiva de la Web. Utiliza soluciones prácticas basadas en tecnologías existentes que son comúnmente ad hoc. Existen distintos niveles de scrapeo que se utilizan hoy en dia:


● Copiar y pegar (humano)

●Uso de expresiones regulares

Protocolo HTTP: páginas webs estáticas y dinámicas pueden ser obtenidas haciendo peticiones HTTP al servidor remoto utilizando sockets, etc.

●Parsers de HTML.

Aplicaciones para web scraping.

●Otras tecnicas...


El web scraping pudiera ir en contra de los términos de uso de algunos sitios webs. El cumplimiento de estos términos no está totalmente claro. Mientras que la duplicación de expresiones originales puede ser en muchos casos ilegal (Sobretodo cuando su uso es comercial). Ejemplo de ello:


Feist Publications v. Rural Telephone Service

eBay vs Bidder's Edge

American Airlines vs FareChase


En el web scraping, no todo es color de rosa, existen controle que nos complican esta tarea:


Añadir entradas al fichero robots.txt. Google y otros bots pueden ser detenidos de esta forma.

Bloquear la dirección IP con comportamiento sospechoso.

CAPTCHA

Uso en exceso de tráfico proveniente de cierta IP.

Existen servicios comerciales antibots: algunas empresas ofrecen servicios antibots y antiscraping.

Incrementar el uso de JavaScript y AJAX. De esta forma es más difícil para los scrapers simular las peticiones como si fueran un navegador común.


Selenium - ChromeDriver


Selenium:


Es una librería Open Source que nos permite extraer información importante que se encuentra en internet. Es posible leer el contenido de una web y movernos en su estructura HTML/CSS/XPATH para analizar sus datos y explotarlos según sean nuestras necesidades.


Primero debemos instalar selenium, lo cual podemos hacer desde pip

# pip install selenium

Selenium nos permite obtener información del contenido de manera que nos deja parsear la información y volcarla en archivos de texto con un formato específico.

https://selenium-python.readthedocs.io/


Chromedriver:

WebDriver es una herramienta de código abierto para pruebas automáticas de aplicaciones web en muchos navegadores. Proporciona capacidades para navegar a páginas web, inputs, ejecución de JavaScript y más.

Se debe descargar la versión correspondiente al browser que usaremos y guardar para luego ser invocado a la hora de ejecutar el código.

https://chromedriver.chromium.org/


Primer ejercicio (Obtener valor del dolar)

#Con teste código, ingresamos a una pagina de un diario, nos dirigimos a búsqueda, elegimos lo que queremos encontrar y ejecutamos la búsqueda.
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
browser = webdriver.Chrome('C:/chromedriver.exe')
browser.get('https://www.lanacion.com.ar')
search= browser.find_element_by_id('txtBusquedaHeader')
time.sleep(5)
search.send_keys(“Noticias Internacionales")
time.sleep(5)
search.send_keys(Keys.RETURN) 
time.sleep(5) browser.quit()
#importamos time solo para pausar el código y hacer más visible su ejecución.
import time
#Este modulo permite que utilicemos webdriver
from selenium import webdriver
#Este modulo nos permite usar el teclado
from selenium.webdriver.common.keys import Keys
#Debemos descargar la versión del web driver correspondiente al browser que utilizaremos y guardarla en una dirección especifica para invocarla después. 
En este caso utilizaremos Chrome. Guardamos en la variable browser, la ejecución del atributo “CHROME” del módulo “selenium.webdriver” indicándole la ruta donde desgargamos el archivo. 
browser = webdriver.Chrome('C:/chromedriver.exe')
#Luego con el atributo GET, obtendremos el HTML de la URL indicada.
browser.get('https://www.lanacion.com.ar') 
#Una vez obtenido el HTML, buscamos, ejecutamos acciones y recolectar información. 
Buscar: #Utilizaremos el inspector de elementos del browser para saber cual el tag, id, class, xpath, etc. e identificar al área donde nos queremos ir. En este caso, vamos a ir al campo “Buscar” dentro de la página del diario. En el HTML de este campo, vemos que entre otras cosas, está identificado con el ID txtBusquedaHeader. Y lo guardamos en la variable search

search= browser.find_element_by_id('txtBusquedaHeader')

En la primera imagen, utilizaremos el módulo de inspeccionar

Donde podemos visualizar la variable txtBusquedaHeader

Ejecutar acciones:

#Ahora vamos a enviar comandos del teclado para tipear lo que estamos buscando y ejecutar la búsqueda. Sobre la variable search utilizaremos los atributos: send_keys para que en el campo de búsqueda se escriba lo que queremos buscar.
search.send_keys(“Noticias Internacionales")
#Luego presionamos enter 
search.send_keys(Keys.RETURN) 
#Y finalmente cerramos el explorador.
browser.quit()

Segundo ejercicio (Cazar precios en Mercado Libre)


Ejecutar acciones:

#para recolectar información utilizaremos otro ejemplo. Vamos a elegir un producto de ML y tomaremos el nombre del producto y su precio.
#importar las liberias y modulos.
import time
from datetime import date
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#invocamos al webdriver de chrome y accedemos a la URL del producto
browser = webdriver.Chrome('C:/chromedriver.exe')
browser.get('https://articulo.mercadolibre.com.ar/MLA-743561550-auricular-bose-soundtrue-ae-pios-apple-i-i-azul-_JM?variation=44502635876&quantity=1#reco_item_pos=4&reco_backend=machinalis-homes-pdp&reco_backend_type=function&reco_client=home_second-best-navigation-trend-recommendations&reco_id=b005a291-07cf-481e-98c5-41c4965e3622&c_id=/home/second-best-navigation-trends-recommendations/element&c_element_order=5&c_uid=3dfb4f91-4374-45db-a365-f7a8a5c0cebd') 

Desde el módulo de inspector,

#Inspeccionamos el título y vemos que es un su CLASS NAME es item-title__primary

#Inspeccionamos el precio y vemos que es un su CLASS NAME es price-tag-fraction



Obteniendo el precio

 #Entonces en dos variables distintas guardamos el precio y el titulo, utlizando el atributo “find_element_by_class_name” e indicando el “class name
 price= browser.find_element_by_class_name('price-tag-fraction')
 title= browser.find_element_by_class_name('item-title__primary ')
#Y ahora imprimimos en consola titulo, precio y fecha. En los elementos de HTML que hemos extraído, tenemos que agregarle el atributo text para que nos indique su contenido. Podemos también guardarlo en un cvs para luego comprar todos los días el precio del producto y generar una alerta cuando este baje.
print(title.text, ';' , price.text, ';', date.today())
#cerramos Chrome.
browser.quit()

Obteniendo el siguiente resultado:


#El código completo quedaría de la siguiente manera.

import time
from datetime import date
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome('C:/chromedriver.exe')
browser.get('https://articulo.mercadolibre.com.ar/MLA-743561550-auricular-bose-soundtrue-ae-pios-apple-i-i-azul-_JM?variation=44502635876&quantity=1#reco_item_pos=4&reco_backend=machinalis-homes-pdp&reco_backend_type=function&reco_client=home_second-best-navigation-trend-recommendations&reco_id=b005a291-07cf-481e-98c5-41c4965e3622&c_id=/home/second-best-navigation-trends-recommendations/element&c_element_order=5&c_uid=3dfb4f91-4374-45db-a365-f7a8a5c0cebd')

price= browser.find_element_by_class_name('price-tag-fraction')
title= browser.find_element_by_class_name('item-title__primary ')
print(title.text, ';' , price.text, ';', date.today())
browser.quit()

Nos vemos en el próximo capitulo,

Hasta pronto!!!