爬虫---scrapy分布式和增量式
分布式
-
概念: 需要搭建一个分布式的机群, 然后在每一台电脑中执行同一组程序, 让其对某一网站的数据进行联合分布爬取.
-
原生的scrapy框架不能实现分布式的原因
- 调度器不能被共享,
- 管道也不能被共享.
-
scrapy + scrapy-redis 可以实现分布式
-
scrapy-redis组件的作用:
- 可以提供可被共享的调度器和管道
- 特性: 数据只可以存储到redis数据库中
-
分布式的实现流程:
-
安装组件
pip install scrapy-redis
-
创建scrapy工程
-
cd 工程目录中
-
创建爬虫文件: 基于Spider的爬虫或者基于CrawlSpider的爬虫
-
修改爬虫类:
- 导包
from scrapy_redis.spiders import RedisCrawlSpider
- 修改当前爬虫类的父类为 RedisCrawlSpider
- allowed_domains和start_urls删除
- 添加一个新属性:
redis_key = 'fbsQueue'
, 表示的是可以被共享的调度器队列名称 - 编写爬虫类的常规操作
- 导包
-
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_HOST = 'redis服务器的ip地址' REDIS_PORT = 6379
-
redis的配置文件进行配置 redis.windows.conf
- 关闭默认绑定: 56行注释: bind 127.0.0.1
- 关闭保护模式: 75行: protected=mode no
- 启动redis的服务端和客户端
redis-server.exe redis.windows.conf redis-cli
-
启动程度
scrapy runspider xxx.py
-
向调度器的队列中仍入一个起始的url:
- 队列是存在于redis中
- 开启redis的客户端:
lpush fbsQueue https://movie.douban.com/top250?start=0&filter=
-
增量式
- 概念: 用于监测网站数据更新的情况
- 核心机制: 去重, 可以使用redis的set实现去重