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默认值

三、核心配置项详解

配置项 默认值 说明
BOT_NAME 项目名 爬虫项目名称
ROBOTSTXT_OBEY True 是否遵守robots.txt协议
CONCURRENT_REQUESTS 16 Scrapy下载器最大并发请求数
CONCURRENT_REQUESTS_PER_DOMAIN 8 对同一域名允许的最大并发请求数
CONCURRENT_REQUESTS_PER_IP 0 对同一IP允许的最大并发请求数,非0时启用按IP并发
DOWNLOAD_DELAY 0 下载器在下载同一页面前的等待时间(秒)
DOWNLOAD_TIMEOUT 180 下载超时时间(秒)
RETRY_ENABLED True 是否启用重试中间件
RETRY_TIMES 2 最大重试次数(不含首次请求)
RETRY_HTTP_CODES [500,502,503,504,408,429] 需要进行重试的HTTP状态码列表
USER_AGENT Scrapy/版本 爬虫User-Agent标识
COOKIES_ENABLED True 是否启用Cookie中间件

四、反爬相关配置

配置项 默认值 说明
ROBOTSTXT_OBEY True 是否遵守robots.txt,True时会被禁止爬取受限页面
DOWNLOAD_DELAY 0 设置请求间隔,降低被检测风险
AUTOTHROTTLE_ENABLED False 启用自动限速,根据服务器响应动态调整延迟
AUTOTHROTTLE_START_DELAY 5 初始下载延迟(秒)
AUTOTHROTTLE_MAX_DELAY 60 在高延迟情况下的最大下载延迟(秒)
HTTPCACHE_ENABLED False 启用HTTP缓存,开发调试时避免重复请求

五、代码示例:基础生产环境配置

下面是一个推荐的生产环境配置模板,涵盖了并发控制、延迟、重试、请求头等关键设置:

代码示例

# 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'

八、配置优先级对比

优先级 配置方式 适用场景
最高 命令行 -s 临时调试、单次运行参数调整
Spider custom_settings 特定Spider的独立配置
settings.py 项目全局配置
最低 Scrapy默认值 未显式配置时的后备值

九、实际应用场景

  • 场景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参数临时覆盖。但注意这些修改只在当前爬虫运行期间生效。

标签: Scrapy 爬虫配置 并发控制 AutoThrottle Python爬虫 反爬虫

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Scrapy数据导出教程:JSON/CSV/XML多格式导出详解 下一篇: Scrapy日志与调试教程:Scrapy Shell选择器测试技巧

poll相关推荐