You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动