分布式爬虫
分布式爬虫
scrapy框架是否可以自己实现分布式?
不可以
- 多台机器上部署的scrapy会各自拥有自己的调度器,这样就使得多台机器无法分配start_url列表中的url。即:多台机器无法共享同一个调度器。
- 多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久化储存。即:多台机器无法共享同一个管道。
基于scrapy-redis组件的分布式爬虫
- scrapy-redis组件中封装了可被多台机器共享的调度器和管道,可以让我们实现分布式爬虫。
- 实现方式:
- 基于该组件的RedisSpider类
- 基于该组件的RedisCrawlSpider类
- 分布式实现流程(两种相同):
- 下载scrapy-redis组件:pip install scrapy-redis
- 配置redis:
- 注释IP绑定,让其他ip可以访问redis:# bind 127.0.0.1。
- 将保护模式关闭,让其他ip可以操作redis:protect-mode no
- 修改爬虫文件中的相关代码
- 将爬虫类的父类修改为基于RedisSpider或RedisCrawlSpider。原始爬虫文件若基于Spider,则将父类修改为RedisSpider。若基于CrawlSpider,则将父类修改为RedisCrawlSpider。
- 注释或删除start_url列表,添加redis_key属性,属性值为scrapy-redis组件中调度器队列的名称。
- 在settings.py中进行相关配置,开启scrapy-redis中封装好的管道。
# 使用scrapy-redis中的调度器,保证每一台主机爬取的url地址是不同的 SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # 配置scrapy使用的去重类 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 300 }