非常好 👍
Scrapy 是 Python 中功能最强大的爬虫框架之一,它的配置文件settings.py)是整个框架的核心控制中枢。

下面我帮你做一份真正“详细级”的讲解(比官方文档更直观),从文件结构、常见配置、优先级到实战案例全覆盖 👇


🧩 一、Scrapy 配置文件(settings.py)是什么?

Scrapy 项目创建后,目录结构如下:

myproject/
│
├── myproject/
│   ├── __init__.py
│   ├── items.py
│   ├── middlewares.py
│   ├── pipelines.py
│   ├── settings.py   👈【配置文件】
│   └── spiders/
│       └── example_spider.py
└── scrapy.cfg

settings.py 用来定义整个 Scrapy 项目的全局配置。
几乎所有组件(Downloader、Scheduler、Middleware、Pipeline)都依赖这里的配置。


⚙️ 二、配置项分类(最常见的模块)

模块作用
基础配置定义项目名、爬虫模块路径、调试模式等
请求与下载控制并发、延迟、超时、重试、代理、UA 等
中间件(Middleware)定义请求与响应的拦截逻辑
管道(Pipeline)定义数据持久化方式(保存到数据库、文件等)
日志与调试控制日志级别与输出文件
扩展功能启用插件、扩展、下载缓存等

🧱 三、核心配置详解

1️⃣ 基础配置

BOT_NAME = "myproject"              # 项目名
SPIDER_MODULES = ["myproject.spiders"]  # 爬虫文件路径
NEWSPIDER_MODULE = "myproject.spiders"  # 新爬虫默认创建路径

ROBOTSTXT_OBEY = False              # 是否遵守 robots.txt


2️⃣ 请求与下载相关配置

并发控制

CONCURRENT_REQUESTS = 16            # 全局最大并发请求数
CONCURRENT_REQUESTS_PER_DOMAIN = 8  # 单个域名最大并发
CONCURRENT_REQUESTS_PER_IP = 0      # 按 IP 限制(为 0 表示按域名)

延迟与超时

DOWNLOAD_DELAY = 1.0                # 每个请求之间的延迟(秒)
RANDOMIZE_DOWNLOAD_DELAY = True     # 是否在延迟时间上随机波动
DOWNLOAD_TIMEOUT = 180              # 请求超时(秒)

重试机制

RETRY_ENABLED = True
RETRY_TIMES = 2                     # 最大重试次数
RETRY_HTTP_CODES = [500, 502, 503, 504, 408]

User-Agent 与 Header

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml',
    'Accept-Language': 'en',
}
USER_AGENT = "Mozilla/5.0 (compatible; MySpider/1.0)"

代理与 Cookies

COOKIES_ENABLED = False             # 是否启用 Cookies
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.ProxyMiddleware': 543,
}


3️⃣ 数据持久化配置(Pipeline)

ITEM_PIPELINES = {
    'myproject.pipelines.JsonWriterPipeline': 300,
    'myproject.pipelines.MySQLPipeline': 400,
}

✅ 优先级数字越小,执行越早。


4️⃣ 中间件配置(Middleware)

中间件分为两类:

类型用途
Downloader Middleware修改请求与响应(代理、UA、重试)
Spider Middleware处理解析逻辑中的输入输出

示例:

DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.RandomUserAgentMiddleware': 400,
}

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.MySpiderMiddleware': 543,
}


5️⃣ 日志与调试

LOG_LEVEL = 'INFO'                 # DEBUG / INFO / WARNING / ERROR / CRITICAL
LOG_FILE = 'scrapy.log'            # 日志输出文件
LOG_STDOUT = True                  # 把 print 输出写入日志


6️⃣ 下载缓存(可减少重复抓取)

HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 86400  # 缓存有效期(秒)
HTTPCACHE_DIR = 'httpcache'        # 缓存目录
HTTPCACHE_IGNORE_HTTP_CODES = []


7️⃣ 爬取深度与调度

DEPTH_LIMIT = 5                    # 爬取深度限制
SCHEDULER = 'scrapy.core.scheduler.Scheduler'
SCHEDULER_PERSIST = False          # 是否持久化队列


🔄 四、配置文件加载优先级

Scrapy 的配置有 四级优先级(从低到高):

优先级来源示例
1️⃣默认配置(Scrapy 内置)scrapy/settings/default_settings.py
2️⃣项目配置settings.py
3️⃣命令行参数scrapy crawl spider -s LOG_LEVEL=DEBUG
4️⃣代码动态修改crawler.settings.set('DOWNLOAD_DELAY', 3)

🧠 五、实战技巧

1️⃣ 单爬虫独立设置

每个爬虫可在类中覆盖全局配置:

class MySpider(scrapy.Spider):
    name = 'myspider'
    custom_settings = {
        'DOWNLOAD_DELAY': 2,
        'USER_AGENT': 'CustomSpider/1.0'
    }

2️⃣ 从命令行临时覆盖

scrapy crawl myspider -s DOWNLOAD_DELAY=2 -s LOG_LEVEL=DEBUG

3️⃣ 导出数据

scrapy crawl myspider -o result.json

Scrapy 会自动根据文件后缀选择格式(JSON/CSV/XML)。


📘 六、常用完整配置模板

BOT_NAME = "myspider"

SPIDER_MODULES = ["myspider.spiders"]
NEWSPIDER_MODULE = "myspider.spiders"

ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1
CONCURRENT_REQUESTS = 16
RETRY_ENABLED = True
COOKIES_ENABLED = False
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

DOWNLOADER_MIDDLEWARES = {
    'myspider.middlewares.RandomProxyMiddleware': 543,
}

ITEM_PIPELINES = {
    'myspider.pipelines.JsonWriterPipeline': 300,
}

LOG_LEVEL = 'INFO'
HTTPCACHE_ENABLED = True


✅ 七、小结对照表

分类配置项功能
基础BOT_NAME / MODULES项目结构
下载DOWNLOAD_DELAY / TIMEOUT请求节奏
并发CONCURRENT_*同时抓取数
中间件DOWNLOADER_MIDDLEWARES请求处理
管道ITEM_PIPELINES数据存储
缓存HTTPCACHE_*避免重复请求
调度DEPTH_LIMIT / SCHEDULER爬取控制
日志LOG_*输出与调试

是否希望我帮你做成一份
📘 《Scrapy 配置文件 settings.py 详解与最佳实践速查表》