Como hacer scraping en Selenium Webdriver

Hoy día existen muchas herramientas que nos permiten hacer scraping de un sitio web pero también podemos utilizar otras que conozcamos para hacer la misma tarea. Selenium Webdriver es una herramienta para automatizar casos de prueba, pero puede ser utilizada para hacer scraping de cualquier sitio web.

scraping

Que es el scraping?

El scraping es una tecnica que se utiliza para extraer datos de un sitio web, por lo que tenemos que tener cuidado de que tengamos los permisos para hacerlo, porque muchos sitios nos pueden bloquear por direccion ip al detectar que estamos sacando informacion, o determinar el sus terminos y condiciones la prohibicion de hacer scraping sobre ese sitio.

Como hacer scraping con selenium webdriver?

Lo primero que tenemos que hacer es tener un proyecto creado para trabajar con Selenium Webdriver, en este caso lo voy a hacer en Java pero se puede utilizar cualquier lenguaje soportado por Selenium Webdriver. Si no saben como empezar a configurarlo les recomiendo que lean el articulo Como automatizar pruebas de software en el blog donde explico los pasos para crear un proyecto con java + maven + selenium webdriver.

Una vez que tenemos un proyecto configurado, vamos a plantear un problema para hacer el scraping:

Obtener los precios de los diferentes modelos de iPad desde el sitio de apple y guardarlos en un archivo csv, para poder sabel el precio historico de los diferentes modelos en el tiempo.

Comenzando a hacer scraping:

apples

El primer paso es seleccionar las librería que queremos utilizar en el proyecto, en este caso como vamos a obtener datos del sitio de Apple vamos a utilizar Selenium Webdriver para automatizar el proceso de abrir el sitio y obtener los valores de los elementos donde esta el precio de cada modelo, y para guardar los datos en un archivo csv vamos a utilizar una librería llamada OpenCSV, la cual configuramos en Maven mediante el POM.xml.

Primer paso: Ingresar al sitio

Para ello vamos a utilizar el driver de Chrome (tiene que estar configurado en el path como explico en el post Como automatizar pruebas de software) para abrir el navegador e ingresar a https://www.apple.com/ipad/.

WebDriver driver = new ChromeDriver();
driver.get("https://www.apple.com/ipad/");

Segundo paso: Obtener los precios de los modelos desde el sitio

Para esto vamos a necesitar analizar los localizadores de cada elemento que contiene el precio, para ello podemos utilizar las herramientas de desarrollador de google chrome para inspeccionar el sitio, donde podemos ver que hay 4 elementos bien definidos con el precio de cada modelo, por lo que vamos a usar xpath para su definición:

WebElement pro = driver.findElement(By.xpath("//p[@data-pricing-id=\"ipad-pro\"]"));
WebElement air = driver.findElement(By.xpath("//p[@data-pricing-id=\"ipad-air\"]"));
WebElement ipad = driver.findElement(By.xpath("//p[@data-pricing-id=\"ipad-10-2\"]"));
WebElement mini = driver.findElement(By.xpath("//p[@data-pricing-id=\"ipad-mini\"]"));

Tercer paso: Crear una lista con los resultados

Una vez tenemos todos los elementos, vamos a crear una lista que utilizaremos luego para escribir nuestro archivo csv, para ello usamos el método getText() de Selenium Webdriver para obtener el texto de cada elemento:

List<String[]> priceList = new ArrayList<String[]>();

priceList.add(new String[] { "iPad Pro", pro.getText() });
priceList.add(new String[] { "iPad Air", air.getText() });
priceList.add(new String[] { "iPad", ipad.getText() });
priceList.add(new String[] { "iPad Mini", mini.getText() });

Cuarto paso: Escribir nuestro archivo csv con los resultados

Para ello vamos a utilizar openCSV que nos permite escribir los valores de la lista creada en el paso anterior en un archivo csv:

String csv = "writtenAll.csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv, true));
writer.writeAll(priceList);
writer.close();
driver.quit();

Listo! Ahora podemos ejecutar el codigo y ver el archivo csv que nos deja como resultado:

"iPad Pro","From $799"
"iPad Air","From $499"
"iPad","From $329"
"iPad Mini","From $399"

Si les interesa pueden descargar el código del proyecto desde mi repositorio de git, en este enlace, y recuerden que pueden unirse a nuestro grupo de testing automatizado en facebook.