在蜘蛛的初始化功能之后无法覆盖 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 逻辑重载蜘蛛代码,以保持其清洁和可重用。
蜘蛛初始化函数后是否可以覆盖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 逻辑重载蜘蛛代码,以保持其清洁和可重用。