
Por su mismo nombre, Scrapy, ya nos da una pista, Scrap + py.
Se trata de un framework de Python dedicado a despedazar páginas web para poder obtener los datos estructurados que nos interesan de las mismas. Scrapy fue diseñado originalmente para realizar “Web Scraping” pero también se puede utilizar para obtener información de otras fuentes como APIs o como un rastreador web.
Web scraping
Web Scraping es el proceso por el cual se extrae contenido y datos de una página web mediante la utilización de bots. Uno de los usos más extendidos es el de la indexación de páginas web por la mayoría de los motores de búsqueda, sin embargo, el enfoque principal de esta técnica es el análisis, transformación y almacenamiento de los datos obtenidos.
Los datos que se obtienen son generalmente los HTML de las páginas, aunque se puede obtener información de otras fuentes. Un ejemplo serían las respuestas recibidas de llamadas a servicios.
A parte del indexado de páginas web, otros ejemplos de aplicación de esta técnica son: comparadores de precios, detección de cambios en páginas web, integración de datos de otras webs, etc.
Un aspecto para destacar, es que no está del todo clara la legalidad de ciertos usos de esta técnica y que a lo largo de los años y principalmente en Estados Unidos se han dado varios casos de juicios por la recopilación y procesamiento de datos de empresas de terceros sin el consentimiento de esta. Un ejemplo, el producido entre American Airlines y FareChase, una empresa dedicada a la comparación de precios, el cuál acabó ganando la primera.
Los datos obtenidos mediante esta técnica no son distintos a los que puede obtener un usuario accediendo a una página web desde su navegador, es por esto por lo que protegerse es muy complejo y en general los distintos métodos que se pueden emplear suponen una merma en la usabilidad de las páginas web en cuestión. Un ejemplo muy claro y directo son los captchas.
Scrapy
Es un framework de código abierto bajo la licencia BSD modificada de 3 cláusulas que permite el uso libre del mismo siempre y cuando no se utilice el nombre de los titulares de derechos de autor o sus colaboradores sin permiso de estos.
Scrapy nos proporciona una estructura y esqueleto básicos para nuestros proyectos, lo cual nos permite tener todo organizado de forma clara. Cuando creamos un proyecto de scrapy se nos generan los siguientes ficheros y directorios (sacado del tutorial oficial de Scrapy):
tutorial/
scrapy.cfg # deploy configuration file
tutorial/ # project's Python module, you'll import your code from here
__init__.py
items.py # project items definition file
middlewares.py # project middlewares file
pipelines.py # project pipelines file
settings.py # project settings file
spiders/ # a directory where you'll later put your spiders
__init__.py
Aquí se pueden observar los tres elementos que considero que son los más importantes de conocer a la hora de realizar un proyecto con Scrapy: spiders, pipelines y middlewares.
Antes de entrar en detalles de implementación, en el que ahondaremos en otro artículo, voy a hablar un poco sobre cada uno de estos elementos:
Spiders
Los spiders son los protagonistas de esta historia o, por lo menos, son el elemento mínimo que tenemos que desarrollar para tener algo de funcionalidad. Estas arañas extraen datos en bruto del recurso que queramos procesar y se encargan de desmenuzarlo y extraer la información que nos interese además de navegar a otros recursos.
Como protagonistas de esta historia, cada spider debe tener un nombre único. Este nombre permite a Scrapy tener localizado e instanciado a cada spider por lo que no podemos tener dos spiders con el mismo nombre, pero si podemos tener varias instancias de un mismo spider.
A parte de ponerle un nombre, debemos situar a nuestra araña en una tela para que esta pueda hacer las cosas que hacen las arañas en una tela. Si el ejemplo es muy malo, que seguramente lo sea, lo que intento transmitir es que cada spider debe tener definidas una serie de URLs de las páginas web o recursos a tratar para poder trabajar sobre ellas.
En este punto, la araña tiene un nombre y una tela en la que vivir, le falta que le demos un empleo. Todos los spiders deben implementar la función “parse(response)”. Esta función es un generador que recibe una respuesta en forma de HTML. Por ejemplo, si estamos recorriendo una web y se encarga de procesar los datos y de navegar a nuevos recursos para cada URL definida en el apartado anterior.
Pipelines
Los pipelines son componentes con una función muy sencilla: reciben un objeto y realizan una acción sobre el mismo. Concretamente los pipelines se pueden utilizar para limpieza y validación de datos, búsqueda de duplicados, guardar los resultados en una base de datos, etc. Cada pipeline debe implementar obligatoriamente la función “process_item(self, item, spider)”. Esta función debe devolver un ítem, un Deferred o lanzar una excepción de DropItem.
Middlewares
Los middlewares son parte de un framework de hooks que permiten insertar funcionalidad personalizada para procesar las respuestas que son enviadas y recibidas de los spiders. Cada middleware debe estar definido en las setting de Scrapy y se le debe asignar un número según la prioridad de este. Scrapy tiene por defecto definidos una serie de middlewares que, por ejemplo, se encargan de manejar los errores HTTP que puedan devolver las llamadas a los recursos o de vigilar que los spiders no llamen a sitios fuera del dominio especificado.
Y con esto ya tenemos la base para empezar a trabajar con Scrapy. En futuros artículos explicaremos como implementarlo.