Scrapy爬虫运行期间能否修改设置?尝试修改时遇报错
Scrapy运行期间修改设置的问题解决办法
这问题我之前踩过坑!Scrapy的Settings对象一旦爬虫启动起来,就会变成**不可变(immutable)**的状态,所以你直接调用settings.set()或者settings.update()就会触发那个TypeError: Trying to modify an immutable Settings object报错。
为什么会这样?
Scrapy设计成这样是为了保证爬虫运行过程中配置的一致性——毕竟如果中途随便改设置,比如突然换了下载延迟、修改了管道配置,很容易引发各种不可预测的bug,所以启动后就把Settings锁死了。
解决办法分两种情况:
1. 能提前修改的话(推荐)
如果可以在爬虫启动前调整设置,有几种方式:
- 直接修改项目根目录下的
settings.py文件,把SPIDER_MODULES改成['a']; - 用命令行参数临时覆盖:
scrapy crawl 你的爬虫名 -s SPIDER_MODULES=a; - 在代码里初始化Settings时修改(还没启动爬虫之前):
from scrapy.settings import Settings # 初始化一个可变的Settings实例 settings = Settings({'SPIDER_MODULES': ['原来的模块']}) settings.set('SPIDER_MODULES', ['a']) # 这时候完全没问题 # 之后用这个settings来启动爬虫 from scrapy.crawler import CrawlerProcess process = CrawlerProcess(settings) process.crawl(你的爬虫类) process.start()
2. 必须在运行期间修改的话
如果真的需要在爬虫运行过程中调整配置,只能创建一个可变的Settings副本来用——注意这个副本只在你自己的代码里生效,Scrapy内部的组件还是会用原来的不可变设置:
from scrapy import Spider from scrapy.settings import Settings class MySpider(Spider): name = 'myspider' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 复制原设置并创建一个可变的实例 self.mutable_settings = Settings(self.settings.copy()) # 现在可以修改这个副本了 self.mutable_settings.set('SPIDER_MODULES', ['a']) def parse(self, response): # 在这里用self.mutable_settings代替原来的self.settings print(self.mutable_settings.get('SPIDER_MODULES')) # 输出['a']
内容的提问来源于stack exchange,提问作者dorinand




