分布式爬虫
-
什么是分布式爬虫
- 基于多台电脑组件一个分布式机群,然后让每一台电脑执行同一组程序,让后让他们对同一个网站的数据进行分布式爬取
-
为什么使用分布式爬虫
- 提示爬取数据效率
-
如何实现分布式爬虫
- 基于scrapy + redis 的形式实现分布式
- 原生的scrapy框架不能实现分布式,原因:
- 调度器无法被分布式机群共享
- 管道无法数据共享
- scrapy框架和scrapy-redis 组件实现的分布式
- scrapy-redis 组件作用:
- 提供可以被共享的调度器和管道
- 原生的scrapy框架不能实现分布式,原因:
- 基于scrapy + redis 的形式实现分布式
环境安装
- redis
- pip install scrapy-redis
编码流程
-
创建一个工程
-
创建一个爬虫文件:基于CrawlScrapy
- 修改当前的爬虫文件
- 导包:from scrapy_redis.spiders import RedisCrawlSpider
- 将当前爬虫类的父类修改成RedisCrawlSpider
- 将start_urls替换成redis_key = ‘xxx’ #表示的是可被共享调度器中队列的名称
- 编写爬虫类爬取数据的操作
- 修改当前的爬虫文件
-
对settings进行配置:
-
指定管道:
# 开启可以被共享的管道 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的配置文件进行配置:redis.windows.conf
-取消ip绑定:#bind 127.0.0.1
-取消安全模式:protected-mode no- 携带配置文件启动redis服务
- ./redis-server redis.windows.conf
- 启动redis的客户端
- redis-cli
- 携带配置文件启动redis服务
-
执行当前的工程:
进入到爬虫文件对应的目录中:scrapy runspider xxx.py
-
向调度器队列中仍入一个起始的url:
- 队列在哪里呢?答:队列在redis中
- lpush fbsQueue www.xxx.com
- 队列在哪里呢?答:队列在redis中