非常好 👍
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 详解与最佳实践速查表》?
发表回复