目录
分布式爬虫
分布式爬虫是由一组通过网络进行通信、为了完成共同的爬虫任务而协调工作的计算机节点组成的系统 。分布式爬虫是将多台电脑组合起来,共同完成一个爬虫任务,大大提高爬取效率。
PS:一般情况下在同一局域网内才能实现爬取。
Scrapy-Redis
Scrapy
是一个通用的爬虫框架,但是不支持分布式,
Scrapy-redis是为了更方便地实现
Scrapy
分布式爬取,而提供了一些
以redis为基础
的组件。
正常scrapy单机爬虫
分布式
安装
pip install scrapy-redis
scrapy-redis提供四种组件
-
Scheduler(调度器)
Scrapy 改造了 Python 本来的 collection.deque(双向队列) 形成 了自己的 Scrapy queue ,但是 Scrapy 多个 spider 不能共享待 爬取队列Scrapy queue ,即 Scrapy 本身不支持爬虫分布式 , scrapy-redis 的解决是把这个 Scrapy queue 换成 redis 数据库(也是指 redis队列) ,便能让 多个spider去同一个数据库里读取 ,这样实现共享爬取队列。Redis支持多种数据结构,这些数据结构可以很方便的实现这 样的需求:
- 列表有lpush(),lpop(),rpush), rpop(),这些方法可以实 现先进先出,或者先进后出式的爬取队列。
- 集合元素是无序且不重复的,可以很方便的实现随机排序且不重复的爬取队列。
- Scrapy的Request带有优先级控制,Redis中的集合也是带有分数表示的,可以用这个功能实现带有优先级调度的爬取队列。
-
Duplication Filter (去重)
Scrapy 自带去重模块,该模块使用的是 Python 中的集合类 型。该集合会记录每个请求的指纹,指纹也就是 Request的散列值 。指纹的计算采用的是hashlib 的 sha1() 方法。计算的字段 包含了,请求的Method , URL , Body , Header 这几个内容,这些字符串里面只要里面有一点不同,那么计算出来的指 纹就是不一样的。也就是说,计算的结果是加密后的字符串,这就是请求指纹。通过加密后的字符串,使得每个请求都是唯一的,也就是指纹是惟一的。并且指纹是一个字符串,在判断字符串的时候,要比判断整个请求对象容易。所以采用了 指纹作为判断去重的依据 。
-
ltem Pipeline(管道)
引擎将(Spider返回的)爬取到的ltem给ltem Pipeline , scrapy-redis 的ltem Pipeline将爬取到的Item存入redis的 items queue。 修改过 ltem Pipeline 可以很方便的根据 key 从 itemsqueue 提取 item ,从而 实现 items processes集群 。
-
Base Spider(爬虫类)
不再使用scrapy原有的Spider类,重写的RedisSpider继承了Spider和RedisMixin这两个类