pin_drop当前位置:知识文库 ❯ 图文
Scrapy爬虫配置指南:并发控制/延迟/重试全解析
目录
一、Scrapy配置系统概述
Scrapy的配置系统是整个框架的核心,所有爬虫行为都通过settings.py文件来管理。配置项涵盖了并发控制、下载延迟、重试策略、中间件、Pipeline、日志等各个方面。合理的配置是爬虫稳定、高效运行的关键,需要根据目标网站的特性和采集需求进行精细调整。
二、配置语法与优先级
Scrapy支持三种配置方式,它们有不同的优先级:
代码示例
# settings.py - 全局配置
SETTING_NAME = value
# Spider中覆盖 - Spider级别配置
class MySpider(scrapy.Spider):
custom_settings = {
'SETTING_NAME': value,
}
# 命令行覆盖 - 最高优先级
scrapy crawl spider -s SETTING_NAME=value
配置优先级从高到低为:命令行 -s 参数 > Spider custom_settings > settings.py > Scrapy默认值
三、核心配置项详解
四、反爬相关配置
五、代码示例:基础生产环境配置
下面是一个推荐的生产环境配置模板,涵盖了并发控制、延迟、重试、请求头等关键设置:
代码示例
# settings.py - 生产环境推荐配置
BOT_NAME = 'myproject'
SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'
# 遵守robots.txt(根据需求调整)
ROBOTSTXT_OBEY = False
# 并发和延迟
CONCURRENT_REQUESTS = 8
DOWNLOAD_DELAY = 2
CONCURRENT_REQUESTS_PER_DOMAIN = 4
# 请求头设置
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
}
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0'
# 重试配置
RETRY_ENABLED = True
RETRY_TIMES = 3
RETRY_HTTP_CODES = [500, 502, 503, 504, 408, 429, 403]
# 超时设置
DOWNLOAD_TIMEOUT = 30
# Cookie设置
COOKIES_ENABLED = True
# 日志设置
LOG_LEVEL = 'INFO'
LOG_FILE = 'scrapy.log'
六、代码示例:Spider级别配置覆盖
通过custom_settings属性,可以为不同的Spider设置不同的配置,互不影响:
代码示例
import scrapy
class AggressiveSpider(scrapy.Spider):
"""激进型Spider - 高并发低延迟"""
name = 'aggressive'
# Spider级别覆盖settings
custom_settings = {
'CONCURRENT_REQUESTS': 32,
'DOWNLOAD_DELAY': 0.5,
'RETRY_TIMES': 5,
'LOG_LEVEL': 'DEBUG',
}
start_urls = ['https://example.com']
def parse(self, response):
yield {'title': response.css('title::text').get()}
class GentleSpider(scrapy.Spider):
"""温和型Spider - 低并发高延迟"""
name = 'gentle'
custom_settings = {
'CONCURRENT_REQUESTS': 2,
'DOWNLOAD_DELAY': 5,
'AUTOTHROTTLE_ENABLED': True,
}
start_urls = ['https://example.com']
def parse(self, response):
yield {'title': response.css('title::text').get()}
七、代码示例:自动限速配置
AutoThrottle扩展可以根据服务器的响应负载动态调整下载延迟,避免对目标网站造成过大压力:
代码示例
# settings.py - 自动限速配置
# 启用自动限速
AUTOTHROTTLE_ENABLED = True
# 初始延迟(秒)
AUTOTHROTTLE_START_DELAY = 2
# 最大延迟(秒)
AUTOTHROTTLE_MAX_DELAY = 30
# 目标并发数
AUTOTHROTTLE_TARGET_CONCURRENCY = 4.0
# 显示调试信息(生产环境设为False)
AUTOTHROTTLE_DEBUG = True
# 启用HTTP缓存(开发调试用)
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 86400 # 缓存过期时间:1天
HTTPCACHE_DIR = 'httpcache'
八、配置优先级对比
九、实际应用场景
-
场景1 - 生产环境:设置合理的并发数(4-8)、下载延迟(1-3秒)、重试策略(3次),确保爬虫稳定运行且不对目标网站造成过大压力
-
场景2 - 差异化配置:不同Spider通过
custom_settings使用不同配置,如对友好网站使用高并发,对严格网站使用低并发+AutoThrottle -
场景3 - 开发调试:启用HTTP缓存避免重复请求,设置LOG_LEVEL为DEBUG查看详细日志,加速开发迭代
十、注意事项
⚠️ 延迟计算:当
CONCURRENT_REQUESTS_PER_IP非0时,DOWNLOAD_DELAY按IP计算而非按域名⚠️ robots.txt:ROBOTSTXT_OBEY默认为True,很多网站的robots.txt会禁止大部分爬取路径,生产环境常设为False
⚠️ 配置隔离:custom_settings只在对应Spider运行时生效,不会影响项目中其他Spider的配置
⚠️ 优先级:命令行-s参数优先级最高,会覆盖settings.py和custom_settings中的同名配置项
十一、练习题
练习1
配置一个Scrapy项目,设置并发请求数为4,下载延迟3秒,重试3次,日志级别为WARNING。
练习2
编写两个Spider,一个使用激进配置(高并发低延迟),一个使用温和配置(低并发高延迟),通过custom_settings分别配置。
十二、常见问题FAQ
Scrapy爬虫总是被目标网站封禁,应该调整哪些配置?
首先增大DOWNLOAD_DELAY(建议2-5秒),降低CONCURRENT_REQUESTS_PER_DOMAIN(建议2-4)。然后更换User-Agent,启用AUTOTHROTTLE_ENABLED自动限速。如果仍被封禁,考虑使用代理IP中间件。
DOWNLOAD_DELAY=2表示每隔2秒发一次请求吗?
不完全准确。DOWNLOAD_DELAY=2表示两次请求之间的最小间隔为2秒,但Scrapy会在这个值的0.5到1.5倍之间随机添加抖动(即1-3秒),以避免请求模式过于规律被检测到。
AutoThrottle和DOWNLOAD_DELAY可以同时使用吗?
可以同时使用。AutoThrottle会以DOWNLOAD_DELAY作为初始延迟的参考起点,然后根据服务器响应动态调整。推荐在生产环境中同时启用两者,既能保证基本的礼貌间隔,又能根据服务器负载自动优化。
如何在运行时动态修改配置?
可以在Spider的from_crawler方法中通过crawler.settings.set()动态修改,或者在命令行使用-s参数临时覆盖。但注意这些修改只在当前爬虫运行期间生效。
本文涉及AI创作
内容由AI创作,请仔细甄别