Python如何在__init__方法内修改类变量?Scrapy配置修改不生效求解
Scrapy 命令行动态修改DOWNLOAD_DELAY不生效的解决方案
问题根因
- 你代码中类作用域下的
print(custom_settings['DOWNLOAD_DELAY'])会在Python加载testSpider类定义时就执行,远早于命令行参数解析、爬虫实例初始化的流程,所以输出默认值10是正常现象,并不代表类变量修改失败。 - Scrapy的配置加载逻辑是:在爬虫实例创建前,就会读取爬虫类的
custom_settings属性生成全局生效的配置对象,你在__init__方法中修改类的custom_settings属性时,全局配置已经加载完成,所以修改不会生效。
解决方法
直接修改爬虫实例绑定的settings对象即可,修改时指定优先级为spider,确保能覆盖默认配置,修改后代码如下:
from scrapy.spiders import CrawlSpider class testSpider(CrawlSpider): name = 'test' custom_settings = { 'DOWNLOAD_DELAY': 10, # 默认值 } def __init__(self, *args, **kwargs): super(testSpider, self).__init__(*args, **kwargs) delay = kwargs.get('delay') if delay: # 转换为数字类型,避免字符串格式的配置不生效 delay = int(delay) # 直接修改settings对象,指定spider级优先级 self.settings.set('DOWNLOAD_DELAY', delay, priority='spider') print('修改后的DOWNLOAD_DELAY:', self.settings.get('DOWNLOAD_DELAY'))
替代方案
如果你不需要对传入的delay参数做额外逻辑处理,也可以直接使用Scrapy原生的配置传递参数,不需要修改爬虫代码:
scrapy crawl test -s DOWNLOAD_DELAY=5
内容的提问来源于stack exchange,提问作者merlin
相关产品推荐
相关产品推荐

