- 分布式 - 概念:需要搭建一个分布式的机群,然后在机群的每一台电脑中执行同一组程序,让其对某一个网站的数据进行联合分布爬取。 - 原生的scrapy框架是不可以实现分布式? - 因为调度器不可以被共享 - 管道不可以被共享 - 如何实现分布式? - scrapy+scrapy_redis实现分布式 - scrapy-redis组件的作用是什么? - 可以提供可被共享的调度器和管道 - 特性:数据只可以存储到redis数据库。 - 分布式的实现流程: - 1.pip install scrapy-redis - 2.创建工程 - 3. cd 工程目录中 - 4.创建爬虫文件(a.创建基于Spider的爬虫文件 b.创建CrawlSpider的爬虫文件) - 5.修改爬虫类: - 导报:from scrapy_redis.spiders import RedisCrawlSpider - 修改当前爬虫类的父类为RedisCrawlSpider - allowed_domains和start_urls删除 - 添加一个新属性:redis_key = 'fbsQueue',表示的是可以被共享的调度器队列的名称 - 编写爬虫类的其他操作(常规操作) - 6.settings配置文件的配置 - UA伪装 - Robots - 管道的指定: ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 } - 指定调度器: # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据 SCHEDULER_PERSIST = True - 指定redis数据库 REDIS_HOST = 'redis服务的ip地址' REDIS_PORT = 6379 REDIS_PARAMS = { 'password': 'admin', } - redis的配置文件进行配置redis.windows.conf: - 关闭默认绑定:56Line:#bind 127.0.0.1 - 关闭保护模式:75Line:protected-mode no - 启动redis的服务端和客户端: - redis-server.exe redis.windows.conf - redis-cli
- 启动程序: scrapy runspider xxx.py - 向调度器的队列中仍入一个起始的url: - 队列是存在于redis中 - 开启redis的客户端: lpush fbsQueue http://wz.sun0769.com/index.php/question/questionType?type=4&page=