Scrapy 教程(八)-分布式爬虫

scrapy 自己并非一个分布式框架,而 Scrapy-redis 库使得分布式成为可能;git

Scrapy-redis 并无重构框架,而是基于redis数据库重写了框架的某些组件。github

 

分布式框架要解决两个问题

分配爬取任务:为每一个爬虫分配不重复的任务redis

scrapy-redis 使用 redis 数据库存储全部请求,利用 redis 数据库实现请求队列,全部爬虫从该队列中获取任务,并将新产生的请求添加到该队列中;数据库

 

汇总爬取数据:将全部爬虫的数据汇总到一处服务器

scrapy-redis 使用 RedisPipeline 将数据存储于同一个 redis 数据库中,并用 twisted 框架实现并发存储。网络

 

具体实现参考并发

Scrapy-redis 源码  https://github.com/rmax/scrapy-redis/tree/master/src/scrapy_redis框架

 

环境搭建

1. 多台服务器scrapy

2. 分别配置 单机爬虫 所需环境分布式

3. 选择一台服务器搭建 redis 数据库

4. 测试集群可否链接 redis

 

具体实施

1. 建立单机项目

2. 修改配置文件

# 必选项 # ================================================================= # 指定爬虫所使用的Redis数据库(在云服务器116.29.35.201 上)
REDIS_URL = 'redis://116.29.35.201:6379'
# 使用scrapy_redis的调度器替代Scrapy 原版调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 使用scrapy_redis的RFPDupeFilter做为去重过滤器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 启用scrapy_redis的RedisPipeline将爬取到的数据汇总到Redis数据库
ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300, } # 可选项 # ================================================================= #爬虫中止后,保留/清理Redis中的请求队列以及去重集合 # True:保留,False:清理,默认为False
SCHEDULER_PERSIST = True

3. 修改爬虫

from scrapy_redis.spiders import RedisSpider # 1.更改基类 # class BooksSpider(spider.Spider):
class BooksSpider(RedisSpider): # 2.注释 start_urls # start_urls = ['http://books.toscrape.com/']

【如何为多个爬虫设置起始爬取点】

单机爬虫 的起始爬取点由 start_urls 肯定,可是分布式去掉了 start_urls,而后重写了 start_requests 方法,它尝试从 redis 数据库的某个特定列表中获取起始爬取点,构造request对象,并设置 dont_filter=False,

该列表可经过配置文件设定,REDIS_START_URLS_KEY,默认为 <spider_name>:start_urls;

在分布式爬取时,运行全部爬虫后,须要手动向该列表添加起始爬取点,以后只有其中一个爬虫获取到该起始点,避免重复。

4. 分发代码到其余机器

5. 每台机器上运行爬虫

6. 爬虫处于等待状态,在任一台机器上链接redis,设置爬取起始点

lpush books:start_urls 'http://books.toscrape.com'

其中一个爬虫获取该url,此后整个爬虫开始运转。

 

 

参考资料:

《精通scrapy网络爬虫》   pdf

相关文章
相关标签/搜索