9.Splash下载服务器
原生scrapy的下载器本质上就是twisted建立TCP连接,然后直接请求单个url返回响应,不能继续请求其他相关的静态资源(除非手动编码yield所有解析到的url,但是这样的编码显然太复杂)比如js/css,更不能渲染网页。如此简单的功能,不仅不能获取需要动态渲染才能获取到的内容,也容易被很多网站反爬。
所以必须采用新的下载器,新的下载器必须能够可以像浏览器一样只需请求基本的网址,然后自动获取所有相关的静态资源,且能够执行js,渲染css,得到与真实浏览器相似的页面。
splash这类下载器和selenium这类自动化测试工具都可以实现,两者各有优势。splash可以与scrapy深度结合,性能较佳,代码逻辑较清晰;selenium使用真实的浏览器引擎,是应对反爬的最佳选择,还可以通过代码模拟各种浏览器动作,功能强大,但缺点是与scrapy配合度不够,性能较差。
scrapy_splash库
scrapy_splash主要内容:
1.一些中间件。
2.去重。
3.http缓存。
4.重写了原生scrapy的Request和Response类。
splash安装配置
splash通过建立服务、监听独立的端口,通过httpAPI实现功能,scrapy发出的请求不再进入原生下载器,而是传递给splash服务的API,splash会请求url得到响应后返回给scrapy。
splash运行在docker容器内,可通过官方提供的shell命令安装和运行。
在爬虫工程的配置文件里修改或添加一些项:
yourproject/settings.py:
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'#基于splash的缓存
SPIDER_MIDDLEWARES = {
#磁盘缓存去重
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
}
SPLASH_URL = 'http://localhost:8050'
SplashRequest和SplashResponse类
均继承自原生scrapy的Request和Response类,并添加了许多参数选项。
需要重写RedisSpider的make_requests_from_url()方法,把默认的返回值Request对象改为SplashReqest对象,然后在所有的爬虫代码中把Request对象改为SplashRequest对象。
改写之后,则爬虫运行后,会停用scrapy原生下载器,而使用splash的下载器。