diff --git a/scrapy/crawler.py b/scrapy/crawler.py index e0524021a..eb174a7d8 100644 --- a/scrapy/crawler.py +++ b/scrapy/crawler.py @@ -96,7 +96,12 @@ class CrawlerRunner(object): def _create_crawler(self, spidercls): if isinstance(spidercls, six.string_types): spidercls = self.spiders.load(spidercls) - crawler = Crawler(spidercls, self.settings.frozencopy()) + + crawler_settings = self.settings.copy() + spidercls.update_settings(crawler_settings) + crawler_settings.freeze() + + crawler = Crawler(spidercls, crawler_settings) return crawler def stop(self): diff --git a/scrapy/settings/__init__.py b/scrapy/settings/__init__.py index 938b93564..af0d0dff1 100644 --- a/scrapy/settings/__init__.py +++ b/scrapy/settings/__init__.py @@ -15,6 +15,7 @@ SETTINGS_PRIORITIES = { 'default': 0, 'command': 10, 'project': 20, + 'spider': 30, 'cmdline': 40, } diff --git a/scrapy/spider.py b/scrapy/spider.py index 943925042..0b13d2ee6 100644 --- a/scrapy/spider.py +++ b/scrapy/spider.py @@ -20,6 +20,7 @@ class Spider(object_ref): """ name = None + custom_settings = {} def __init__(self, name=None, **kwargs): if name is not None: @@ -66,6 +67,10 @@ class Spider(object_ref): def parse(self, response): raise NotImplementedError + @classmethod + def update_settings(cls, settings): + settings.setdict(cls.custom_settings, priority='spider') + @classmethod def handles_request(cls, request): return url_is_from_spider(request.url, cls)