DOWNLOAD_DELAY 在 settings.py 里写了 1,spider 里写了 2,命令行又 -s 3,到底谁生效?这篇把六档优先级逐一设置、逐一运行,还验证了字典设置的合并方式、-s 的字符串坑和冻结时机。
default 0 command 10 addon 15 project 20 spider 30 cmdline 40
优先级数值在 scrapy/settings/__init__.py 的 SETTINGS_PRIORITIES 里。同一个设置被多次写入,数值大的生效,相等则后写的覆盖先写的。
设置来源 生效值 优先级 新建项目的 settings.py 原样(模板里写着 DOWNLOAD_DELAY = 1) 1 20 模板的那一行删掉,什么都不设 0 0 settings.py 里 =1 1 20 settings.py =1 + spider.custom_settings =2 2 30 settings.py =1 + custom_settings =2 + 命令行 -s =3 '3' 40 settings.py =1 + addon =4(addon 优先级 15 < project 20) 1 20 只有 addon =4 4 15 -s =3,spider.update_settings 里 set(…, 5, "cmdline") '3' 40 -s =3,spider.update_settings 里 set(…, 5, 41) 5 41 settings.py =1 + 旧写法 spider 属性 download_delay = 2 2 30 警告:The 'download_delay' spider attribute is deprecated. Use the DOWNLOAD_DELAY setting instead.
项目 settings.py 20、custom_settings 30、命令行 -s 40、addon 15。scrapy startproject 的模板里已经带着 DOWNLOAD_DELAY = 1,新项目默认每个请求之间有 1 秒延迟。用 update_settings 想压过 -s,优先级数字要比 40 大。
settings.py 里 {A: 543},spider 里没有
用户层(getdict) {'proj.mw.A': 543}
与 BASE 合并后(只列 A/B/Retry) {'RetryMiddleware': 550, 'A': 543}
settings.py 里 {A: 543},custom_settings 里 {B: 544}
用户层(getdict) {'proj.mw.B': 544}
与 BASE 合并后(只列 A/B/Retry) {'RetryMiddleware': 550, 'B': 544}
settings.py 里 {A: 543},custom_settings 里 {RetryMiddleware: None}
用户层(getdict) {'scrapy.downloadermiddlewares.retry.RetryMiddleware': None}
与 BASE 合并后(只列 A/B/Retry) {'RetryMiddleware': None}低优先级的字典不会和高优先级的字典合并。想“在已有中间件之外再加一个”,要在 spider 里把完整的字典重写一遍。关闭内置组件用 None。
-s MYFLAG=… settings["MYFLAG"] 原值 / 当 if 用 / getbool / getint
'False' 'False' truthy=True getbool=False getint=ValueError
'0' '0' truthy=True getbool=False getint=0
'' '' truthy=False getbool=ValueError: Supported values for boolean settings are 0/1, Tru getint=ValueError
'true' 'true' truthy=True getbool=True getint=ValueError
'1' '1' truthy=True getbool=True getint=1
'no' 'no' truthy=True getbool=ValueError: Supported values for boolean settings are 0/1, Tru getint=ValueError
-s MYLIST=a,b,c -s 'MYDICT={"x": 1, "y": [2]}' -s MYF=0.5 -s MYI=12 →
RESULT getlist ['a', 'b', 'c'] | getdict {'x': 1, 'y': [2]} | getfloat 0.5 | getint('12') 12命令行传来的都是字符串,用 getbool/getint/getlist/getdict 取值。直接 settings["X"] 当布尔用会把 'False' 当成真。
from_crawler: frozen = False; set 成功,读到 7 start(): frozen = True; set 失败: TypeError Trying to modify an immutable Settings object start() 读到 DOWNLOAD_DELAY = 7 (from_crawler 里设的 7 保留着)
spider 的 from_crawler 里设置还可以改,start() 里已经冻结,再改抛 TypeError。
$ cat scrapy.cfg
# Automatically created by: scrapy startproject
#
# For more information about the [deploy] section see:
# https://scrapyd.readthedocs.io/en/latest/deploy.html
[settings]
default = proj.settings
[deploy]
#url = http://localhost:6800/
project = proj
项目根目录 → mybot
项目的子目录 proj/spiders/ → mybot
项目外的空目录 → scrapybot
项目根目录 + SCRAPY_SETTINGS_MODULE=other_settings → otherbotscrapy.cfg 里的 [settings] default 指向设置模块;子目录里也能向上找到;SCRAPY_SETTINGS_MODULE 环境变量优先。