Scarpy源码分析6
2021SC@SDUSC
回到 engine 的 open_spider
方法,这个时候 slot 相关的初始化以及启动,我们应该大致能理解了。后面依次启动了 scraper 和 crawler.stats,需要注意的是 downloader 是在 engine 刚创建的时候就已经初始化好了。另外,当这些都初始化好后,engine 发出了 spider_opened
信号。
前面我们提到过 _next_request
多次,我们顺着这个方法跟下去。
# scrapy/core/engine.pyclass ExecutionEngine(object):# ...def _next_request(self, spider):# ...while not self._needs_backout(spider):if not self._next_request_from_scheduler(spider):breakif slot.start_requests and not self._needs_backout(spider):try:request = next(slot.start_requests)except StopIteration:# ...else:self.crawl(request, spider)if self.spider_is_idle(spider) and slot.close_if_idle:self._spider_idle(spider)
这个方法主要是做 2 个事情
- 从 scheduelr 中获取请求并下载,涉及方法
_next_request_from_scheduler
- 从 spider 初始请求中获取请求加入 scheduler,涉及方法 crawl
先看后者 crawl
class ExecutionEngine(object):# ...def crawl(self, request, spider):assert spider in self.open_spiders, \"Spider %r not opened when crawling: %s" % (spider.name, request)self.schedule(request, spider)self.slot.nextcall.schedule()def schedule(self, request, spider):self.signals.send_catch_log(signal=signals.request_scheduled,request=request, spider=spider)if not self.slot.scheduler.enqueue_request(request):self.signals.send_catch_log(signal=signals.request_dropped,request=request, spider=spider)
就是调用了 schedule 然后触发下一次 _next_request
。schedule 中发出 request_scheduled
信号后,将请求加入 scheduler 的队列,之后又发出 request_dropped
信号。
再看前者 _next_request_from_scheduler
class ExecutionEngine(object):# ...def _next_request_from_scheduler(self, spider):slot = self.slotrequest = slot.scheduler.next_request()if not request:returnd = self._download(request, spider)d.addBoth(self._handle_downloader_output, request, spider)d.addErrback(lambda f: logger.info('Error while handling downloader output',exc_info=failure_to_exc_info(f),extra={'spider': spider}))d.addBoth(lambda _: slot.remove_request(request))d.addErrback(lambda f: logger.info('Error while removing request from slot',exc_info=failure_to_exc_info(f),extra={'spider': spider}))d.addBoth(lambda _: slot.nextcall.schedule())d.addErrback(lambda f: logger.info('Error while scheduling new request',exc_info=failure_to_exc_info(f),extra={'spider': spider}))
主要做了这么几件事
- 从 scheduler 中获取下一个请求,没有则退出
- 下载请求,将请求加入 slot 的 inprogress 集合中,涉及方法
_download
- 下载完成后,将响应放到 scraper 中,涉及方法
_handle_downloader_output
- 下载完成后,将请求从 slot 的 inprogress 集合中移除
- 下载完成,触发下一次
_next_request
看下 _download
class ExecutionEngine(object):# ...def _download(self, request, spider):slot = self.slotslot.add_request(request)def _on_success(response):assert isinstance(response, (Response, Request))if isinstance(response, Response):response.request = request # tie request to response receivedlogkws = self.logformatter.crawled(request, response, spider)logger.log(*logformatter_adapter(logkws), extra={'spider': spider})self.signals.send_catch_log(signal=signals.response_received, \response=response, request=request, spider=spider)return responsedef _on_complete(_):slot.nextcall.schedule()return _dwld = self.downloader.fetch(request, spider)dwld.addCallbacks(_on_success)dwld.addBoth(_on_complete)return dwld
- 将请求加入 slot 的 inprogress 集合
- 调用 downloader 的 fetch 方法,具体做了些什么后面会分析
- 下载成功后,打印成功日志,并发送
response_received
信号 - 下载成功或者失败后,都会触发下一次
_next_request
Scarpy源码分析6相关推荐
- 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析
目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...
- SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...
- SpringBoot-web开发(二): 页面和图标定制(源码分析)
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...
- SpringBoot-web开发(一): 静态资源的导入(源码分析)
目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...
- Yolov3Yolov4网络结构与源码分析
Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
- MyBatis原理分析之四:一次SQL查询的源码分析
上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码 String res ...
- [转]slf4j + log4j原理实现及源码分析
slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
最新文章
- Python版九九乘法表
- Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
- Linux搭建arm的qemu模拟器
- 流殇三月,誓言碎落于天涯
- android10 imei横线,【报Bug】android10设备plus.device.getInfo获取imei为空
- CC(标准)版D碟收藏指南(三)
- 软件推荐--Files2Folder
- 笔记本电脑摄像头黑屏怎么处理?
- 网络综合布线线缆如何敷设布放_网络线和综合布线施工技术交底
- Spring Cloud Gateway 服务网关的部署与使用详细介绍
- 什么是Saas架构?
- linux卸载带输入法,Ubuntu删除自带的输入法之后设置不见了
- 微信windows版_安卓首发!微信黑暗模式来了
- 我只是还没有全力以赴
- 天轰穿典型多层架构留言本项目实战免费下载
- STM32之RTC时钟,闹钟,日历
- 基于MATLAB的车牌定位算法设计
- 华为鸿蒙安装酷喵,荣耀智慧屏发布、华为鸿蒙OS首秀 这就是电视和智能生态的未来...
- 2022-2028全球笔式万用表行业调研及趋势分析报告
- 关于编号/编码命名的问题