Tabla de Contenidos
Arquitectura e instalación de Scrapy
Módulo perteneciente al curso Python avanzado para proyectos de seguridad
Scrapy es un framework para Python que permite realizar tareas de webscraping y procesos de web crawling y análisis de datos.
Este framework también nos permite expandir su funcionalidad y al estar desarrollado en Python puede ejecutarse en los sistemas operativos Linux, Macintosh y Windows.
Aunque el objetivo principal de Scrapy es la extracción de datos de un sitio web, también se puede utilizar para extraer datos mediante el uso de APIs, obtener la estructura de un sitio web o actuar como un extractor información de propósito general. Scrapy tiene las siguientes características:
- Rápido y robusto: podemos escribir las reglas para extraer los datos y Scrapy hace el trabajo por nosotros.
- Fácilmente extensible: dada su configuración, podemos generar una nueva funcionalidad sin tener que modificar el código fuente.
- Multiplataforma: está escrito en Python y puede ejecutarse en Linux, Windows, Mac y BSD.
Scrapy tiene una serie de herramientas con el objetivo de scrapear o extraer información de sitios web de manera fácil y eficiente. Estas herramientas incluyen lo siguiente:
- Soporte para extraer y seleccionar datos de fuentes HTML/XML usando selectores CSS y expresiones XPath, con métodos para extraer usando expresiones regulares.
- Una consola interactiva en IPython para probar expresiones CSS y XPath para extraer datos, lo cual es muy útil al crear sus propios métodos.
- Soporte para exportar registros en múltiples formatos como JSON, CSV y XML
- Gran extensibilidad, ya que le permite conectar su propia funcionalidad utilizando señales, extensiones y pipelines.
Scrapy se puede decir que es la unión de un Crawler + Scraper
- Los web crawlers son robots que recorren sitios web, partiendo de una lista de urls y van siguiendo los links encontrados y descargando las páginas para su posterior procesamiento.
- Los web scrapers son utilizados para extraer datos estructurados (ej: diccionarios) a partir de contenido no estructurado, o semiestructurado (HTML)
Crawler (Rastreador): programa de software que visita virtualmente todas las páginas de Internet con el objetivo de crear índices para los motores de búsqueda. Por lo general, los rastreadores se centran más en los archivos de texto que en los gráficos.
Arquitectura de Scrapy
Scrapy permite escanear de forma recursiva los contenidos de un sitio web y aplicar un conjunto de reglas sobre dichos contenidos para extraer información que nos pueda resultar útil. Estos son los principales elementos de la arquitectura:
- Motor de scrapy (engine): El motor gestiona las peticiones y el flujo de datos entre todos los demás componentes.
- Planificador (planner): El planificador recibe las peticiones enviadas por el motor y las pone en cola.
- Downloader: El propósito del downloader es buscar todas las páginas web y enviarlas al motor. El motor posteriormente envía las páginas web a los spyders.
- Spiders (arañas): Rutinas de código que se encargan de realizar peticiones HTTP a un listado de dominios dados por el cliente y de aplicar reglas en forma de expresiones regulares o XPATH sobre el contenido retornado de las peticiones HTTP.
- Expresiones XPath: Con las expresiones XPath podemos llegar a un nivel bastante detallado de la información que queremos extraer. Por ejemplo, si queremos sacar los links de descarga de una página basta con obtener la expresión XPath del elemento y acceder al atributo href. Scrapy utiliza un mecanismo basado en expresiones XPATH llamado XPath selectors. Dichos selectores se encargan de aplicar reglas Xpath definidas por el desarrollador y de componer objetos Python que contienen la información extraída.
- Ítems: Los ítems son los objetos que generan los “XPath selectors”. Los ítems son como contenedores de información ya que permiten almacenar la información que retornan las reglas que aplicamos sobre los contenidos que vamos obteniendo. Básicamente, contienen los campos de la información queremos extraer.
- Ítem pipelines: Son elementos que procesan los ítems una vez estos han sido analizados por el spyder.
En esta imagen, puede ver una descripción general de la arquitectura Scrapy. La figura muestra en detalle cómo los componentes de la arquitectura Scrapy funcionan juntos donde el motor no se comunica directamente con los downloaders, sino que primero pasa la solicitud HTTP al scheduler o planificador.
Como se puede ver en la imagen anterior donde se muestra la arquitectura de scrapy, los spiders usan los ítems para pasar los datos al pipeline. Los spiders le hacen los requests, estos quedan planificados en el scheduler, y estos son los que realizar las peticiones al server, finalmente, cuando responde el server, esta respuesta es enviada de nuevo al spider, de forma que el spider se va retroalimentando con cada petición.
Instalación de Scrapy
Existen diversas herramientas y técnicas que permiten a un desarrollador o analista acceder, consumir y extraer contenido basado en la web.
Scrapy se creó a partir de Twisted, por lo que es capaz de realizar diversas peticiones de forma simultánea.
Del mismo modo, Scrapy utiliza herramientas como BeautifulSoup y el paquete Python XML para facilitar las búsquedas de contenido. Scrapy necesita lxml y OpenSSL como paquetes de requisitos previos para la instalación. Puede instalar Scrapy usando pip con el comando pip install scrapy.
Anaconda mantiene paquetes oficiales de scrapy para Linux, Windows y OS X en la siguiente URL: https://anaconda.org/anaconda/scrapy
Para instalar Scrapy usando conda, ejecute el siguiente comando:
$ conda install -c scrapinghub scrapy
Una vez instalado, es posible usar el comando scrapy desde la línea de comando, usando subcomandos al mismo tiempo.
En esta captura de pantalla, podemos ver todos los subcomandos scrapy disponibles:
Extrayendo información mediante scrapy shell
Scrapy Shell es una herramienta de línea de comandos que permite a los desarrolladores realizar pruebas de extracción de datos sobre una determinada url. Scrapy facilita este proceso al proporcionar un shell de línea de comandos, que toma una URL y crea un contexto de respuesta en el que probar las expresiones xpath y css. Llamar a scrapy en la línea de comandos de shell le mostrará los comandos básicos de scrapy.
Para comenzar, podemos abrir una sesión interactiva en scrapy Shell (scrapy shell). Posteriormente podemos utilizar el comando fetch para realizar una petición HTTP a una url pasada por parámetro y transferir los resultados con el objeto de response.
Por ejemplo, si queremos extraer el texto correspondiente al título de la página, podemos hacer con la expresión xpath //title/text():
>>> fetch('http://www.scrapy.org') >>> response.xpath('//title/text()').extract() >>> ['Scrapy | A Fast and Powerful Scraping and Web Crawling Framework']
En la siguiente captura de pantalla, puede ver el resultado de la ejecución del comando fetch en el shell Scrapy y extraer el título de la página con la expresión XPath:
En la anterior captura de pantalla estamos realizando una petición a la página oficial de scrapy para obtener el título de la página. En la variable response tenemos la respuesta realizada a dicha página.
Con la siguiente instrucción estamos extrayendo los enlaces de una determinada url:
>>> response.xpath('//a/@href').extract() ['https://scrapy.org', '../download/', '../doc/', '../resources/', '../community/', '../companies/', 'http://docs.scrapy.org/en/latest/faq.html', 'https://github.com/scrapy/scrapy', 'https://scrapinghub.com/', 'https://github.com/scrapy/scrapy/graphs/contributors', 'https://pypi.org/project/Scrapy', 'https://pypi.org/project/Scrapy', 'https://codecov.io/github/scrapy/scrapy?branch=master', 'https://pypi.org/project/Scrapy/', 'https://anaconda.org/conda-forge/scrapy', 'https://docs.scrapy.org/en/latest/news.html', 'https://scrapinghub.com/scrapy-cloud/', 'https://github.com/scrapy/scrapyd', 'https://github.com/scrapy/scrapy', 'https://twitter.com/ScrapyProject', 'http://stackoverflow.com/tags/scrapy/info', 'http://docs.scrapy.org/en/latest/intro/overview.html', '../companies/', 'https://twitter.com/ScrapyProject', 'https://scrapinghub.com/', 'https://github.com/scrapy/scrapy/graphs/contributors']
Uso de selectores
Para utilizar Scrapy es necesario definir aquellas reglas que Scrapy utilizará para la extracción de información. Dichas reglas pueden ser expresiones XPATH. Podemos usar los selectores para seleccionar algunas partes de los datos HTML obtenidos. Los selectores permiten seleccionar datos HTML usando expresiones XPath y CSS a través de response.xpath y response.css respectivamente.
En el siguiente ejemplo declaramos una cadena con etiquetas HTML y usamos la clase Selector para extraer los datos en la etiqueta h1 usando el método Selector.xpath():
>>> from scrapy.selector import Selector >>> body = '<html><body><h1>Extract data with selectorh1></body></html>' >>> Selector(text = body).xpath('//h1/text()').get() "Extract data with selector'
Actividad práctica: Obtener las expresiones xpath que podríamos usar para extraer información de una url
Extraer información de una determinada url utilizando expresiones xpath utilizando scrapy shell.
Dentro de la página de https://www.python.org/jobs, acceder a alguna de las ofertas de trabajo disponibles.
Información a extraer:
- Localización del trabajo
- Empresa
- Título del trabajo
- Descripción
Imagen con la información a extraer de la url de una oferta de trabajo previamente existente:
Solución
>>> fetch('https://www.python.org/jobs/7729') >>> response.xpath('//*[@id="content"]/div/section/article/h1/span[2]/a/text()').extract() ['Remote, Remote, USA'] >>> response.xpath('/html/body/div/div[3]/div/section/article/div[1]/text()').extract()[1].strip() 'Python Software Engineer' >>> response.xpath('//*[@id="content"]/div/section/article/h1/span[1]/span/text()[1]').extract()[0].strip() 'Python Software Engineer' >>> response.xpath('//*[@id="content"]/div/section/article/h1/span[1]/span/text()[3]').extract()[0].strip() 'HypothesisBase' >>> response.xpath('//*[@id="content"]/div/section/article/div[1]/p[2]/text()').extract()[0].strip() 'We need someone with experience in ML, data mining and jupyter notebooks.'




