scrapy redis 简介
Scrapy-redis 是为了更方便地实现 Scrapy 分布式爬取,而提供了一些以 redis 为基础的
组件(仅有组件)。主体还是是 redis 和 scrapy 两个库,Scrapy-redis 像胶水一样,把这
两个插件粘结了起来。
特点:
能实现分布式爬取
可实现去重
持续性爬取,可实现增量式爬虫
遵守 Rule 规则,可以实现深度爬虫为什么选择redis数据库:
redis支持主从同步,而且数据都是缓存在内存中,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。
Redis 是一个开源的,内存数据库,它可以用作数据库、缓存和消息中间件。
它支持多种类型的数据结构:字符串,哈希,列表,集合,有序集合等
scrapy和scrapy-redis区别:
1.scrapy-redis 在 scrapy 的架构上增加了 redis
2.请求url放在set,生成指纹放在scrapy-redis里面
3.scrapy自己存储,scrapy-redis自动存储
4.Scrapy 本身不支持爬虫分布式,多个 spider 不能共享待爬取队列 Scrapy queue,
scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬
取的 request,便能让多个 spider 去同一个数据库里读取
基于 redis 的特性拓展了如下组件:
1. Scheduler
Scheduler 负责对新的 request 进行入列和出列的操作。
Scrapy 本身不支持爬虫分布式,多个 spider 不能共享待爬取队列 Scrapy queue,
scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬
取的 request,便能让多个 spider 去同一个数据库里读取。
2.Duplication Filter
Duplication Filter 利用了 redis 的 set 不重复的特性实现去重
scrapy-redis 调度器从引擎接受 request,将 request 的指纹存⼊redis 的 set 检查是否重
复,并将不重复的 request push 写⼊redis 的 request queue。引擎请求 request(Spider 发出的)时,调度器从 redis 的 request queue 队列⾥里根据优
先级 pop 出⼀个 request 返回给引擎,引擎将此 request 发给 spider 处理。
3.Item Pipeline
引擎将爬取到的 Item 传给 Item Pipeline,scrapy-redis 的 Item Pipeline 将爬取到的
Item 存⼊redis 的 items queue。
4.Base Spider
不在使用 scrapy 原有的 Spider 类,重写的 RedisSpider 继承了 Spider 和 RedisMixin 这
两个类,RedisMixin 是用来从 redis 读取 url 的类。
当我们生成一个 Spider 继承 RedisSpider 时,调用 setup_redis 函数,这个函数会去连接
redis 数据库,然后会设置 signals(信号):
一 个 是 当 spider 空 闲 时 候 的 signal , 会 调 用 spider_idle 函 数 , 这 个 函 数 调 用
schedule_next_request 函数,保证 spider 是一直活着的状态,并且抛出 DontCloseSpider
异常。
一个是当抓到一个 item 时的 signal,会调用 item_scraped 函数,这个函数会调用
schedule_next_request 函数,获取下一个 request。
三种爬虫类,针对不同的应用场景
第一种:应用场景:只做增量式爬虫
1、dmoz (class DmozSpider(CrawlSpider))
特点
继承的是 CrawlSpider
需要设置 Rule 规则,以及 callback 不能写 parse()方法。
它是用来说明 Redis 的持续性,可实现增量式爬虫当我们第一次运行 dmoz 爬虫,然后 Ctrl + C 停掉之后,再运行 dmoz 爬虫,之前的爬取记录是保留在 Redis 里的。
2、myspider_redis (class MySpider(RedisSpider))
特点
继承了 RedisSpider, 支持分布式抓取
需要写 parse 函数。
不需要写 start_urls 了,取而代之指定 redis_key,scrapy-redis 将 key 从 Redis 里
pop 出来,成为请求的 url 地址。
根据指定的格式,start_urls 将在 Master 端的 redis-cli 里 lpush 到 Redis 数据
库里,RedisSpider 将在数据库里获取 start_urls。
参考格式:redis_key = 'myspider:start_urls'
不需要写 allowd_domains执行方式
通过 runspider 方法执行爬虫的 py 文件(也可以分次执行多条),爬虫(们)将处于
等待准备状态:
scrapy runspider myspider_redis.py
在 Master 端的 redis-cli 输入 push 指令,参考格式:
$redis > lpush myspider:start_urls http://dmoztools.net/
Slaver 端爬虫获取到请求,开始爬取。3、mycrawler_redis (class MyCrawler(RedisCrawlSpider))
特点
爬虫继承了 RedisCrawlSpider
能够支持分布式的抓取
因为采用的是 crawlSpider,所以需要遵守 Rule 规则,可以实现深度爬虫
callback 不能设为 parse()方法。
不需要写 start_urls 了,取而代之的是 redis_key
scrapy-redis 将 key 从 Redis 里 pop 出来,成为请求的 url 地址。
源码 mycrawler_redis.py执行方式
通过 runspider 方法执行爬虫的 py 文件(也可以分次执行多条),爬虫(们)将处于
等待准备状态:
scrapy runspider mycrawler_redis.py
在 Master 端的 redis-cli 输入 push 指令,参考格式:
$redis > lpush mycrawler:start_urls http://www.dmoz.org/
爬虫获取 url,开始执行
数据存储:
items 数据直接存储在 Redis 数据库中,这个功能已经由 scrapy-redis 自行实现。除非
单独做额外处理(比如直接存入本地数据库等),否则不用编写 pipelines.py 代码。
分布式设置:
USER_AGENT 设置
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
去重过滤器的组件:
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
调度器的组件:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"持续化存储的:
SCHEDULER_PERSIST = TruePIPELINES 存储设置:
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,课件上的直接拷贝过来,不修改特别是k
'scrapy_redis.pipelines.RedisPipeline': 400,
}延迟一秒:
DOWNLOAD_DELAY = 1数据库设置:
实际的改为ip
#REDIS_HOST='192.168.10.132'主机,说明redis在本机,分布式以后不在主机上再修改
REDIS_HOST='127.0.0.1'端口
REDIS_PORT=6379密码:需要做验证
REDIS_PARAMS = {
'password': '123',
}Log 设置:
LOG_LEVEL = 'DEBUG'编码:
REDIS_ENCODING = "utf-8" # redis 编码类型默认:'utf-8'
增量抓虫:
指在具有一定量规模的网络页面集合的基础上,采用更新数据的方式选取已有集
合中的过时网页进行抓取,以保证所抓取到的数据与真实网络数据足够接近。进行增量式抓
取的前提是,系统已经抓取了足够数量的网络页面,并具有这些页面被抓取的时间信息。深度爬虫:
针对起始 url 地址进行数据采集,在响应数据中进行数据筛选得到需要进行数据
采集的下一波 url 地址,并将 url 地址添加到数据采集队列中进行二次爬取..以此类推,一致
到所有页面的数据全部采集完成即可完成深度数据采集,这里的深度指的就是 url 地址的检
索深度