ken桑带你读源码 之 scrapy_redis
首先更大家说下 正式部署上线的爬虫会有分布式爬虫的需求 而且原本scrapy 的seen (判断重复url的池 不知道用啥词 已抓url吧 ) 保存在磁盘
url 队列 也是保存在磁盘 (保存在磁盘 对爬虫效率会极大影响) 如果是断点重爬 声明 jobdir 百分百是保存在磁盘 不申明jobdir 的话保存在内存 但会有单点内存的上限问题 所以说那么多 总之 scrapy_redis 是爬虫工程师必须了解的
scrapy_redis/dupefilter.py
判断已抓取url 主要是声明 dupefilter_key 作为 redis key 判断是否已抓取 第 100行 added = self.server.sadd(self.key, fp) return added == 0 通过插入返回值 判断已抓取url
scrapy_redis/defaults.py
默认配置文件
scrapy_redis/queue.py
队列文件 默认PriorityQueue 用到 redis 有序集合 self.server.execute_command('ZADD', self.key, score, data) 留意 100行 score = -request.priority
redis 有序集合是越小 排序越优先 加了- 等于说是反过来 还用到redis的事务 112行 pipe = self.server.pipeline()
先入后出队列是通过 lpush lpop 实现
先进先出 lpush rpop 实现
scrapy_redis/pipelines.py
63 行 把 item push 到redis 61行 return deferToThread(self._process_item, item, spider) 返回非阻塞 异步函数
scrapy_redis/scheduler.py
引擎文件 主要是处理队列的 push pop 154行 判断去重 164 加入超时 用作 阻塞 pop 如果有多条进程 读取 队列 必须用到阻塞保证一致性
有不懂大家尽管问
ken桑带你读源码 之 scrapy_redis的更多相关文章
- ken桑带你读源码 之scrapy
开篇声明 文章讲解源码不一定从入口开始 主题更注重 思路讲解以及核心函数 ok? 废话到此为止 /scrapy/downloadermiddlewares/ 文件夹下是下载器的 中间件 ...
- ken桑带你读源码 之scrapy scrapy\core\scheduler.py
从英文来看是调度程序 我们看看是怎么调度 首先爬虫队列有两个 一个是保存在内存中 没有历史记录 重新开始 42行 self.mqs = self.pqclass(self._newmq) ...
- ken桑带你读源码 之scrapy scrapy\extensions
logstats.py 爬虫启动时 打印抓取网页数 item数 memdebug.py 爬虫结束 统计还被引用的内存 也就是说gc 回收不了的内存 memusage.py 监控爬虫 内存占用 ...
- ken桑带你读源码之scrapy downloadermiddlewares
downloadermiddlewares 文件夹是下载中间件 其中 process_request 还没请求时的处理函数 process_response 请求之后的处理函数 chunke ...
- ken桑带你读源码 之scrapy pipelines\images.py
大家先看看 http://www.cnblogs.com/attitudeY/p/7078559.html 下面我做一些补充 最新版本1.1 已经支持 下载路径保存到 item 48行 ...
- Android AsyncTask完全解析,带你从源码的角度彻底理解
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11711405 我们都知道,Android UI是线程不安全的,如果想要在子线程里进 ...
- [一起读源码]走进C#并发队列ConcurrentQueue的内部世界
决定从这篇文章开始,开一个读源码系列,不限制平台语言或工具,任何自己感兴趣的都会写.前几天碰到一个小问题又读了一遍ConcurrentQueue的源码,那就拿C#中比较常用的并发队列Concurren ...
- Java读源码之ReentrantLock
前言 ReentrantLock 可重入锁,应该是除了 synchronized 关键字外用的最多的线程同步手段了,虽然JVM维护者疯狂优化 synchronized 使其已经拥有了很好的性能.但 R ...
- 带货直播源码开发采用MySQL有什么优越性
MySQL是世界上最流行的开源关系数据库,带货直播源码使用MySQL,可实现分钟级别的数据库部署和弹性扩展,不仅经济实惠,而且稳定可靠,易于运维.云数据库 MySQL 提供备份恢复.监控.容灾.快速扩 ...
随机推荐
- 一.2.序列化使用之用户资源功能app
1.环境准备:(1).新建功能app: (python36env) [vagrant@CentOS7 devops]$ python manage.py startapp users ---建议以后用 ...
- Spring Security(五) —— 动手实现一个 IP_Login
摘要: 原创出处 https://www.cnkirito.moe/spring-security-5/ 「老徐」欢迎转载,保留摘要,谢谢! 5 动手实现一个IP_Login 在开始这篇文章之前,我们 ...
- npm tip: go to the package's home page
exec the following order: --- npm home <package name>
- 硬刚 lodash 源码之路,compact & concat
前置 本篇随笔包含 _.compact 和 _.concat 及其依赖的工具函数. 你可能需要一些 JavaScript 基础知识才能看懂一些没有注释的细节. compact _.compact(ar ...
- 使用 PostCSS 进行 CSS 处理
在 Web 应用开发中,CSS 代码的编写是重要的一部分.CSS 规范从最初的 CSS1 到现在的 CSS3,再到 CSS 规范的下一步版本,规范本身一直在不断的发展演化之中.这给开发人员带来了效率上 ...
- 状压DP之吃奶酪
题目 传送们 思路 1≤n≤15,妥妥的状压,数据这么小, 这道题的状压思路还是很好想的,我们定义f[i][s]代表以i为起点,吃掉状态为s的奶酪所需要跑的最短距离,那么显然,我们先枚举状态s,然后枚 ...
- 状压DP之集合选数
题目 [HNOI2012]集合选数 <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不 ...
- day40 线程
目录 一.开启线程的两种方式 二.用进程和线程分别实现tcp 三.线程对象实现join方法 四.同一个进程下的多个线程数据是共享的 五.线程对象属性及其他方法 六.守护线程 七.线程互斥锁 八.GIL ...
- MCU 51-1概述
Microcontroller Unit 单片机:将微处理器CPU.存储器(RAM.ROM) .基本输入/输出(I/O) 接口电路和总线接口等组装在一块主机板(即微机主板). 微型计算机:将微处理器C ...
- C#-CLR note - 26线程
开篇 async/wait的使用 static async Task Main(string[] args) { Console.WriteLine("start-- "); va ...