在蜘蛛的初始化功能之后无法覆盖 Scrapy 中的设置

Can't override settings in Scrapy after the init function of a spider

蜘蛛初始化函数后是否可以覆盖Scrapy设置? 例如,如果我想从 db 获取设置并将我的查询参数作为参数从 cmdline 传递。

def __init__(self, spider_id, **kwargs):
    self.spider_id = spider_id
    self.set_params(spider_id)
    super(Base_Crawler, self).__init__(**kwargs)

def set_params(self):
   #TODO
   #makes a query in db
   #get set variables from query result
   #override settings

从技术上讲,您可以在蜘蛛初始化后 "override" 进行设置,但是这不会有任何影响,因为大多数设置较早应用。

您实际上可以做的是使用 -a 将参数作为 command-line 选项传递给 Spider,并使用 -s 覆盖项目设置,例如。)

蜘蛛:

class TheSpider(scrapy.Spider):
    name = 'thespider'

    def __init__(self, *args, **kwargs):
       self.spider_id = kwargs.pop('spider_id', None)
       super(TheSpider).__init__(*args, **kwargs)

CLI:

scrapy crawl thespider -a spider_id=XXX -s SETTTING_TO_OVERRIDE=YYY

如果您需要更高级的东西,请考虑编写自定义运行器来包装您的蜘蛛。以下是 docs:

中的示例
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

process = CrawlerProcess(get_project_settings())

# 'followall' is the name of one of the spiders of the project.
process.crawl('followall', domain='scrapinghub.com')
process.start() # the script will block here until the crawling is finished

只需将 get_project_settings 替换为您自己的例程,即 returns Settings 实例。

无论如何,避免使用 non-scraping 逻辑重载蜘蛛代码,以保持其清洁和可重用。