Splash 是一款专为网络爬虫设计的轻量级无头浏览器。它基于 WebKit 引擎,该引擎同样驱动着 Safari 浏览器。Splash 的优势在于易于配置,尤其是配合 Docker 使用时。它还通过 scrapy-splash 中间件与 Scrapy 集成。
要使用该中间件,您首先需要通过 pip 安装此包:
$ pip install scrapy-splash
使用 Docker 配置 Splash 非常简单。您只需在本地机器上通过 Docker 运行一个 Splash 实例(https://docs.docker.com/get-docker/)。
$ docker run -p 8050:8050 scrapinghub/splash
之后,您应该能够通过 http://localhost:8050/ 访问本地 Splash 实例
Splash 提供了一个 REST API,使其能够轻松与 Scrapy 或任何其他网络爬虫工具配合使用。您可以在 Scrapy 控制台中发送一个 fetch 请求来测试服务器:
fetch('http://localhost:8050/render.html?url=<target_url>')
要配置中间件,请在 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'
访问 https://github.com/scrapy-plugins/scrapy-splash 以了解各项设置的详细说明。
使用 Splash 渲染请求的最简单方法是在您的蜘蛛(spider)中使用 scrapy_splash.SplashRequest:
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
您可以添加一个“wait”参数,指定 Splash 在返回请求前需要等待的时间。
使用 Splash 的一个潜在缺点是,它需要借助 Lua 脚本语言来执行点击按钮、填写表单和跳转页面等操作。