O Splash é um navegador headless leve, concebido especificamente para web scraping. Baseia-se no motor WebKit, que é o mesmo motor que alimenta o navegador Safari. O grande vantagem do Splash é que é fácil de configurar, especialmente se utilizar o Docker. Também está integrado com o Scrapy através do middleware scrapy-splash.
Para utilizar o middleware, terá primeiro de instalar este pacote com o pip:
$ pip install scrapy-splash
Configurar o Splash com o Docker é fácil. Basta executar uma instância do Splash na sua máquina local utilizando o Docker (https://docs.docker.com/get-docker/).
$ docker run -p 8050:8050 scrapinghub/splash
Depois disso, deverá conseguir aceder à instância local do Splash em http://localhost:8050/
O Splash possui uma API REST que facilita a sua utilização com o Scrapy ou qualquer outra ferramenta de web scraping. Pode testar o servidor fazendo um pedido de recuperação dentro do shell do Scrapy:
fetch('http://localhost:8050/render.html?url=<target_url>')
Para configurar o Middleware, adicione as seguintes linhas ao seu ficheiro 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'
Visite https://github.com/scrapy-plugins/scrapy-splash para saber mais sobre cada configuração.
A forma mais fácil de renderizar pedidos com o Splash é utilizar o scrapy_splash.SplashRequest dentro do seu 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
Pode adicionar um parâmetro «wait» para especificar o tempo que deseja que o Splash aguarde antes de devolver a sua solicitação.
Uma possível desvantagem de usar o Splash é que ele requer o uso da linguagem de script Lua para realizar ações como clicar em botões, preencher formulários e navegar para páginas.