Scrapy-6.Settings

2018-10-29  本文已影响0人  王南北丶

本文地址:https://www.jianshu.com/p/5c2995ac8c25

Scrapy中,写好了SpiderMiddleware等基本的处理逻辑后,还有许多其他的功能可以在Settings中来进行设定。

Settings允许你自行定义所有使用的Scrapy模块,包括core,extensions,pipelines和spiders。

Settings本质是提供了一个存储key-value的全局命名空间,你可以从这个命名空间中拿出需要的配置值。并且Settings可以通过多种方法来进行传递。


指定Settings

使用Scrapy必须要告诉它使用哪些设置。可以使用环境变量SCRAPY_SETTINGS_MODULE来进行制定,而且SCRAPY_SETTINGS_MODULE需要在Python的路径语法中,例如myproject.settings

填充Settings

Scrapy设置的启用和填充可以由不同的机制来执行,并且每种机制都有不一样的优先级。以下是不同的几种机制,优先级从高到低排列:

  1. 命令行选项(最高优先级)
  2. 每个SpiderSettings
  3. 项目的Settings
  4. 每个命令的默认Settings
  5. 默认的全局Settings(最低优先级)

以下是每种机制的详细介绍:

1.命令行选项

在使用命令行时提供的参数拥有最高的优先级,将会覆盖所有其他方式设置的相同Settings选项。你可以使用-s(或者--set)来明确指定覆盖一个或多个Settings

例子:

scrapy crawl myspider -s LOG_FILE=scrapy.log

2.每个Spider的Settings

在每个Spider中,是可以定义这个Spider所特有的Settings的。只需要在Spider类中,定义好custom_settings这个类属性即可。

例子:

class MySpider(scrapy.Spider):
    name = 'myspider'

    custom_settings = {
        'SOME_SETTING': 'some value',
    }

3.项目的Settings模块

项目的SettingsScrapy项目的标准配置文件,我们大部分的设置都会在这个地方配置好。对于一个标准的Scrapy项目来说,这意味着我们在settings.py这个文件中添加或者修改配置的字段。

这个文件会在创建项目时自动创建。

4.每个命令的默认Settings

每一个Scrapy命令都有各自的默认Settings,会覆盖掉默认的全局设置。这些Settings设定在命令类的default_settings属性中。

5.默认全局Settings

默认的全局变量设定在scrapy.settings.default_settings模块中。


如何获取Settings

Scrapy中,我们常常需要去获取Settings中的某一个值来进行使用,或者是将我们的自定义Settings写到settings.py文件中,然后在代码中进行获取。

Scrapy提供了一些非常方便的钩子和方法来获得Settings

在Spider中获取Settings

Spider中获取Settings非常的方便,直接访问self.settings即可:

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://example.com']

    def parse(self, response):
        print("Existing settings: %s" % self.settings.attributes.keys())

注意:settings属性是在基础的Spider类中的__init__()中设定的,这意味着如果你想要在__init__()中使用settings的话,那么你需要重写from_crawler()方法。

在extensions,middlewares和item pipelines中获取Settings

extensionsmiddlewaresitem pipelines中想要获取Settings的话,那么就只能使用from_crawler()方法。

from_crawler()是一个类方法,这个方法一般用来生成当前这个组件的实例,在调用的时候会传入crawler参数,通过这个crawler参数为桥梁,我们就可以获取Settings了:

class MyExtension(object):
    def __init__(self, log_is_enabled=False):
        if log_is_enabled:
            print("log is enabled!")

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(settings.getbool('LOG_ENABLED'))

同样要注意的是,由于from_crawler()是用来生成组件的实例的,所以最终需要return一个类的实例,然后把我们要获得的Settings当作参数传递到这个实例中去,最后再在__init__()方法中进行接收。

这就是通过from_crawler()获取Settings的原理了。


内置基础设置(Built-in settings)

Scrapy中定义了许多基础的默认全局Settings,以下是一些常见设置的默认值和作用范围。

这些设置的默认范围指的是只有启用特定的组件,那么这条设置才会生效。

常见设置

并发

启用组件

记录日志

Scrapy中,使用的是Python标准库中的logging来进行日志记录的,所以使用方式也基本相同。

内存控制

广度优先和深度优先

重试和重定向


系列文章:

上一篇下一篇

猜你喜欢

热点阅读