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相关推荐

  1. 【Golang源码分析】Go Web常用程序包gorilla/mux的使用与源码简析

    目录[阅读时间:约10分钟] 一.概述 二.对比: gorilla/mux与net/http DefaultServeMux 三.简单使用 四.源码简析 1.NewRouter函数 2.HandleF ...

  2. SpringBoot-web开发(四): SpringMVC的拓展、接管(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) SpringBo ...

  3. SpringBoot-web开发(二): 页面和图标定制(源码分析)

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) 目录 一.首页 1. 源码分析 2. 访问首页测试 二.动态页面 1. 动态资源目录t ...

  4. SpringBoot-web开发(一): 静态资源的导入(源码分析)

    目录 方式一:通过WebJars 1. 什么是webjars? 2. webjars的使用 3. webjars结构 4. 解析源码 5. 测试访问 方式二:放入静态资源目录 1. 源码分析 2. 测 ...

  5. Yolov3Yolov4网络结构与源码分析

    Yolov3&Yolov4网络结构与源码分析 从2018年Yolov3年提出的两年后,在原作者声名放弃更新Yolo算法后,俄罗斯的Alexey大神扛起了Yolov4的大旗. 文章目录 论文汇总 ...

  6. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  7. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  8. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  9. [转]slf4j + log4j原理实现及源码分析

    slf4j + log4j原理实现及源码分析 转载于:https://www.cnblogs.com/jasonzeng888/p/6051080.html

  10. Spark源码分析之七:Task运行(一)

    在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...

最新文章

  1. Python版九九乘法表
  2. Android的sqlite使用外部,Android 使用外部已经建立好的sqlite数据库
  3. Linux搭建arm的qemu模拟器
  4. 流殇三月,誓言碎落于天涯
  5. android10 imei横线,【报Bug】android10设备plus.device.getInfo获取imei为空
  6. CC(标准)版D碟收藏指南(三)
  7. 软件推荐--Files2Folder
  8. 笔记本电脑摄像头黑屏怎么处理?
  9. 网络综合布线线缆如何敷设布放_网络线和综合布线施工技术交底
  10. Spring Cloud Gateway 服务网关的部署与使用详细介绍
  11. 什么是Saas架构?
  12. linux卸载带输入法,Ubuntu删除自带的输入法之后设置不见了
  13. 微信windows版_安卓首发!微信黑暗模式来了
  14. 我只是还没有全力以赴
  15. 天轰穿典型多层架构留言本项目实战免费下载
  16. STM32之RTC时钟,闹钟,日历
  17. 基于MATLAB的车牌定位算法设计
  18. 华为鸿蒙安装酷喵,荣耀智慧屏发布、华为鸿蒙OS首秀 这就是电视和智能生态的未来...
  19. 2022-2028全球笔式万用表行业调研及趋势分析报告
  20. 关于编号/编码命名的问题

热门文章

  1. 企业级网络突然变得很卡解决办法
  2. 项目开发过程中业务流程图的绘制
  3. 利用ACC控制酷狗音乐
  4. Win32反汇编(一) 初步探索Win32反汇编 与 Ollydbg的简单使用
  5. 编程实现恩格玛加密机(C++)
  6. 10. InnoDB表空间加密
  7. 详解Docker的网络模式之host模式(host网络模式)
  8. 神经网络和深度学习-习题
  9. UNIX环境高级编程(第2版)- 第1~10章
  10. editplus远程连接云服务器