分布式爬虫实现步骤:
1.安装一个scrapy-redis的组件
原生的scrapy不能实现分布式爬虫,必须要让scrapy结合scrapy-redis组件一起实现分布式爬虫。原因是因为原生的scrapy的调度器和管道不可以被分布式集群共享,不能实现集群之间整体的调度。scrapy-redis组件的作用可以给原生的scrapy框架提供可以被共享的管道和调度器。
2.实现流程
- 创建一个工程
- 创建一个基于CrawlSpider的爬虫文件
- 修改当前的爬虫文件:
- 导包:from scrapy_redis.spider import RedisCrewlSpider
- 将start_urls和allowed_domains进行注释
- 添加一个新的属性:redis_key='xxx' (可以被共享的调度器队列的名称)
- 编写数据解析相关的操作
- 将当前爬虫类的父类修改成RedisCrawlSpider
- 修改配置文件settings
- 指定使用可以被共享的管道:
ITEM_POPELINES={
‘scrapy_redis.pipelines.RedisPipeline': 400
}
-
- 指定调度器:
- 增加一个去重容器类的配置,使用Redis的set集合来存储请求的数据,实现信息去重持久化
- 指定调度器:
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
-
-
- 使用scrapy-redis组件自己的调度器
-
SCHEDULER = "scrapy_redis.scheduler.RFPDupeFilter"
-
-
- 配置调度器是否要持久化,即爬虫结束,是否要清空redis中请求队列
-
SCHEDULER_PERSIST = True
-
-
- 指定redis服务器:
- 配置redis的配置文件redis.conf
- 将bind 127.0.0.1删除
- 关闭保护模式:protected-mode yes改为no
- 启动redis
- 配置redis的配置文件redis.conf
- 指定redis服务器:
-
- 执行工程:
- scrapy runspider xxx.py
- 向调度器的队列中放入一个起始的url
- 调度器的队列在redis的客户端中:lpush xxx www.xxx.com