scrapy_redis
scrapy是一个通用的爬虫框架,但是不支持分布式,scrapy_redis是为了更方便的实现scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。
scrapy_redis工作原理:
- 调度器将不再负责Url的调度,而是将url上传给scrapy_redis组件,由组件负责组织、去重
- redis组件会通过指纹(key)来进行去重操作,并且把请求对象分发给不同的客户端
- 客户端拿到请求对象后,再交给引擎–下载器
- pipeline不再负责本地化操作,而是把数据交给redis组件来负责写入redis数据库,达到资源共享、自动合并的目的
scrapy_redis组成:
Scheduler 调度器,scrapy本身不支持爬虫分布,scrapy_redis的解决是把这个scrapy queue换成redis数据库(也是指redis队列),从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。
Duplication Filter 指纹过滤器,scrapy用集合实现这个request去重功能,scrapy中把已经发送的request指纹放到一个集合中,把下一个request的指纹放到集合中比对,如果该指纹存在于集合中,说明这个request发送过了,如果没有则继续操作。
Item Pipeline 管道,引擎将(spider返回的)爬取到的item给Item Pipeline,scrapy_redis的Item Pipeline将爬取到的item存入redis的items pipeline。
Base Spider
分布式爬虫例子(爬取读书网的图书名称和封面图片链接,常规设置或者不需要修改的部分代码就没贴了):