Scrapy 中很多组件都有 from_crawler()方法,下面是我读源码后对 from_crawler()方法的理解,记录下来。

from_crawler() 方法一般用传入的参数来实例化一个对象,比如 scrapy.spider 中的 from_crawler():

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):    spider = cls(*args, **kwargs)   # 第一步:携带参数实例化这个类spider._set_crawler(crawler)    # 第二步:将 crawler 传递给实例,使新实例有crawler属性和settings参数return spider       # 返回类的实例对象

然后再 scrapy.crawler.Crawler._create_spider() 中调用:

def _create_spider(self, *args, **kwargs):  return self.spidercls.from_crawler(self, *args, **kwargs)

spider 中的 from_crawler() 比较就是最浅显易懂的例子,但也包含最核心的两步:

(1) 用携带的参数来实例化类,一般用 cls();

(2)将crawler 传递给新创建的实例,使新实例有 crawler 的属性和 settings 配置的参数。

各个组件是如何调用 from_crawler()方法的呢?下面以 scheduler 为例子:

scrapy.core.engine.ExecutionEngine.open_spider() 中,调用了 scheduler 的 from_crawler()方法来生成 scheduler

scheduler = self.scheduler_cls.from_crawler(self.crawler)

因为,这是 ExecutionEngine 的方法调用的,所以参数 "self.crawler" 中的 self 是 ExecutionEngine,而 ExecutionEngine 是 scrapy.crawler.Crawler._create_engine() 方法创建的:

# Crawler 中 ExecutionEngine 对象的创建
def _create_engine(self):return ExecutionEngine(self, lambda _: self.stop())  # crawler将self对象传入创建ExecutionEngine

所以传入 from_crawler(self.crawler) 的 self.crawler 就是 scrapy.crawler.Crawler 对象。

总结一下:

from_crawler() 用于根据传入的参数和 crawler 对象来生成 scheduler,使得scheduler有crawler的属性和配置。

解读scrapy各个组件中的from_crawler()方法相关推荐

  1. vuex 在非组件中调用 mutations 方法

    版权声明:本文首发 http://asing1elife.com ,转载请注明出处. https://blog.csdn.net/asing1elife/article/details/8265566 ...

  2. Mixins在组件中的使用方法

    1.Mixins是什么? Mixins是为Vue组件分发可重用功能的灵活方法.一个Mixin对象可以包含任何组件选项.当组件使用Mixins时,Mixins中的所有选项都将被"混入" ...

  3. Vue3.x 父组件Setup、Ref操纵子组件中的元素方法

    目录 父组件 方法一: defineComponent 方法二: setup语法糖 小伙伴们在开箱Vue3的过程中一点会踩到不少坑. 比如很多小伙伴想要通过ref来操纵DOM,可偏偏翻车. 这里分享两 ...

  4. vue(ref父组件使用子组件中定义的方法)

    一.前言 二.主要内容 1.实现效果(其实可以直接在父组件中操作子组件的显示隐藏,但是这里通过在子组件定义自己的显示隐藏效果,让父组件调用,训练一下这种方式) 2.分析: (1)点击父组件的某一个li ...

  5. vuejs 传参 向 子组件 父组件_VUe.js 父组件向子组件中传值及方法

    父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以 ...

  6. 访问List的itemRenderer的组件中定义的方法

    主程序文件List1.mxml: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <mx:Applic ...

  7. Silverlight 主页与页面用户组件中方法的调用顺序

    主页:UseNewUserControlPage.xaml <navigation:Page x:Class="UseUserControl.UseNewUserControlPage ...

  8. vue中的一个子组件如何在父组件中调动另一个子组件中的方法

    第一:在子组件通过用绑定事件,来到达父元素(主要通过this.$emit来和父组件达成联系) /*******主要原理跟vuex差不多********/ 1.template部分代码 <temp ...

  9. 子组件调用父组件中方法的方法

    1.在子组件中用this.$parent.fn()来调用父组件的方法 父组件中: <script>export default {methods: {parentFn() {console ...

最新文章

  1. 在计算机网络中光缆的工作原理是什么,计算机网络原理期中考试试卷(A)
  2. 干货来袭-整套完整安全的API接口解决方案
  3. 第二次作业 讲解及展示
  4. 264分析两大利器 和 视频系列下载:264VISA和Elecard StreamEye Tools
  5. 自动驾驶专题研究报告:自动驾驶产业链全梳理
  6. hdfs开机启动流程
  7. Find命令使用实例
  8. mysql二进制包安装mysql_基于linux使用mysql二进制包安装mysql
  9. 如何使用IDEA自带的数据库连接工具连接达梦数据库,IDEA连接DM(达梦)数据库
  10. DevOps定义基础入门及历史
  11. grafana-reporter
  12. oracle12c备份与恢复,Oracle 12c 备份与恢复
  13. OSChina 娱乐弹弹弹——程序猿眼中的女人
  14. 怎样取消关注别人的csdn博客
  15. ElasticSearch必知必会-基础篇
  16. 第二百九十三,Memcached缓存
  17. hexo categories和tags页面不显示解决办法
  18. 华星充电:什么是新能源充电桩
  19. 【Redis之ZSet类型的详解ZSet类型中常用命令的实践】
  20. Round Robin算法的简单C#实现

热门文章

  1. 第五章 机械加工工艺过程设计 小结
  2. 【CYH-02】NOIp考砸后虐题赛:坐标:题解
  3. every()数组方法
  4. 区块链在工业互联网的应用前景
  5. PMP备考之路 - 敏捷实践第五讲(实施敏捷:在敏捷环境中交付)
  6. Cloudberry Drive的神用法
  7. idea psvm 自定义_idea自定义快捷键
  8. 2020-12-03QQ通讯录
  9. 付宇泽20190905-1 每周例行报告
  10. 高考数学题:命题有纲——数学文化与高考命题