浅析scrapy与scrapy-redis的区别
首先,要了解两者的区别,就要清楚scrapy-redis是如何产生的,有需求才会有发展,社会在日新月异的飞速发展,大量相似网页框架的飞速产生,人们已经不满足于当前爬取网页的速度,因此有了分布式爬虫,让其可以并行的爬取更多但又不尽相同的网页,这样大大节省了之前同步完成页面爬取所浪费的时间,同步与异步的差距不是一点点的,所以scrapy-redis更加适应于当前形势。好了,步入正轨。
两者的主要区别就是scrapy-redis在scrapy的基础上增加了redis数据库,同时呢,由于这个redis数据库的存在,就导致了几大新增组件应运而生,---可以实现分布式爬虫,---简单url去重,---持续性爬取,增量式爬虫,---以及遵守Rule规则可以实现深度爬虫等等。下面具体阐述在redis加入之后造成的具体模块改变。
一、Scheduler(调度器模块)
Scheduler 负责对新的 request 迕行入列和出列的操作。 Scrapy 本身丌支持爬虫分布式,多个 spider 丌能共享待爬取队列 Scrapy queue, scrapy-redis 把 Scrapy queue 换成 redis 数据库,用同一个 redis-server 存放要爬 取的 request,便能让多个 spider 去同一个数据库里读取。
二、Duplication Filter(redis set去重)
Duplication Filter 利用了 redis 的 set 不重复的特性实现去重 scrapy-redis 调度器从引擎接受 request,将 request 的指纹存⼊redis 的 set 检查是否重 复,并将丌重复的 request push 写⼊redis 的 request queue。引擎请求 request(Spider 发出的)时,调度器从 redis 的 request queue 队列⾥里根据优 先级 pop 出⼀个 request 迒回给引擎,引擎将此 request 发给 spider 处理。
三、Item Pipeline(管道模块)
引擎将爬取到的 Item 传给 Item Pipeline,scrapy-redis 的 Item Pipeline 将爬取到的 Item 存⼊redis 的 items queue。
四、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。
浅析scrapy与scrapy-redis的区别的更多相关文章
- <scrapy爬虫>scrapy命令行操作
1.mysql数据库 2.mongoDB数据库 3.redis数据库 1.创建项目 scrapy startproject myproject cd myproject 2.创建爬虫 scrapy g ...
- python爬虫scrapy之scrapy终端(Scrapy shell)
Scrapy终端是一个交互终端,供您在未启动spider的情况下尝试及调试您的爬取代码. 其本意是用来测试提取数据的代码,不过您可以将其作为正常的Python终端,在上面测试任何的Python代码. ...
- 第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
第三百三十一节,web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令 Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --u ...
- Scrapy之Scrapy shell
Scrapy Shell Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据 ...
- 十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
Scrapy框架安装 1.首先,终端执行命令升级pip: python -m pip install --upgrade pip2.安装,wheel(建议网络安装) pip install wheel ...
- Django缓存系统选择之Memcached与Redis的区别与性能对比
Django支持使用Memcached和Redis这两种流行的内存型数据库作为缓存系统.我们今天来看Memcached和Redis的区别和性能对比. redis和memcached的区别 1.Redi ...
- scrapy - 给scrapy 的spider 传值
scrapy - 给scrapy 的spider 传值 方法一: 在命令行用crawl控制spider爬取的时候,加上-a选项,例如: scrapy crawl myspider -a categor ...
- MySql、Mongodb和Redis的区别
NoSQL 的全称是 Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路. M ...
- python - scrapy 爬虫框架 ( redis去重 )
1. 使用内置,并加以修改 ( 自定义 redis 存储的 keys ) settings 配置 # ############### scrapy redis连接 ################# ...
- Scrapy中scrapy.Request和response.follow的区别
在写scrapy的spider类的parse方法的时候,有些链接需要提取出来继续爬取,这里scrapy提供了一些方法可以方便的实现这个功能,总结如下: 假设我们的目标a标签是target_a 方法1: ...
随机推荐
- foreach数组并直接改变数组内容
<?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * 2; } // $arr is ...
- 从0开始独立完成企业级Java电商网站开发(服务端)
数据表结构设计 唯一索引unique,保证数据唯一性 CREATE TABLE `mmall_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT ...
- 【java基础】接口是否能有实现类?
接口是否能有实现方法 我的回答: 当然可以 java8以后就允许接口有实现方法: default修饰的方法 static修饰的方法 /** * 能用lambda的情况,接口里面只有一个未实现的方法 * ...
- 五、docker-compose开锋(docker 三剑客)
前言 终于写到docker-compose了,其实我最开始接触docker的时候,是因为一个开源项目需要用docker 环境和docke-compose 所以我最先接触的是docker-compse ...
- IIS部署WCF疑难
1.其他信息: 无法激活请求的服务. 可能原因:1. 服务的命名空间和接口的命名空间不一致.2. 传递的参数类型没有打上[DataContract], [DataMember]标签. 2.记得这样: ...
- Alibaba 镜像
<mirrors> <mirror> <id>alimaven</id> <name>aliyun maven</name> ...
- NOIP模拟18 T2
不知道为什么很多人拒绝这题打搜索...其实搜索在充分剪枝后时间是非常优秀的,不管数据怎样基本都可跑出 首先一个显然结论:对于某种状态,他抓到的小精灵一定是一个连续的区间. 因此我们可以枚举这个区间的左 ...
- 开启docker远程访问
开启docker远程访问 进入到/lib/systemd/system/docker.service vim /lib/systemd/system/docker.service 找到ExecStar ...
- JSON《===》JavaBean的相互转换
1.JSON的作用和好处 在JavaWeb项目中前后端直接的交互,接口之间的对接等等,基本离不开JSON. JSON: 全称JavaScript Object Notation(JavaScript ...
- Redis实战--Jedis实现分布式锁
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 分布式 ...