Splash ist ein schlanker, headless Browser, der speziell für das Web-Scraping entwickelt wurde. Er basiert auf der WebKit-Engine, derselben Engine, die auch den Safari-Browser antreibt. Das Tolle an Splash ist, dass es einfach zu konfigurieren ist, besonders wenn du Docker verwendest. Es ist zudem über die scrapy-splash-Middleware in Scrapy integriert.
Um die Middleware zu nutzen, müssen Sie zunächst dieses Paket mit pip installieren:
$ pip install scrapy-splash
Die Einrichtung von Splash mit Docker ist einfach. Sie müssen lediglich eine Instanz von Splash auf Ihrem lokalen Rechner mit Docker ausführen (https://docs.docker.com/get-docker/).
$ docker run -p 8050:8050 scrapinghub/splash
Danach sollten Sie auf die lokale Splash-Instanz unter http://localhost:8050/ zugreifen können
Splash verfügt über eine REST-API, die die Verwendung mit Scrapy oder jedem anderen Web-Scraping-Tool vereinfacht. Sie können den Server testen, indem Sie eine Fetch-Anfrage innerhalb der Scrapy-Shell stellen:
fetch('http://localhost:8050/render.html?url=<target_url>')
Um die Middleware zu konfigurieren, fügen Sie die folgenden Zeilen in Ihre settings.py-Datei ein.
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'
Besuchen Sie https://github.com/scrapy-plugins/scrapy-splash, um mehr über die einzelnen Einstellungen zu erfahren.
Der einfachste Weg, Anfragen mit Splash zu rendern, ist die Verwendung von `scrapy_splash.SplashRequest` in Ihrem 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
Sie können einen „wait“-Parameter hinzufügen, um die Zeit anzugeben, die Splash warten soll, bevor Ihre Anfrage zurückgegeben wird.
Ein möglicher Nachteil der Verwendung von Splash ist, dass es die Verwendung der Skriptsprache Lua erfordert, um Aktionen wie das Klicken auf Schaltflächen, das Ausfüllen von Formularen und das Navigieren zu Seiten auszuführen.