SpiderのConfigを実行時に変更する。

#概要
### 前提
ScrapyのSpiderでは、設定ファイル(settings.py)やカスタム設定(custom_setting) でクローリング設定ができる。
ただし、この設定だけで済まそうとすると各設定（クローリングする深さ、優先度...)ごとにSpiderを作ることになり非常に管理コストがかかる。

### 本記事の内容
Scrapyのコマンドを調査したところ解消したので、記載する。

#やりたいこと
Spiderのソースコードを変更せずに、以下の設定を切り替える。

* クローリングする深さ（DEPTH_LIMIT）

#追加引数
「-s DEPTH_LIMIT=2」を追加することでクローリングする深さを、コマンド実行時に設定できる。

```bash:cmdline例
crawl sample_crawler -s DEPTH_LIMIT=2
```

#コード例
## Spider
Spiderのコード

```python:spider.py
import scrapy
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor


class SampleCrawler(scrapy.spiders.CrawlSpider):
    name = 'sample_crawler'
    allowed_domains = ['www.crawler-test.com']
    start_urls = ['https://www.crawler-test.com/']

    custom_settings = {
        'DEPTH_LIMIT': 1
    }
    rules = [
        Rule(
            LinkExtractor(
                allow=('/mobile/',),
                deny=('/redirects/',)
            ),
            callback='parse_test1'
        ),
        Rule(
            LinkExtractor(
                allow=('',),
                deny=('/test1/',)
            ),
        ),
    ]

    def __init__(self, *args, **kw):
        print('custom_settings: {}'.format(self.custom_settings))

        super(SampleCrawler, self).__init__(*args, **kw)

    def parse_test1(self, response):
        print('response url: {} depth: {}'.format(response.url, response.meta.get('depth')))
```

## 実行ログ1
Overridden settings: でsettingが表示される。

```text:run.log
2020-10-30 23:04:21 [scrapy.utils.log] INFO: Scrapy 2.2.1 started (bot: ScrapySample)
2020-10-30 23:04:21 [scrapy.utils.log] INFO: Versions: lxml 4.5.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1g  21 Apr 2020), cryptography 3.0, Platform Windows-10-10.0.18362-SP0
2020-10-30 23:04:21 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-10-30 23:04:21 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'ScrapySample',
 'DEPTH_LIMIT': 1,
 'NEWSPIDER_MODULE': 'ScrapySample.spiders',
 'ROBOTSTXT_OBEY': True,
 'SPIDER_MODULES': ['ScrapySample.spiders']}
2020-10-30 23:04:21 [scrapy.extensions.telnet] INFO: Telnet Password: ed92b4e8e23a16a0
2020-10-30 23:04:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
custom_settings: {'DEPTH_LIMIT': 1}
```

## 実行ログ2
実行コマンドの引数を変えて、再実行。
追加した引数: "-s DEPTH_LIMIT=2"

```text:run.log
2020-10-30 23:08:46 [scrapy.utils.log] INFO: Scrapy 2.2.1 started (bot: ScrapySample)
2020-10-30 23:08:46 [scrapy.utils.log] INFO: Versions: lxml 4.5.2.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 20.3.0, Python 3.6.2 (v3.6.2:5fd33b5, Jul  8 2017, 04:57:36) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1g  21 Apr 2020), cryptography 3.0, Platform Windows-10-10.0.18362-SP0
2020-10-30 23:08:46 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-10-30 23:08:46 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'ScrapySample',
 'DEPTH_LIMIT': '2',
 'NEWSPIDER_MODULE': 'ScrapySample.spiders',
 'ROBOTSTXT_OBEY': True,
 'SPIDER_MODULES': ['ScrapySample.spiders']}
2020-10-30 23:08:46 [scrapy.extensions.telnet] INFO: Telnet Password: 22caac9b06a21a64
2020-10-30 23:08:47 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
custom_settings: {'DEPTH_LIMIT': 1}
```