2.7 Settings (配置)


文档摘要

2.7 Settings (配置) Scrapy 核心组件之 Settings (配置) 详解 在 Scrapy 框架中,Settings (配置) 是一个至关重要的组件,它允许你自定义和调整 Scrapy 爬虫的行为。通过 Settings,你可以控制爬虫的各个方面,例如并发请求数、下载延迟、用户代理、管道设置、扩展启用等等。它提供了一个集中的地方来管理爬虫的所有可配置选项,使得代码更加清晰、可维护和易于扩展。 2.7.1 Settings 的作用 Settings 在 Scrapy 中扮演着核心配置管理器的角色,主要作用包括: 全局配置: 提供一个全局可访问的配置字典,允许你定义爬虫的所有配置选项。

2.7 Settings (配置)

Scrapy 核心组件之 Settings (配置) 详解

在 Scrapy 框架中,Settings (配置) 是一个至关重要的组件,它允许你自定义和调整 Scrapy 爬虫的行为。通过 Settings,你可以控制爬虫的各个方面,例如并发请求数、下载延迟、用户代理、管道设置、扩展启用等等。它提供了一个集中的地方来管理爬虫的所有可配置选项,使得代码更加清晰、可维护和易于扩展。

2.7.1 Settings 的作用

Settings 在 Scrapy 中扮演着核心配置管理器的角色,主要作用包括:

  • 全局配置: 提供一个全局可访问的配置字典,允许你定义爬虫的所有配置选项。

  • 控制爬虫行为: 通过设置不同的配置项,可以控制爬虫的各个方面,例如请求频率、数据处理流程等。

  • 可扩展性: 允许你添加自定义配置项,以满足特定爬虫的需求。

  • 优先级管理: 支持从多个来源加载配置,并根据优先级进行合并,确保配置的灵活性和可控性。

  • 代码解耦: 将配置信息与爬虫代码分离,提高代码的可读性和可维护性。

上图展示了 Settings 组件在 Scrapy 架构中的核心地位。它为 Scrapy 的各个组件提供配置信息,从而影响整个爬虫的运行。

2.7.2 Settings 的使用方法

Scrapy 提供了多种方式来设置配置选项,主要包括:

  1. 项目设置文件 (settings.py): 这是最常用的方式,你可以在 Scrapy 项目的 settings.py 文件中定义配置选项。

  2. 命令行参数: 可以通过命令行参数覆盖 settings.py 中的配置选项。

  3. Spider 属性: 可以在 Spider 类中定义 custom_settings 属性来覆盖 settings.py 中的配置选项。

  4. API 调用: 可以在代码中直接通过 crawler.settings 对象来设置配置选项。

2.7.2.1 项目设置文件 (settings.py)

在 Scrapy 项目中,settings.py 文件是存放全局配置选项的地方。 你可以直接在文件中定义变量,这些变量会被 Scrapy 自动加载。

示例:

# settings.py BOT_NAME = 'my_crawler' SPIDER_MODULES = ['my_crawler.spiders'] NEWSPIDER_MODULE = 'my_crawler.spiders' # Obey robots.txt rules ROBOTSTXT_OBEY = True # Configure maximum concurrent requests performed by Scrapy downloader CONCURRENT_REQUESTS = 32 # Configure a delay for requests for the same website (default: 0) # See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay # See also autothrottle settings and docs DOWNLOAD_DELAY = 3 # The download timeout setting DOWNLOAD_TIMEOUT = 15 # The download retries setting RETRY_TIMES = 3 # The maximum number of times to allow retries on non-200 status codes RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 408] # Disable cookies (enabled by default) COOKIES_ENABLED = False # Disable Telnet Extension #TELNETCONSOLE_ENABLED = False # Override the default request headers: DEFAULT_REQUEST_HEADERS = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', } # Enable or disable spider middlewares # See https://docs.scrapy.org/en/latest/topics/spider-middleware.html #SPIDER_MIDDLEWARES = { # 'my_crawler.middlewares.MyCrawlerSpiderMiddleware': 543, #} # Enable or disable downloader middlewares # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html #DOWNLOADER_MIDDLEWARES = { # 'my_crawler.middlewares.MyCrawlerDownloaderMiddleware': 543, #} # Enable or disable extensions # See https://docs.scrapy.org/en/latest/topics/extensions.html #EXTENSIONS = { # 'scrapy.extensions.telnet.TelnetConsole': None, #} # Configure item pipelines # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES = { 'my_crawler.pipelines.MyCrawlerPipeline': 300, } # Enable and configure the AutoThrottle extension (disabled by default) # See https://docs.scrapy.org/en/latest/topics/autothrottle.html #AUTOTHROTTLE_ENABLED = True # The initial download delay #AUTOTHROTTLE_START_DELAY = 5 # The maximum download delay to be set in case of high latencies #AUTOTHROTTLE_MAX_DELAY = 60 # The average number of requests Scrapy should be sending in parallel to # each remote server #AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 # Enable showing throttling stats for debugging: #AUTOTHROTTLE_DEBUG = False # Enable and configure HTTP caching (disabled by default) # See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings #HTTPCACHE_ENABLED = True #HTTPCACHE_EXPIRATION_SECS = 0 #HTTPCACHE_DIR = 'httpcache' #HTTPCACHE_IGNORE_HTTP_CODES = [] #HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

2.7.2.2 命令行参数

你可以通过命令行参数来覆盖 settings.py 中的配置选项。 这在需要临时修改配置时非常有用。

示例:

scrapy crawl my_spider -s DOWNLOAD_DELAY=5 -s USER_AGENT="My Custom User Agent"

上述命令会启动 my_spider 爬虫,并将 DOWNLOAD_DELAY 设置为 5 秒,USER_AGENT 设置为 "My Custom User Agent", 覆盖 settings.py 中的相应配置。 -s 参数用于指定要覆盖的配置选项。

2.7.2.3 Spider 属性

你可以在 Spider 类中定义 custom_settings 属性,来覆盖 settings.py 中的配置选项。 这使得你可以为特定的 Spider 设置不同的配置。

示例:

import scrapy class MySpider(scrapy.Spider): name = "my_spider" start_urls = ["http://example.com"] custom_settings = { 'DOWNLOAD_DELAY': 2, 'USER_AGENT': 'My Spider User Agent', } def parse(self, response): # ... pass

在这个例子中,MySpider 爬虫的 DOWNLOAD_DELAY 将被设置为 2 秒,USER_AGENT 将被设置为 "My Spider User Agent", 覆盖 settings.py 中的相应配置。

2.7.2.4 API 调用

你可以在代码中直接通过 crawler.settings 对象来设置配置选项。 这通常用于在运行时动态修改配置。

示例:

from scrapy.crawler import CrawlerProcess from scrapy.settings import Settings # 创建 Settings 对象 settings = Settings() # 设置配置选项 settings['DOWNLOAD_DELAY'] = 1 settings['USER_AGENT'] = 'My Dynamic User Agent' # 创建 CrawlerProcess 对象,并传入 Settings 对象 process = CrawlerProcess(settings) # 启动爬虫 process.crawl('my_spider') process.start()

在这个例子中,我们首先创建了一个 Settings 对象,然后通过 settings['DOWNLOAD_DELAY'] = 1settings['USER_AGENT'] = 'My Dynamic User Agent' 设置了配置选项。 最后,我们将 Settings 对象传递给 CrawlerProcess 对象,启动爬虫。

2.7.3 Settings 的优先级

Scrapy 的 Settings 支持从多个来源加载配置,并根据优先级进行合并。 配置选项的优先级从高到低依次为:

  1. 命令行参数

  2. Spider 的 custom_settings 属性

  3. 项目设置文件 (settings.py)

  4. Scrapy 默认设置

这意味着,如果在命令行参数和 settings.py 文件中都定义了 DOWNLOAD_DELAY 配置选项, 那么命令行参数中的值将覆盖 settings.py 文件中的值。

上图展示了 Settings 的优先级顺序,箭头指向优先级较低的配置来源。

2.7.4 常用的 Settings 选项

Scrapy 提供了大量的配置选项,可以控制爬虫的各个方面。 以下是一些常用的配置选项:

  • BOT_NAME: 爬虫的名称。

  • SPIDER_MODULES: 包含 Spider 类的模块列表。

  • NEWSPIDER_MODULE: 用于创建新 Spider 的模块。

  • ROBOTSTXT_OBEY: 是否遵守 robots.txt 协议。

  • CONCURRENT_REQUESTS: Scrapy 下载器允许的最大并发请求数。

  • DOWNLOAD_DELAY: 下载延迟,单位为秒。

  • DOWNLOAD_TIMEOUT: 下载超时时间,单位为秒。

  • USER_AGENT: 用户代理字符串。

  • ITEM_PIPELINES: 启用的 Item Pipeline 及其优先级。

  • DOWNLOADER_MIDDLEWARES: 启用的 Downloader Middleware 及其优先级。

  • SPIDER_MIDDLEWARES: 启用的 Spider Middleware 及其优先级。

  • EXTENSIONS: 启用的扩展及其优先级。

  • LOG_LEVEL: 日志级别,例如 DEBUGINFOWARNINGERRORCRITICAL

  • LOG_FILE: 日志文件路径。

  • HTTPCACHE_ENABLED: 是否启用 HTTP 缓存。

2.7.5 自定义 Settings 选项

除了 Scrapy 提供的默认配置选项,你还可以添加自定义的配置选项,以满足特定爬虫的需求。

示例:

# settings.py MY_CUSTOM_SETTING = 'My Custom Value'

然后在爬虫代码中,你可以通过 crawler.settings 对象来访问自定义配置选项。

import scrapy class MySpider(scrapy.Spider): name = "my_spider" start_urls = ["http://example.com"] def __init__(self, *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.custom_setting = self.crawler.settings.get('MY_CUSTOM_SETTING') print(f"Custom Setting: {self.custom_setting}") def parse(self, response): # ... pass

在这个例子中,我们定义了一个名为 MY_CUSTOM_SETTING 的自定义配置选项,并在 MySpider 爬虫的 __init__ 方法中访问了该配置选项。

2.7.6 Settings 的高级技巧

  • 使用环境变量: 可以将配置选项的值设置为环境变量,从而在不同的环境中使用不同的配置。 例如,你可以将数据库连接字符串设置为环境变量,然后在 settings.py 文件中使用 os.environ.get('DATABASE_URL') 来获取环境变量的值。

  • 使用 JSON 或 YAML 文件: 可以将配置选项存储在 JSON 或 YAML 文件中,然后在 settings.py 文件中加载这些文件。 这使得你可以更方便地管理复杂的配置。

  • 创建自定义 Settings 类: 可以创建自定义的 Settings 类,继承自 scrapy.settings.Settings 类,并重写 __init__ 方法,以实现更高级的配置管理功能。

2.7.7 代码实践

以下是一个完整的代码实践示例,演示了如何使用 Settings 组件来配置 Scrapy 爬虫。

1. 创建 Scrapy 项目:

scrapy startproject my_crawler cd my_crawler

2. 定义 Spider:

# my_crawler/spiders/example_spider.py import scrapy class ExampleSpider(scrapy.Spider): name = "example" allowed_domains = ["example.com"] start_urls = ["http://example.com"] custom_settings = { 'DOWNLOAD_DELAY': 1, 'USER_AGENT': 'Example Spider User Agent', } def parse(self, response): self.logger.info('A response from %s just arrived!', response.url) yield { 'url': response.url, 'title': response.xpath('//title/text()').get(), }

3. 配置 Settings:

# my_crawler/settings.py BOT_NAME = 'my_crawler' SPIDER_MODULES = ['my_crawler.spiders'] NEWSPIDER_MODULE = 'my_crawler.spiders' ROBOTSTXT_OBEY = True DOWNLOAD_DELAY = 3 ITEM_PIPELINES = { 'my_crawler.pipelines.MyCrawlerPipeline': 300, } MY_CUSTOM_SETTING = 'My Custom Value from settings.py'

4. 定义 Item Pipeline:

# my_crawler/pipelines.py class MyCrawlerPipeline: def process_item(self, item, spider): spider.logger.info('Processing item: %s', item) return item

5. 运行爬虫:

scrapy crawl example -s MY_CUSTOM_SETTING="My Custom Value from command line"

在这个例子中,我们定义了一个 ExampleSpider 爬虫,并在 settings.py 文件中设置了 DOWNLOAD_DELAYITEM_PIPELINES 配置选项。 我们还定义了一个自定义配置选项 MY_CUSTOM_SETTING,并在 Spider 中和通过命令行参数覆盖了它的值。 运行爬虫后,你可以在日志中看到爬虫使用了我们配置的选项。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U