Splash est un navigateur léger et sans interface graphique spécialement conçu pour le web scraping. Il est basé sur le moteur WebKit, le même que celui qui équipe le navigateur Safari. L'avantage de Splash est qu'il est facile à configurer, en particulier si vous utilisez Docker. Il est également intégré à Scrapy via le middleware scrapy-splash.
Pour utiliser ce middleware, vous devez d'abord installer ce paquet avec pip :
$ pip install scrapy-splash
La configuration de Splash avec Docker est simple. Il vous suffit de lancer une instance de Splash sur votre machine locale à l'aide de Docker (https://docs.docker.com/get-docker/).
$ docker run -p 8050:8050 scrapinghub/splash
Vous devriez ensuite pouvoir accéder à l'instance locale de Splash à l'adresse http://localhost:8050/
Splash dispose d'une API REST qui facilite son utilisation avec Scrapy ou tout autre outil de web scraping. Vous pouvez tester le serveur en effectuant une requête fetch dans le shell Scrapy :
fetch('http://localhost:8050/render.html?url=<target_url>')
Pour configurer le middleware, ajoutez les lignes suivantes à votre fichier 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'
Rendez-vous sur https://github.com/scrapy-plugins/scrapy-splash pour en savoir plus sur chaque paramètre.
La manière la plus simple de traiter les requêtes avec Splash est d'utiliser scrapy_splash.SplashRequest dans votre spider :
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
Vous pouvez ajouter un paramètre « wait » pour spécifier le temps d'attente souhaité avant que Splash ne renvoie votre requête.
L'un des inconvénients potentiels de l'utilisation de Splash est qu'il nécessite l'utilisation du langage de script Lua pour effectuer des actions telles que cliquer sur des boutons, remplir des formulaires et naviguer vers des pages.