@classmethod
def from_crawler(cls, crawler, *args, **kwargs):spider = cls(*args, **kwargs)spider._set_crawler(crawler)return spider
  • cls代表这个类,因此,以下是用给定的参数创建了一个cls类的实例spider。参数会经过__init__方法,因为实例需要初始化。
spider = cls(*args, **kwargs)
  • 设置spider实例的crawler属性
spider._set_crawler(crawler)
  • 返回实例
return spider

crawler属性在初始化class后,由类方法 from_crawler设置, 并且链接了本spider实例对应的Crawl对象。Crawler包含了很多项目中的组件,作为单一的入口点 (例如插件,中间件,信号管理器等).可以查看Crawler API

from_crawler用于实例化某个对象(中间件,模块),常常出现在对象的初始化,负责提供crawler.settings

这是一个类方法,scrapy创建spider的时候会调用。调用位置在crawler.py 的类Crawler中。这个方法的源码在上面,我们可以看到,在实例化这个spider以后,这个实例才有的settings和crawler属性,所以在__init__方法中是没法访问这俩属性的。如果非要在__init__方法中使用相关属性,那么只能重写该方法,大家可以尝试写写。

重写这个类方法需要注意的几点:

  • 需要返回一个实例对象
  • 返回实例对象括号里面的参数,是会进入初始化方法__init__的

如:当我们需要通过scrapy crawl spidername -a NAME=VALUE进行传递参数时,需要以下这种写法

class MySpider(scrapy.Spider):def __init__(self, parms=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)

但是,当通过命令scrapy crawl spidername -a parms=value的时候,会出现参数传不进来的情况,那是因为继承scrapy.Spider的时候重写了from_crawler类方法了

@classmethod
def from_crawler(cls, crawler):settings = crawler.settingsreturn cls()

重写时没有将__init__需要的参数传过去,因为scrapy crawl spidername -a parms=value命令会通过from_crawler创建spider,所以需要返回对应的参数给__init__初始化方法

@classmethod
def from_crawler(cls, crawler):settings = crawler.settingsreturn cls(*args, **kwargs)

欢迎关注公众号:日常bug,每天写至少一篇技术文章,每天进步一点点。

scrapy组件、中间件、spider中类方法from_crawler的作用相关推荐

  1. scrapy下载中间件(downloader middleware)和蜘蛛中间件(spider middleware)

    scrapy组件 首先我们看下scrapy官网提供的新结构图,乍一看这画的是啥啊,这需要你慢慢的理解其原理就很容易看懂了,这些都是一个通用爬虫框架该具有的一些基本组件.上一篇博客说了项目管道(也就是图 ...

  2. Scrapy 框架 中间件,信号,定制命令

    中间件 下载器中间件 写中间件 from scrapy.http import HtmlResponse from scrapy.http import Requestclass Md1(object ...

  3. 彻底搞懂 Scrapy 的中间件

    彻底搞懂Scrapy的中间件(一):https://www.cnblogs.com/xieqiankun/p/know_middleware_of_scrapy_1.html 彻底搞懂Scrapy的中 ...

  4. python pipeline框架_爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 1. Spider Middleware Spider Middleware是介入到Scrapy的Spid ...

  5. scrapy 下载中间件

    文章目录 Downloader Middlewares(下载中间件) process_request(self,request,spider) process_response(self,reques ...

  6. Scrapy的中间件(一)

    中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. "中间件"这个中文名字和前面章节讲到 ...

  7. 爬虫框架scrapy之中间件

    中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. "中间件"这个中文名字和前面章节讲到 ...

  8. 彻底搞懂Scrapy的中间件(一)

    中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. "中间件"这个中文名字和前面章节讲到 ...

  9. 爬虫scrapy框架中间件的使用

    1. scrapy中间件的分类和作用 1.1 scrapy中间件的分类 根据scrapy运行流程中所在位置不同分为:[中间件离哪个模块近就称为什么中间件] 下载中间件 爬虫中间件 1.2 scrapy ...

最新文章

  1. SpringMvc之集成Swagger
  2. 【Matlab 图像】滤波器原理使用及测试效果
  3. 【Qt】数据库实战(一)
  4. 编译错误 fatal error C1010: unexpected end of file while looking for precompiled header directive
  5. windbg调试相关命令
  6. jquery验证手机号码和邮箱地址例子
  7. [html] 可替换元素和不可替换元素有什么不同的特点?
  8. sqlite C/C++ API
  9. 北漂九年 ,雷军终于买房了:壕掷52亿元
  10. 本地Git仓库关联Github项目
  11. 对数周期天线hfss建模_07 HFSS软件二次开发在对数周期天线设计中的应用
  12. GetFLV.v9.1.1.8-kg-REPT
  13. Orientation-boosted Voxel Nets for 3D Object Recognition--ORION论文阅读
  14. pixi.js 制作 流星雨效果
  15. java日志管理-学习(一)
  16. Thinkphp6 对接google谷歌第三方登录接口
  17. Python实现AI变脸
  18. 程序员如何在技术上提升自己
  19. 基于Spring Boot和Vue3的博客平台文章详情与评论功能实现
  20. 闻道有先后,术业有专攻

热门文章

  1. Lab树莓派实现airplay
  2. zenmap扫描ip段_zenmap端口扫描工具(ip端口扫描器)V7.71 最新版
  3. [iOS开发]Category、Extension和关联对象
  4. php右小角弹出框,js右下角弹出提示框示例代码
  5. Cefsharp——将Cefsharp相关库集中放到程序的子目录下
  6. 将fddb标注转换为VOC格式标注
  7. shortest path 实现
  8. 485总线最大能挂载多少个节点
  9. InForSec@武汉“江夏晴川”网络安全Workshop记录-2
  10. JavaScript封装异步函数 —— 【异步编程】 —— 如何获取一个函数中异步操作的结果?