浅析scrapy与scrapy_redis区别

近在工作中写了很多 scrapy_redis 分布式爬虫,但是回想 scrapy 与 scrapy_redis 两者区别的时候,竟然,思维只是局限在了应用方面,于是乎,搜索了很多相关文章介绍,这才搞懂内部实现的原理 。
首先我们从整体上来讲
scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式 。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合 。而为什么选择redis数据库,是因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高 。
有一篇文章是这么说的: scrapy-redis 与 Scrapy 的关系就像电脑与固态硬盘一样,是电脑中的一个插件,能让电脑更快的运行 。

浅析scrapy与scrapy_redis区别

文章插图
 
Scrapy 是一个爬虫框架,scrapy-redis 则是这个框架上可以选择的插件,它可以让爬虫跑的更快 。
说的一点都对,Scrapy 是一个通用的爬虫框架,scrapy-redis 则是这个框架上可以选择的插件,为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件),它可以让爬虫跑的更快 。
然后介绍 scrapy 框架的运行流程及原理
scrapy作为一款优秀的爬虫框架,在爬虫方面有这众多的优点 。能快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据 。
浅析scrapy与scrapy_redis区别

文章插图
 
为了方便理解,我找到了一张这样的图片:
浅析scrapy与scrapy_redis区别

文章插图
 
解释说明:
1、从优先级队列中获取request对象,交给engine
2、engine将request对象交给下载器下载,期间会通过downloadmiddleware的process_request方法
3、下载器完成下载,获得response对象,将该对象交给engine,期间会经过downloadmiddleware的process_response( )方法
4、engine将获得的response对象交给spider进行解析,期间会经过spidermiddleware的process_spider_input()的方法
5、spider解析下载器下下来的response,返回item或是links(url)
6、item或者link经过spidermiddleware的process_spider_out( )方法,交给engine
7、engine将item交给item pipeline,将links交给调度器
8、在调度器中,先将requests对象利用scrapy内置的指纹函数生成一个指纹
9、如果requests对象中的don't filter参数设置为False,并且该requests对象的指纹不在信息指纹的队列中,那么就把该request对象放到优先级队列中
浅析scrapy与scrapy_redis区别

文章插图
 
循环以上操作
中间件主要存在两个地方,从图片当中我们可以看到:
spider 与 engine 之间(爬虫中间件):
介于Scrapy引擎和爬虫之间的框架,主要工作是处理爬虫的响应输入和请求输出
download 与 engine 之间(下载器中间件) :
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应
借此机会,我们结合程序,解析一下框架中的 middleware.py :
1. Spider Middleware有以下几个函数被管理:
- process_spider_input 接收一个response对象并处理,
位置是Downloader-->process_spider_input-->Spiders(Downloader和Spiders是scrapy官方结构图中的组件)
- process_spider_exception spider出现的异常时被调用
- process_spider_output 当Spider处理response返回result时,该方法被调用
- process_start_requests 当spider发出请求时,被调用
2. Downloader Middleware有以下几个函数被管理
- process_request request通过下载中间件时,该方法被调用,这里可以设置代理,设置request.meta['proxy'] 就行
- process_response 下载结果经过中间件时被此方法处理
- process_exception 下载过程中出现异常时被调用
个人理解scrapy的优缺点:
优点:scrapy 是异步的,写middleware,方便写一些统一的过滤器
缺点:基于python的爬虫框架,扩展性比较差,基于twisted框架,运行中的exception是不会干掉reactor,并且异步框架出错后是不会停掉其他任务的,数据出错后难以察觉 。
scrapy_redis分布式爬虫
最后回到我们这篇文章的重点(敲黑板...)
Scrapy-redis提供了下面四种组件(components):(四种组件意味着这四个模块都要做相应的修改)


推荐阅读