Tutorial de Scrapy Splash: Dominar el arte del scraping de sitios web renderizados en JavaScript con Scrapy y Splash
Ștefan Răcila el 10 Ago 2023

En el complejo panorama web actual, en el que los contenidos se generan a menudo de forma dinámica mediante JavaScript, llamadas AJAX u otros scripts del lado del cliente, el scraping de información se convierte en una tarea complicada. Las técnicas tradicionales de scraping pueden fallar a la hora de extraer datos que se cargan de forma asíncrona, lo que requiere un enfoque más sofisticado. Aquí es donde Scrapy Splash entra en escena.
Scrapy Splash es un navegador aerodinámico equipado con una API HTTP. A diferencia de los navegadores más voluminosos, es ligero pero potente, diseñado para raspar sitios web que renderizan su contenido con JavaScript o mediante procedimientos AJAX. Al simular el comportamiento de un navegador real, Scrapy Splash puede interactuar con elementos dinámicos, lo que lo convierte en una herramienta inestimable para cualquier necesidad de extracción de datos relacionada con contenidos renderizados con JavaScript.
En esta guía completa, exploraremos las capacidades únicas de Scrapy Splash, ilustrando paso a paso cómo aprovechar esta herramienta de manera efectiva para raspar datos de sitios web que utilizan JavaScript para la renderización. Tanto si eres un minero de datos experimentado como si acabas de empezar, comprender las funcionalidades de Scrapy Splash te permitirá obtener la información que necesitas de una web cada vez más dinámica.
Quédate con nosotros mientras nos adentramos en los entresijos del uso de Scrapy Splash para el scraping de la web moderna e interactiva, empezando por su instalación y terminando con ejemplos reales.
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):
author = scrapy.Field()
text = scrapy.Field()
tags = 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!
Noticias y actualidad
Manténgase al día de las últimas guías y noticias sobre raspado web suscribiéndose a nuestro boletín.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Artículos relacionados

Explore la comparación en profundidad entre Scrapy y Selenium para el scraping web. Desde la adquisición de datos a gran escala hasta la gestión de contenido dinámico, descubra los pros, los contras y las características únicas de cada uno. Aprenda a elegir el mejor marco de trabajo en función de las necesidades y la escala de su proyecto.


Explore una comparación detallada entre Scrapy y Beautiful Soup, dos herramientas líderes de raspado web. Comprende sus características, pros y contras, y descubre cómo pueden utilizarse juntas para adaptarse a las necesidades de distintos proyectos.


Conozca cuál es el mejor navegador para eludir los sistemas de detección de Cloudflare mientras hace web scraping con Selenium.
