Splash es un navegador ligero y sin interfaz gráfica diseñado específicamente para el web scraping. Se basa en el motor WebKit, el mismo que utiliza el navegador Safari. Lo mejor de Splash es que es fácil de configurar, especialmente si utilizas Docker. Además, está integrado con Scrapy a través del middleware scrapy-splash.
Para utilizar el middleware, primero tendrás que instalar este paquete con pip:
$ pip install scrapy-splash
Configurar Splash con Docker es fácil. Solo tienes que ejecutar una instancia de Splash en tu máquina local utilizando Docker (https://docs.docker.com/get-docker/).
$ docker run -p 8050:8050 scrapinghub/splash
Después de eso, deberías poder acceder a la instancia local de Splash en http://localhost:8050/
Splash cuenta con una API REST que facilita su uso con Scrapy o cualquier otra herramienta de web scraping. Puedes probar el servidor realizando una solicitud fetch dentro del shell de Scrapy:
fetch('http://localhost:8050/render.html?url=<target_url>')
Para configurar el middleware, añade las siguientes líneas a tu archivo settings.py.
SPLASH_URL = 'http://localhost:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
Visita https://github.com/scrapy-plugins/scrapy-splash para obtener más información sobre cada configuración.
La forma más sencilla de procesar solicitudes con Splash es utilizar scrapy_splash.SplashRequest dentro de tu araña:
import scrapy
from scrapy_splash import SplashRequest
class RandomSpider(scrapy.Spider):
name = 'random_spider'
def start_requests(self):
start_urls = [
'<first_url',
'<second_url>'
]
for url in start_urls:
yield SplashRequest(url=url, callback=self.parse, args={'wait': 5})
def parse(self, response):
result = response.css("h3::text").extract()
yield result
Puedes añadir un parámetro «wait» para especificar el tiempo que quieres que Splash espere antes de devolver tu solicitud.
Una posible desventaja de utilizar Splash es que requiere el uso del lenguaje de scripting Lua para realizar acciones como hacer clic en botones, rellenar formularios y navegar por páginas.