Splash是Scrapy官方推荐的Javascript渲染引擎,使用Webkit开发的轻量级无页面浏览器,提供基于Http接口的Javascript渲染服务,支持
首先需要下载docker,docker-desktop只支持win10专业版,因此对于其他的win7,8,10用户需要下载docker toolbox下载链接,点击下载后直接安装,其中这一步需要全部安装。
安装完后从桌面打开Docker Quickstart Terminal。第一次运行时会在VirtualBox中安装boot2Docker-vm虚拟机,安装成功以后自动启动(这里不需要用户每次到VirtualBox中手动启动boot2Docker-vm虚拟机,执行Docker客户端后虚拟机自动启动)。
安装完Docker后需要安装Splash,在Docker里输入shell命令docker pull scrapinghub/splash
自动安装splash,之后输入docker run -p 8050:8050 -p 8051:8051 scrapinghub/splash
后在本机的8050和8051上开启Splash服务。
具体的splash用法自行去看文档,下面以一个实战来演示一下。爬取http://quotes.toscrape.com/js/中所有的名人名言
启动docker,打开splash
查看IPdocker-machine ip
,这就是下面将要使用的splash-Ip
首先安装scrapy-splash库,使用Anaconda prompt安装pip install scrapy-splash
,再创建项目scrapy.startproject splash_examples
,接着进入文件夹后创建模板scrapy genspider quotes quotes.toscrape.com
完成spider
# -*- coding: utf-8 -*-
import scrapy
from scrapy_splash import SplashRequest
class QuotesSpider(scrapy.Spider):
name = 'quotes'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/js/']
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, args = {'image': 0, 'timeout': 3})
pass
def parse(self, response):
for sel in response.css('div.quote'):
quote = sel.css('span.text::text').extract_first()
author = sel.css('small.author::text').extract_first()
yield {'quote' : quote, 'author' : author}
href = response.css('li.next>a::attr(href)').extract_first()
if href:
url = response.urljoin(href)
yield SplashRequest(url, args={'image': 0, 'timeout': 3})
pass
再去setting中进行配置
BOT_NAME = 'splash_examples'
SPIDER_MODULES = ['splash_examples.spiders']
NEWSPIDER_MODULE = 'splash_examples.spiders'
SPLASH_URL = 'http://***.***.***.***:8050/' # 上文中的Ip
FEED_EXPORT_ENCODING = 'GB2312' #导出文件的编码,如果不写会乱码
# 用来支持cache_args(可选)
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware' : 100,
}
# 开启Splash的两个下载中间件并调整HttpCompressionMiddleware的次序
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 733,
'scrapy_splash.SplashMiddleware' : 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
# 'splash_examples.middlewares.SplashExamplesDownloaderMiddleware': 543,
}
# 设置去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
再使用命令提示符进行爬取,完成!