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 如果有多条进程 读取 队列 必须用到阻塞保证一致性
有不懂大家尽管问
最新文章
- ViewController生命周期
- 最大流模版 pascal
- Enterprise Library 6
- x01.BitmapHelper:图像处理
- DSP using Matlab 示例Example2.2
- log4j配置不同的类多个日志文件
- Maven提高篇系列之(一)——多模块 vs 继承
- Android动画解析--XML
- Contest2037 - CSU Monthly 2013 Oct (problem F :ZZY and his little friends)
- python __enter__ 与 __exit__的作用,以及与 with 语句的关系
- Zend Server的WebAPI焦点:异步操作
- Bootstrap兼容IE8
- Python初学——多进程Multiprocessing
- C++ 知识点总结复习
- Java集合及concurrent并发包总结(转)
- PHP爬虫框架Beanbun使用
- java-HTML&;javaSkcript&;CSS&;jQuery&;ajax( 八)
- Echo()、print()、print_r()区别
- 【新知识】队列&;bfs【洛谷p1996约瑟夫问题&;洛谷p1451求细胞数量】
- mongoose修改数组中某个特定的值
热门文章
- 客官,来看看AspNetCore的身份验证吧
- pandas | 使用pandas进行数据处理——Series篇
- 阿里云centos7安装redis全过程记录
- SpringCloud项目配置加载顺序
- C++中vector和堆的常用使用方法&;例题:数据流中的中位数
- 初用MySQL Mysql示例库 Navicat15
- 函数默认参数的TDZ
- mongodb(二):数据库安装,部署(linux)
- 数据可视化之powerBI入门(四)Power BI与PowerQuery、PowerPivot有什么关系
- Cordova总是弹出Connection to server was Unsuccessful