Cómo configurar Splash: Guía paso a paso de instalación y configuración
Scrapy Splash es una herramienta inmensamente potente que puede desbloquear nuevas oportunidades para el scraping de datos de sitios web dinámicos. Sin embargo, antes de empezar a cosechar los beneficios de Scrapy Splash, primero debemos configurar nuestros sistemas. Esto implica varios pasos esenciales, incluyendo la instalación de Docker, Splash, Scrapy, y las configuraciones necesarias para que todo funcione a la perfección.
1) Configuración e instalación de Docker
Docker es una tecnología puntera de contenedorización que nos permite aislar y ejecutar la instancia de Splash en un contenedor virtual, garantizando un funcionamiento fluido y coherente.
Para usuarios de Linux:
Ejecute el siguiente comando en el terminal:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Para otros sistemas operativos:
Los usuarios de Windows, macOS y otros sistemas operativos pueden encontrar guías de instalación detalladas en el sitio web de Docker.
2) Descarga e instalación de Splash mediante Docker
Con Docker instalado, puede proceder a descargar la imagen Splash Docker, una parte esencial de nuestra infraestructura de scraping.
Ejecuta el comando:
docker pull scrapinghub/splash
Esto descargará la imagen. Ahora ejecútalo con:
docker run -it -p 8050:8050 --rm scrapinghub/splash
¡Enhorabuena! Su instancia Splash ya está lista en localhost:8050. Debería ver la página Splash por defecto cuando visite esta URL en su navegador.
3) Instalación de Scrapy y del complemento Scrapy-Splash
Scrapy es un framework flexible de scraping, y el plugin scrapy-splash une Scrapy con Splash. Puede instalar ambos con:
pip install scrapy scrapy-splash
El comando anterior descarga todas las dependencias necesarias y las instala.
4) Creación del primer proyecto Scrapy
Comienza tu viaje de scraping con el siguiente comando:
scrapy startproject splashscraper
Esto crea un proyecto Scrapy llamado splashscraper con una estructura similar a:
splashscraper
├── scrapy.cfg
└── splashscraper
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
└── __init__.py
5) Integración de Scrapy con Splash
Ahora viene la parte esencial - configurar Scrapy para trabajar con Splash. Esto requiere modificar el archivo settings.py en tu proyecto Scrapy.
Configuración de Splash URL:
Defina una variable para su instancia Splash:
SPLASH_URL = 'http://localhost:8050'
Middlewares descargadores:
Estos ajustes permiten la interacción con Splash:
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
}
Spider Middlewares and Duplicate Filters:
Further, include the necessary Splash middleware for deduplication:
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
El resto de los ajustes pueden permanecer en sus valores por defecto.
Escribiendo un Scrapy Splash Spider
La extracción de datos de páginas web dinámicas puede requerir la interacción con JavaScript. Ahí es donde Scrapy Splash entra en juego. Al final de esta guía, usted sabrá cómo crear una araña utilizando Scrapy Splash para raspar las cotizaciones de quotes.toscrape.com.
Paso 1: Generar la araña
Usaremos el comando incorporado de Scrapy para generar una araña. El comando es:
scrapy genspider citas citas.toscrape.com
Tras la ejecución, se creará un nuevo archivo llamado quotes.py en el directorio spiders.
Paso 2: Comprender los fundamentos de una araña Scrapy
Abriendo quotes.py, encontrarás:
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
pass
- name: Nombre de la araña
- dominios_permitidos: Restringe la araña a los dominios listados
- start_urls: Las URL que se van a raspar
- analizar: El método invocado para cada URL
Paso 3: Extraer datos de una sola página
Ahora, hagamos que la araña sea funcional.
a) Inspeccionar elementos con un navegador web
Utiliza las herramientas de desarrollo para analizar la estructura HTML. Encontrarás cada cita encerrada en una etiqueta div con una cita de nombre de clase.
b) Preparar la clase SplashscraperItem
En items.py, modifícalo para incluir tres campos: autor, texto y etiquetas:
import scrapy
class SplashscraperItem(scrapy.Item):
autor = scrapy.Field()
texto = scrapy.Field()
etiquetas = scrapy.Field()
c) Implementar el método parse()
Importa la clase SplashscraperItem y actualiza el método parse en quotes.py:
from items import SplashscraperItem
def parse(self, response):
for quote in response.css("div.quote"):
text = quote.css("span.text::text").extract_first("")
author = quote.css("small.author::text").extract_first("")
tags = quote.css("meta.keywords::attr(content)").extract_first("")
item = SplashscraperItem()
item['text'] = text
item['author'] = author
item['tags'] = tags
yield item
Paso 4: Gestión de la paginación
Añadir código para navegar por todas las páginas:
next_url = response.css("li.next>a::attr(href)").extract_first("")
if next_url:
yield scrapy.Request(next_url, self.parse)
Paso 5: Añadir Splash Requests para contenido dinámico
Para utilizar SplashRequest, tendrás que hacer cambios en la araña actual:
from scrapy_splash import SplashRequest
def start_requests(self):
url = 'https://quotes.toscrape.com/'
yield SplashRequest(url, self.parse, args={'wait': 1})
Actualiza el método parse para utilizar también SplashRequest:
if next_url:
yield scrapy.SplashRequest(next_url, self.parse, args={'wait': 1})
¡Enhorabuena! Acabas de escribir una araña Scrapy completamente funcional que utiliza Splash para scrapear contenido dinámico. Ahora puedes ejecutar la araña y extraer todas las citas, autores y etiquetas de quotes.toscrape.com.
El código proporciona una excelente plantilla para el scraping de otros sitios web dinámicos con estructuras similares. ¡Feliz scraping!
Manejo de Splash Responses en Scrapy
Las respuestas Splash en Scrapy contienen algunas características únicas que difieren de las respuestas estándar de Scrapy. Se manejan de una manera específica, basada en el tipo de respuesta, pero el proceso de extracción se puede realizar utilizando métodos familiares de Scrapy. Profundicemos en ello.
Comprender cómo Splash responde a las solicitudes y su objeto de respuesta
Cuando Scrapy Splash procesa una petición, devuelve diferentes subclases de respuesta dependiendo del tipo de petición:
- SplashResponse: Para respuestas Splash binarias que incluyen archivos multimedia como imágenes, vídeos, audios, etc.
- SplashTextResponse: Cuando el resultado es textual.
- SplashJsonResponse: Cuando el resultado es un objeto JSON.
Análisis de datos de las respuestas de Splash
El parser incorporado de Scrapy y las clases Selector pueden ser empleadas para parsear Splash Responses. Esto significa que, aunque los tipos de respuesta son diferentes, los métodos utilizados para extraer datos de ellos siguen siendo los mismos.
He aquí un ejemplo de cómo extraer datos de una respuesta Splash:
text = quote.css("span.text::text").extract_first("")
author = quote.css("small.author::text").extract_first("")
tags = quote.css("meta.keywords::attr(content)").extract_first("")
Explicación:
- .css("span.text::text"): Esto usa selectores CSS para localizar el elemento span con clase text, y ::text le dice a Scrapy que extraiga la propiedad text de ese elemento.
- .css("meta.keywords::attr(content)"): Aquí, ::attr(content) se utiliza para obtener el atributo content de la etiqueta meta con clase keywords.
Conclusión
Manejar respuestas Splash en Scrapy no requiere ningún tratamiento especializado. Puedes seguir utilizando los métodos y sintaxis familiares para extraer datos. La principal diferencia radica en la comprensión del tipo de respuesta Splash devuelta, que podría ser un texto estándar, binario o JSON. Estos tipos pueden ser manejados de manera similar a las respuestas regulares de Scrapy, lo que permite una transición sin problemas si está agregando Splash a un proyecto Scrapy existente.
¡Feliz raspado con Splash!




