Comenzaremos el post explicando que es esto con el nombre web scraping para luego continuar con las herramientas disponibles y como implementarlo en Ruby on Rails.

Deficición Web Scraping

Es una técnica que utilizamos los programadores cuando tenemos una aplicación web sin API y deseamos recopilar información de una página web, bien para nutrir de datos a nuestra aplicación web o comprobar datos. Para lo que deseen una explicación mucho má detallada les dejo el enlace de la wikipedia.

Herramientas

Hay bastantes herramientas en Ruby on Rails para aplicar el web scraping, en este artículo nos centraremos en una gema en concreto llamada Nokogiri. Con ella podemos analizar los documentos HTML y XML entre otros, ¿Cómo?, bueno vamos paso a paso para entender todo el proceso, no quieras correr tanto…

Instalación Nokogiri en Ruby on Rails

1. Lo primero debemos de insertar en nuestro fichero Gemfile la línea correspondiente a la gema Nokogiri.
gem install nokogiri

2. Desde la consola o terminal ejecutaremos Bundle para instalar nuestra gema junto a sus dependencias.
bundle install

3. Es aconsejable tener instalada la herramienta Firebug para inspeccionar las etiquetas HTML y CSS.

Con ello ya tendremos todo lo necesario para empezar nuestro Web Scraping con Ruby.

Implementación Web Scraping con Ruby.

Podemos abrir nuestro editor o IDE para seguir el ejemplo que a continuación veremos, en mi caso utilizaré el editor Sublime Text 2. Tenemos que llamar a las librerías necesarias para copiar el contenido de una otra web de forma remota.

require ‘Nokogiri’

require ‘open-uri’

Esta segunda gema openURI nos permite manejar protocolos http, https, ftp y tratar los documentos obtenidos como si fuera un documento como un Word, lo que nos va a facilitar mucho nuestra tarea.

Allá vamos… ahora vamos a elegir una web que vamos a copiar el contenido y esa va a ser la página web de Amazon correspondiente a los libros.

Realizamos una asignación simple de variable, junto en la segunda línea abrimos y obtenemos la web como un documento. Como lo que vamos a leer es un HTML, se lo indicamos a la gema Nokogiri. Recordad que podemos leer diferentes formatos con este plugin.

url = «http://www.amazon.es/El-Libro-Selva-E-D-DVD/dp/B00EIBDJXC/ref=sr_1_2?ie=UTF8&qid=1394997324&sr=8-2&keywords=libro»
documento = Nokogiri::HTML(open(url))

En la variable documento tendremos toda la página web, por lo que ahora con ayuda de los métodos css(«clase o id») y at_css(«clase o id») podemos obtener el texto que contengan las clases o identificadores correspondientes. ¿Qué diferencia existe entre at_css o css?, con la primera de ella vamos a obtener el primer texto que se encuentre en la primera etiqueta y con el segundo método obtenemos todos los texto del documento.

En nuestro ejemplo queremos obtener el nombre del libro, y con ayuda de Firebug vemos que el nombre del identificador es «btAsinTitle», por lo que sería:

documento.at_css(«#btAsinTitle»).text
=>»\n \n El Libro de la Selva (E.D.) [DVD]\n \n \n »

Si queremos eliminar los espacios y los caráteres tenemos un método llamado strip(strip!), para realizarlo.

documento.at_css(«#btAsinTitle»).text.strip
«El Libro de la Selva (E.D.) [DVD]»

Así podriamos seguir obteniendo los datos necesarios, e incluso como las páginas de este tipo suelen tener todas el mismo formato, podríamos obtener mediante un array de URL todos los datos que nos pueda hacer falta para nuestra base de datos. Aunque es de «lógica» no está de mal comentar que si queremos obtener un texto entre etiquetas HTML que contienen clases CSS se expresa mediante un «.nombre-clase», y como un identificador ya lo hemos visto con el ejemplo anterior. Visto como podemos realizarlo dejo al lector experimentar con sus aplicaciones y buscarle su utilidad que seguro que se os ocurre realizar bastante cosas. Si os ha gustado +1 Google plus. Gracias!

Post relacionados