摘要:scrapy中from_crawler和from_settings从settings.py中获取参数。

从seetings.py中获取配置参数

方法一:

from scrapy import settings
from scrapy.settings import XXX

方法二:

@classmethod
def from_crawler(cls, crawler):
  server = crawler.settings.get('SERVER')
  # FIXME: for now, stats are only supported from this constructor
  return cls(server)

接着,只要在__init__方法中接收这些参数就可以了。

def __init__(self, server):
    self.server = server

而在一些官方的组件的源码中会这样使用,不过这看起来有点多此一举

@classmethod
def from_settings(cls, settings):
    server = settings.get('SERVER')
    return cls(server)

@classmethod
def from_crawler(cls, crawler):
  # FIXME: for now, stats are only supported from this constructor
  return cls.from_settings(crawler.settings)

from_crawler和from_settings不是所有的类都可以使用这个类方法。只有像插件,中间件,信号管理器和项目管道等这些组件才能使用这个类方法来导入配置,如果是自己写的spider或者自定义文件并没有,需要使用如下方法导入:

from scrapy.utils.project import get_project_settings
settings = get_project_settings()
host = settings.get('MYSQL_HOST')

这里的settings就是包含settings.py的所有配置的字典了。

实现原理

 class A(object):
        def __init__(self, canshu1, canshu2):
            self.canshu1= canshu1
            self.canshu2= canshu2
        def foo1(self):
            print ("Hello",self.canshu1)

        def foo2(self):
            print ("hello",self.canshu2)

        @classmethod
        def from_crawler(cls):
            return cls(
            canshu1="123",
            canshu2="456"
        )

from_crawl实现方法.jpg

大概就是检测spider类有没有from_crawler,有的话就return一个cls()的实例化对象,产生实例化对象后会自动调__init__方法。

更多参考

关于settings.py的更多参数说明,以及from_crawler的调用原理,参考:
scrapy配置参数(settings.py)
pipeline - 风不再来 - 博客园