3.2 Settings:全局配置的拨盘台 本节摘要:Scrapy 的上百个配置项里,日常真正高频的是三组:并发与延迟(决定爬速与压力)、礼貌与伪装(决定会不会被拒之门外)、日志与统计(决定可观测性)。本节逐组给出推荐起点与调法,并讲清配置的层级覆盖规则——同一个键在不同位置赋值时,谁说了算。 候车大厅的机制上一节讲完了,这一节回答"拨盘在哪"。settings 模块是全框架的拨盘台:请求怎么发、发多快、被拒了怎么办、日志记多少,全在这里定调。挑战不在键名难记,而在不知道"哪个键改了会牵动什么"——本节按影响面分组讲,而不是按字母序罗列。
本节摘要:Scrapy 的上百个配置项里,日常真正高频的是三组:并发与延迟(决定爬速与压力)、礼貌与伪装(决定会不会被拒之门外)、日志与统计(决定可观测性)。本节逐组给出推荐起点与调法,并讲清配置的层级覆盖规则——同一个键在不同位置赋值时,谁说了算。
候车大厅的机制上一节讲完了,这一节回答"拨盘在哪"。settings 模块是全框架的拨盘台:请求怎么发、发多快、被拒了怎么办、日志记多少,全在这里定调。挑战不在键名难记,而在不知道"哪个键改了会牵动什么"——本节按影响面分组讲,而不是按字母序罗列。
同一个键可以在五个地方赋值,生效优先级从高到低是:命令行参数、Spider 自定义配置、工程 settings、默认 settings、内置默认值。理解覆盖规则,才能解释"为什么我改了 settings 没生效"——多半是被 Spider 里的 custom_settings 盖掉了:
class SlowSpider(scrapy.Spider): name = "slow" custom_settings = { # 只对本爬虫生效,盖过工程配置 "DOWNLOAD_DELAY": 2.0, "CONCURRENT_REQUESTS_PER_DOMAIN": 2, }
工程级配置写通用底线,爬虫级 custom_settings 写个站特例——这个分工让"对 A 站温和、对 B 站激进"变得可控。
这组键决定爬速,也决定目标站感受到的压力:
# settings 配置模块:并发组 CONCURRENT_REQUESTS = 16 # 全局同时在飞的请求上限 CONCURRENT_REQUESTS_PER_DOMAIN = 8 # 单域名在飞上限:对单站采集这是真正的闸门 DOWNLOAD_DELAY = 0.5 # 每次请求之间的基础间隔(秒) DOWNLOAD_TIMEOUT = 20 # 单请求超时 RANDOMIZE_DOWNLOAD_DELAY = True # 在 0.5 到 1.5 倍延迟间抖动,模拟人的节奏
调法上有条经验路径:先压低总并发,从默认值的一半起步;单域并发按"目标站是个中型站点"假设给个保守值;延迟开随机抖动。观察统计里的响应时间与失败率,逐级上调,失败率抬头就回退一格。对单站点采集,真正起闸门作用的是单域并发而非全局并发——全局 16 但单域 1,照样只能串行。
被目标站拒之门外,多数不是 IP 的问题,而是"行为不像人"。这组配置负责基本的体面:
# settings 配置模块:礼貌组 USER_AGENT = "bookstation/1.0 (+contact: ops@example.com)" # 报上名号是最低限度的礼貌 ROBOTSTXT_OBEY = True # 尊重站点的抓取协议声明 COOKIES_ENABLED = False # 无登录态需求时关掉,减少状态负担 RETRY_TIMES = 2 # 网络抖动的重试次数,别贪多 RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429]
429(请求过多)进重试码清单是好习惯,但要配合指数退避才有意义——直接的重试会在对方限流时火上浇油。退避逻辑属于第 4 章中间件的职责范围,这里先把开关位置记牢。
可观测性配置决定你能不能在出事后还原现场:
# settings 配置模块:观测组 LOG_LEVEL = "INFO" # 排障期用 DEBUG,平稳期 INFO LOG_FILE = "logs/books.log" # 落盘才谈得上复盘 LOG_SHORT_NAMES = True # 日志短前缀,长日志可读性提升明显 CLOSESPIDER_PAGECOUNT = 0 # 0 为不限制;试跑期设个小值当保险丝
试跑期给 CLOSESPIDER_PAGECOUNT 设个一两百,是防"选择器写错导致无限续票"的廉价保险——比半夜起来拔网线体面。

把三组拼成一份"第一次正式运行"的起点,之后按目标站反馈微调:
BOT_NAME = "bookstation" ROBOTSTXT_OBEY = True CONCURRENT_REQUESTS = 8 CONCURRENT_REQUESTS_PER_DOMAIN = 4 DOWNLOAD_DELAY = 1.0 RANDOMIZE_DOWNLOAD_DELAY = True DOWNLOAD_TIMEOUT = 20 RETRY_TIMES = 2 USER_AGENT = "bookstation/1.0" LOG_LEVEL = "INFO" CLOSESPIDER_PAGECOUNT = 200 # 试跑保险丝,正式运行改回 0
⚠️ 常见坑:把 DOWNLOAD_DELAY 设成 0 想换速度,换来的是封禁与全天停摆。爬速是借来的,礼貌是还账的方式——目标站没给你限速红线时,别替它发明宽松默认值。
背景:某中型资讯站点,日更约两千页,要求两小时内完成全量日更采集,且对方已发过一次限流警告。操作按三步走。
第一步定底线:单域并发 4、延迟 1.0 秒起步(对照对方 Crawl-delay 建议值 1)、节流开、目标并发 2、重试 2 次含 429。第二步试跑摸底:先限五百页小跑,观测三处——平均延迟稳定在 0.8 秒左右、零 429、两小时外推估算能覆盖日更量,说明底部参数有余量。第三步逐步上调:目标并发 2 提到 3,观察一轮;失败率与延迟不抬头,再提;一旦出现 429 或延迟陡增,立即回退并锁定。
# 落地后的工程级配置(节选) CONCURRENT_REQUESTS = 12 CONCURRENT_REQUESTS_PER_DOMAIN = 6 DOWNLOAD_DELAY = 1.0 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_TARGET_CONCURRENCY = 3.0 RETRY_TIMES = 2 CLOSESPIDER_PAGECOUNT = 0 # 试跑保险丝已撤
结果:全量日更稳定在一小时四十分左右完成,连续三周零封禁。解读:上限不是设计出来的,是探出来的——每次上调都是一次对目标站容忍度的小步测量。变式:多站点共存于一个工程时,把探好的参数写进各爬虫的 custom_settings,工程 settings 只留全员通用的底线(日志、协议遵守),个别站激进、个别站保守,互不拖累。
拨盘配齐了。下一节补上本章最后一块:信号系统——框架的事件广播,你在旅程节点上安插眼线的正规方式。