设置

Scrapy 设置允许您自定义所有 Scrapy 组件的行为,包括核心、扩展、管道和爬虫本身。

设置的基础架构提供了一个键值映射的全局命名空间,代码可以使用它来从中提取配置值。设置可以通过不同的机制填充,如下所述。

设置也是选择当前活动 Scrapy 项目(如果您有多个)的机制。

有关可用内置设置的列表,请参阅:内置设置参考

指定设置

当您使用 Scrapy 时,您必须告诉它您正在使用哪些设置。您可以通过使用环境变量 SCRAPY_SETTINGS_MODULE 来做到这一点。

SCRAPY_SETTINGS_MODULE 的值应采用 Python 路径语法,例如 myproject.settings。请注意,设置模块应位于 Python 的 导入搜索路径 上。

填充设置

设置可以使用不同的机制填充,每个机制都有不同的优先级。以下是按优先级递减顺序排列的列表

  1. 命令行选项(最高优先级)

  2. 每个爬虫的设置

  3. 项目设置模块

  4. 插件设置的设置

  5. 每个命令的默认设置

  6. 默认全局设置(最低优先级)

这些设置源的填充是在内部完成的,但可以使用 API 调用进行手动处理。有关参考,请参阅 设置 API 主题。

下面将详细介绍这些机制。

1. 命令行选项

命令行提供的参数是优先级最高的参数,会覆盖任何其他选项。您可以使用 -s(或 --set)命令行选项显式覆盖一个(或多个)设置。

示例

scrapy crawl myspider -s LOG_FILE=scrapy.log

2. 每个爬虫的设置

爬虫(有关参考,请参阅 爬虫 章节)可以定义自己的设置,这些设置将具有优先级并覆盖项目设置。一种方法是设置其 custom_settings 属性

import scrapy


class MySpider(scrapy.Spider):
    name = "myspider"

    custom_settings = {
        "SOME_SETTING": "some value",
    }

通常最好实现 update_settings(),并且在那里设置的设置应明确使用“spider”优先级

import scrapy


class MySpider(scrapy.Spider):
    name = "myspider"

    @classmethod
    def update_settings(cls, settings):
        super().update_settings(settings)
        settings.set("SOME_SETTING", "some value", priority="spider")

版本 2.11 中的新功能。

也可以在 from_crawler() 方法中修改设置,例如基于 爬虫参数 或其他逻辑

import scrapy


class MySpider(scrapy.Spider):
    name = "myspider"

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = super().from_crawler(crawler, *args, **kwargs)
        if "some_argument" in kwargs:
            spider.settings.set(
                "SOME_SETTING", kwargs["some_argument"], priority="spider"
            )
        return spider

3. 项目设置模块

项目设置模块是 Scrapy 项目的标准配置文件,大多数自定义设置都将在此处填充。对于标准的 Scrapy 项目,这意味着您将在为项目创建的 settings.py 文件中添加或更改设置。

4. 插件设置的设置

插件 可以修改设置。他们应该以这种优先级这样做,尽管这不是强制性的。

5. 每个命令的默认设置

每个 Scrapy 工具 命令都可以有自己的默认设置,这些设置会覆盖全局默认设置。这些自定义命令设置在命令类的 default_settings 属性中指定。

6. 默认全局设置

全局默认值位于 scrapy.settings.default_settings 模块中,并在 内置设置参考 部分进行了记录。

与 pickle 的兼容性

设置值必须是 可 pickle 化的

导入路径和类

版本 2.4.0 中的新功能。

当某个设置引用一个要由 Scrapy 导入的可调用对象(例如类或函数)时,您可以通过两种不同的方式指定该对象

  • 作为包含该对象导入路径的字符串

  • 作为对象本身

例如

from mybot.pipelines.validate import ValidateMyItem

ITEM_PIPELINES = {
    # passing the classname...
    ValidateMyItem: 300,
    # ...equals passing the class path
    "mybot.pipelines.validate.ValidateMyItem": 300,
}

注意

不支持传递不可调用对象。

如何访问设置

在爬虫中,设置可以通过 self.settings 访问

class MySpider(scrapy.Spider):
    name = "myspider"
    start_urls = ["http://example.com"]

    def parse(self, response):
        print(f"Existing settings: {self.settings.attributes.keys()}")

注意

在爬虫初始化后,settings 属性在基类 Spider 中设置。如果您想在初始化之前使用设置(例如,在爬虫的 __init__() 方法中),则需要覆盖 from_crawler() 方法。

设置可以通过传递给扩展、中间件和项目管道的 from_crawler 方法的 Crawler 的 scrapy.crawler.Crawler.settings 属性访问

class MyExtension:
    def __init__(self, log_is_enabled=False):
        if log_is_enabled:
            print("log is enabled!")

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        return cls(settings.getbool("LOG_ENABLED"))

设置对象可以像字典一样使用(例如,settings['LOG_ENABLED']),但通常建议使用 Settings API 提供的方法,以所需的格式提取设置,从而避免类型错误。

设置名称的理由

设置名称通常以其配置的组件作为前缀。例如,一个虚构的 robots.txt 扩展程序的正确设置名称将是 ROBOTSTXT_ENABLEDROBOTSTXT_OBEYROBOTSTXT_CACHEDIR 等。

内置设置参考

以下是所有可用的 Scrapy 设置的列表,按字母顺序排列,以及它们的默认值和适用范围。

在适用情况下,范围显示设置的使用位置,如果它与任何特定组件相关联。在这种情况下,将显示该组件的模块,通常是扩展、中间件或管道。这也意味着必须启用该组件才能使设置生效。

附加组件

默认值:{}

一个字典,包含项目中启用的附加组件的路径及其优先级。有关更多信息,请参见 附加组件

AWS_ACCESS_KEY_ID

默认值:None

由需要访问 Amazon Web 服务 的代码(例如 S3 Feed 存储后端)使用的 AWS 访问密钥。

AWS_SECRET_ACCESS_KEY

默认值:None

由需要访问 Amazon Web 服务 的代码(例如 S3 Feed 存储后端)使用的 AWS 密钥。

AWS_SESSION_TOKEN

默认值:None

由需要访问 Amazon Web 服务 的代码(例如 S3 Feed 存储后端)在使用 临时安全凭证 时使用的 AWS 安全令牌。

AWS_ENDPOINT_URL

默认值:None

用于类似 S3 的存储的端点 URL,例如 Minio 或 s3.scality。

AWS_USE_SSL

默认值:None

如果您想禁用与 S3 或类似 S3 的存储的通信的 SSL 连接,请使用此选项。默认情况下将使用 SSL。

AWS_VERIFY

默认值:None

验证 Scrapy 和 S3 或类似 S3 的存储之间的 SSL 连接。默认情况下将进行 SSL 验证。

AWS_REGION_NAME

默认值:None

与 AWS 客户端关联的区域的名称。

ASYNCIO_EVENT_LOOP

默认值:None

给定 asyncio 事件循环类的导入路径。

如果启用了 asyncio reactor(请参见 TWISTED_REACTOR),则此设置可用于指定要与其一起使用的 asyncio 事件循环。将设置设置为所需 asyncio 事件循环类的导入路径。如果将设置设置为 None,则将使用默认的 asyncio 事件循环。

如果您使用 install_reactor() 函数手动安装 asyncio reactor,则可以使用 event_loop_path 参数指示要使用的事件循环类的导入路径。

请注意,事件循环类必须继承自 asyncio.AbstractEventLoop

注意

请注意,当使用非默认事件循环(通过 ASYNCIO_EVENT_LOOP 定义或使用 install_reactor() 安装)时,Scrapy 将调用 asyncio.set_event_loop(),这将为当前操作系统线程设置指定的事件循环作为当前循环。

BOT_NAME

默认值:'scrapybot'

此 Scrapy 项目实现的机器人的名称(也称为项目名称)。此名称也将用于日志记录。

当您使用 startproject 命令创建项目时,它会自动填充您的项目名称。

CONCURRENT_ITEMS

默认值:100

项目管道 中并行处理的并发项目(每个响应)的最大数量。

CONCURRENT_REQUESTS

默认值:16

Scrapy 下载器将执行的最大并发(即同时)请求数。

CONCURRENT_REQUESTS_PER_DOMAIN

默认值:8

将对任何单个域执行的最大并发(即同时)请求数。

另请参见:自动节流扩展及其 AUTOTHROTTLE_TARGET_CONCURRENCY 选项。

CONCURRENT_REQUESTS_PER_IP

默认值:0

将对任何单个 IP 执行的最大并发(即同时)请求数。如果非零,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN 设置,而使用此设置。换句话说,并发限制将按 IP 应用,而不是按域应用。

此设置还会影响 DOWNLOAD_DELAY自动节流扩展:如果 CONCURRENT_REQUESTS_PER_IP 非零,则下载延迟按 IP 强制执行,而不是按域强制执行。

DEFAULT_ITEM_CLASS

默认值:'scrapy.Item'

将在 Scrapy Shell 中用于实例化项目的默认类。

DEFAULT_REQUEST_HEADERS

默认值

{
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en",
}

用于 Scrapy HTTP 请求的默认标头。它们在 DefaultHeadersMiddleware 中填充。

注意

通过 Cookie 标头设置的 Cookie 不会被 Cookies 中间件 考虑。如果您需要为请求设置 Cookie,请使用 Request.cookies 参数。这是一个已知的当前限制,正在努力解决。

DEPTH_LIMIT

默认值:0

范围:scrapy.spidermiddlewares.depth.DepthMiddleware

允许对任何站点爬取的最大深度。如果为零,则不会施加任何限制。

DEPTH_PRIORITY

默认值:0

范围:scrapy.spidermiddlewares.depth.DepthMiddleware

一个整数,用于根据其深度调整 Requestpriority

请求的优先级如下调整

request.priority = request.priority - (depth * DEPTH_PRIORITY)

随着深度的增加,DEPTH_PRIORITY 的正值降低请求优先级 (BFO),而负值增加请求优先级 (DFO)。另请参见 Scrapy 是以广度优先还是深度优先的顺序爬取?

注意

此设置以相反的方式调整优先级,与其他优先级设置 REDIRECT_PRIORITY_ADJUSTRETRY_PRIORITY_ADJUST 相比。

DEPTH_STATS_VERBOSE

默认值:False

范围:scrapy.spidermiddlewares.depth.DepthMiddleware

是否收集详细的深度统计信息。如果启用此选项,则将在统计信息中收集每个深度的请求数。

DNSCACHE_ENABLED

默认值:True

是否启用 DNS 内存缓存。

DNSCACHE_SIZE

默认值:10000

DNS 内存缓存大小。

DNS_RESOLVER

版本 2.0 中新增。

默认值:'scrapy.resolver.CachingThreadedResolver'

用于解析 DNS 名称的类。默认的 scrapy.resolver.CachingThreadedResolver 支持通过 DNS_TIMEOUT 设置指定 DNS 请求的超时时间,但仅适用于 IPv4 地址。Scrapy 提供了一个备用解析器 scrapy.resolver.CachingHostnameResolver,它支持 IPv4/IPv6 地址,但不考虑 DNS_TIMEOUT 设置。

DNS_TIMEOUT

默认值:60

DNS 查询处理的超时时间(秒)。支持浮点数。

DOWNLOADER

默认值:'scrapy.core.downloader.Downloader'

用于爬取的下载器。

DOWNLOADER_HTTPCLIENTFACTORY

默认值:'scrapy.core.downloader.webclient.ScrapyHTTPClientFactory'

定义一个 Twisted protocol.ClientFactory 类,用于 HTTP/1.0 连接(适用于 HTTP10DownloadHandler)。

注意

如今 HTTP/1.0 很少使用,因此您可以安全地忽略此设置,除非您确实想使用 HTTP/1.0 并相应地覆盖 DOWNLOAD_HANDLERS 以匹配 http(s) 方案,例如,设置为 'scrapy.core.downloader.handlers.http.HTTP10DownloadHandler'

DOWNLOADER_CLIENTCONTEXTFACTORY

默认值:'scrapy.core.downloader.contextfactory.ScrapyClientContextFactory'

表示要使用的 ContextFactory 的类路径。

这里,“ContextFactory” 是 Twisted 中用于 SSL/TLS 上下文的术语,它定义了要使用的 TLS/SSL 协议版本,是否执行证书验证,甚至启用客户端身份验证(以及其他各种内容)。

注意

Scrapy 默认的上下文工厂**不执行远程服务器证书验证**。这对于网页抓取通常是可以的。

如果您确实需要启用远程服务器证书验证,Scrapy 还提供另一个可以设置的上下文工厂类,'scrapy.core.downloader.contextfactory.BrowserLikeContextFactory',它使用平台的证书来验证远程端点。

如果您确实使用了自定义的 ContextFactory,请确保其 __init__ 方法接受 method 参数(这是 OpenSSL.SSL 方法映射 DOWNLOADER_CLIENT_TLS_METHOD),tls_verbose_logging 参数(bool)和 tls_ciphers 参数(参见 DOWNLOADER_CLIENT_TLS_CIPHERS)。

DOWNLOADER_CLIENT_TLS_CIPHERS

默认值:'DEFAULT'

使用此设置来自定义默认 HTTP/1.1 下载器使用的 TLS/SSL 密码。

此设置应包含一个 OpenSSL 密码列表格式 的字符串,这些密码将用作客户端密码。更改此设置可能是访问某些 HTTPS 网站所必需的:例如,您可能需要为具有弱 DH 参数的网站使用 'DEFAULT:!DH',或者如果网站需要,则启用 DEFAULT 中未包含的特定密码。

DOWNLOADER_CLIENT_TLS_METHOD

默认值:'TLS'

使用此设置来自定义默认 HTTP/1.1 下载器使用的 TLS/SSL 方法。

此设置必须是以下字符串值之一

  • 'TLS':映射到 OpenSSL 的 TLS_method()(也称为 SSLv23_method()),它允许协议协商,从平台支持的最高版本开始;**默认值,推荐**

  • 'TLSv1.0':此值强制 HTTPS 连接使用 TLS 版本 1.0;如果您希望 Scrapy<1.1 的行为,请设置此值

  • 'TLSv1.1':强制使用 TLS 版本 1.1

  • 'TLSv1.2':强制使用 TLS 版本 1.2

DOWNLOADER_CLIENT_TLS_VERBOSE_LOGGING

默认值:False

将此设置为 True 将在建立 HTTPS 连接后启用有关 TLS 连接参数的 DEBUG 级别的消息。记录的信息类型取决于 OpenSSL 和 pyOpenSSL 的版本。

此设置仅适用于默认的 DOWNLOADER_CLIENTCONTEXTFACTORY

DOWNLOADER_MIDDLEWARES

默认值:: {}

一个字典,包含在您的项目中启用的下载器中间件及其顺序。有关更多信息,请参见 激活下载器中间件

DOWNLOADER_MIDDLEWARES_BASE

默认值

{
    "scrapy.downloadermiddlewares.offsite.OffsiteMiddleware": 50,
    "scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100,
    "scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware": 300,
    "scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware": 350,
    "scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware": 400,
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": 500,
    "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550,
    "scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware": 560,
    "scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware": 580,
    "scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware": 590,
    "scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 600,
    "scrapy.downloadermiddlewares.cookies.CookiesMiddleware": 700,
    "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 750,
    "scrapy.downloadermiddlewares.stats.DownloaderStats": 850,
    "scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware": 900,
}

一个字典,包含 Scrapy 中默认启用的下载器中间件。较低的顺序更靠近引擎,较高的顺序更靠近下载器。您永远不应该在您的项目中修改此设置,请修改 DOWNLOADER_MIDDLEWARES。有关更多信息,请参见 激活下载器中间件

DOWNLOADER_STATS

默认值:True

是否启用下载器统计信息收集。

DOWNLOAD_DELAY

默认值:0

在对同一域名发出两个连续请求之间等待的最小秒数。

使用 DOWNLOAD_DELAY 来限制您的爬取速度,以避免对服务器造成过大的压力。

支持小数。例如,每 10 秒最多发送 4 个请求

DOWNLOAD_DELAY = 2.5

此设置还会受到 RANDOMIZE_DOWNLOAD_DELAY 设置的影响,该设置默认启用。

CONCURRENT_REQUESTS_PER_IP 不为零时,延迟将按 IP 地址而不是按域名执行。

请注意,DOWNLOAD_DELAY 可以将有效的每个域名的并发性降低到低于 CONCURRENT_REQUESTS_PER_DOMAIN。如果域名的响应时间低于 DOWNLOAD_DELAY,则该域名的有效并发性为 1。在测试限流配置时,通常有意义的是先降低 CONCURRENT_REQUESTS_PER_DOMAIN,只有在 CONCURRENT_REQUESTS_PER_DOMAIN 为 1 但需要更高的限流时才增加 DOWNLOAD_DELAY

注意

此延迟可以使用 download_delay 蜘蛛属性为每个蜘蛛设置。

也可以为每个域名更改此设置,尽管这需要非平凡的代码。请参阅 自动限流 扩展的实现以获取示例。

DOWNLOAD_HANDLERS

默认值:{}

一个字典,包含在您的项目中启用的请求下载器处理程序。请参阅 DOWNLOAD_HANDLERS_BASE 以了解示例格式。

DOWNLOAD_HANDLERS_BASE

默认值

{
    "data": "scrapy.core.downloader.handlers.datauri.DataURIDownloadHandler",
    "file": "scrapy.core.downloader.handlers.file.FileDownloadHandler",
    "http": "scrapy.core.downloader.handlers.http.HTTPDownloadHandler",
    "https": "scrapy.core.downloader.handlers.http.HTTPDownloadHandler",
    "s3": "scrapy.core.downloader.handlers.s3.S3DownloadHandler",
    "ftp": "scrapy.core.downloader.handlers.ftp.FTPDownloadHandler",
}

一个字典,包含 Scrapy 中默认启用的请求下载处理程序。您永远不应该在您的项目中修改此设置,请修改 DOWNLOAD_HANDLERS

您可以通过在 DOWNLOAD_HANDLERS 中将其 URI 方案分配为 None 来禁用任何这些下载处理程序。例如,要禁用内置的 FTP 处理程序(无需替换),请将其放在您的 settings.py

DOWNLOAD_HANDLERS = {
    "ftp": None,
}

默认的 HTTPS 处理程序使用 HTTP/1.1。要使用 HTTP/2

  1. 安装 Twisted[http2]>=17.9.0 以安装在 Twisted 中启用 HTTP/2 支持所需的软件包。

  2. 按如下方式更新 DOWNLOAD_HANDLERS

    DOWNLOAD_HANDLERS = {
        "https": "scrapy.core.downloader.handlers.http2.H2DownloadHandler",
    }
    

警告

Scrapy 中的 HTTP/2 支持尚处于实验阶段,目前不建议在生产环境中使用。未来的 Scrapy 版本可能会引入相关的更改,且不会有弃用期或警告。

注意

Scrapy 当前 HTTP/2 实现的已知限制包括

DOWNLOAD_SLOTS

默认值:{}

允许基于每个槽位(域名)定义并发/延迟参数。

DOWNLOAD_SLOTS = {
    "quotes.toscrape.com": {"concurrency": 1, "delay": 2, "randomize_delay": False},
    "books.toscrape.com": {"delay": 3, "randomize_delay": False},
}

注意

对于其他下载器槽位,将使用默认设置值。

DOWNLOAD_TIMEOUT

默认值:180

下载器在超时之前等待的时间量(以秒为单位)。

注意

可以使用 download_timeout 蜘蛛属性为每个蜘蛛设置此超时,并使用 download_timeout Request.meta 键为每个请求设置此超时。

DOWNLOAD_MAXSIZE

默认值:1073741824(1 GiB)

允许的最大响应正文大小(以字节为单位)。更大的响应将被中止并忽略。

这适用于压缩前后。如果解压缩响应正文会超过此限制,则会中止解压缩并忽略响应。

使用 0 禁用此限制。

可以使用 download_maxsize 蜘蛛属性为每个蜘蛛设置此限制,并使用 download_maxsize Request.meta 键为每个请求设置此限制。

DOWNLOAD_WARNSIZE

默认值:33554432(32 MiB)

如果响应的大小(压缩前或压缩后)超过此值,则会记录一条关于此的警告。

使用 0 禁用此限制。

可以使用 download_warnsize 蜘蛛属性为每个蜘蛛设置此限制,并使用 download_warnsize Request.meta 键为每个请求设置此限制。

DOWNLOAD_FAIL_ON_DATALOSS

默认值:True

是否在出现损坏的响应时失败,即声明的 Content-Length 与服务器发送的内容不匹配或分块响应未正确完成。如果为 True,则这些响应会引发 ResponseFailed([_DataLoss]) 错误。如果为 False,则这些响应将被传递,并且标志 dataloss 将添加到响应中,即:'dataloss' in response.flagsTrue

或者,可以通过将 download_fail_on_dataloss Request.meta 键设置为 False 来基于每个请求设置此选项。

注意

损坏的响应或数据丢失错误可能在多种情况下发生,从服务器配置错误到网络错误到数据损坏。用户需要决定在考虑它们可能包含部分或不完整内容的情况下,处理损坏的响应是否有意义。如果 RETRY_ENABLEDTrue 并且此设置设置为 True,则 ResponseFailed([_DataLoss]) 失败将照常重试。

警告

此设置会被 H2DownloadHandler 下载处理程序忽略(请参阅 DOWNLOAD_HANDLERS)。如果发生数据丢失错误,相应的 HTTP/2 连接可能会损坏,从而影响使用相同连接的其他请求;因此,对于使用该连接的每个请求,都会始终引发 ResponseFailed([InvalidBodyLengthError]) 失败。

DUPEFILTER_CLASS

默认值:'scrapy.dupefilters.RFPDupeFilter'

用于检测和过滤重复请求的类。

默认值 (RFPDupeFilter) 基于 REQUEST_FINGERPRINTER_CLASS 设置进行过滤。

可以通过将 DUPEFILTER_CLASS 设置为 'scrapy.dupefilters.BaseDupeFilter' 来禁用重复请求的过滤。但是,请务必小心,因为您可能会陷入爬取循环。通常,更好的方法是将 dont_filter 参数设置为 True,用于不应过滤的特定 Request

DUPEFILTER_DEBUG

默认值:False

默认情况下,RFPDupeFilter 仅记录第一个重复请求。将 DUPEFILTER_DEBUG 设置为 True 将使其记录所有重复请求。

EDITOR

默认值:vi(在 Unix 系统上)或 IDLE 编辑器(在 Windows 上)

用于使用 edit 命令编辑蜘蛛的编辑器。此外,如果设置了 EDITOR 环境变量,则 edit 命令将优先使用它而不是默认设置。

EXTENSIONS

默认值:: {}

包含在您的项目中启用的扩展及其顺序的字典。

EXTENSIONS_BASE

默认值

{
    "scrapy.extensions.corestats.CoreStats": 0,
    "scrapy.extensions.telnet.TelnetConsole": 0,
    "scrapy.extensions.memusage.MemoryUsage": 0,
    "scrapy.extensions.memdebug.MemoryDebugger": 0,
    "scrapy.extensions.closespider.CloseSpider": 0,
    "scrapy.extensions.feedexport.FeedExporter": 0,
    "scrapy.extensions.logstats.LogStats": 0,
    "scrapy.extensions.spiderstate.SpiderState": 0,
    "scrapy.extensions.throttle.AutoThrottle": 0,
}

包含 Scrapy 中默认可用的扩展及其顺序的字典。此设置包含所有稳定的内置扩展。请记住,其中一些需要通过设置启用。

有关更多信息,请参阅 扩展用户指南可用扩展列表

FEED_TEMPDIR

Feed 临时目录允许您设置自定义文件夹以保存爬虫临时文件,然后使用 FTP Feed 存储Amazon S3 上传。

FEED_STORAGE_GCS_ACL

将项目存储到 Google Cloud Storage 时使用的访问控制列表 (ACL)。有关如何设置此值的更多信息,请参阅 Google Cloud 文档 中的 JSON API 列。

FTP_PASSIVE_MODE

默认值:True

是否在启动 FTP 传输时使用被动模式。

FTP_PASSWORD

默认值:"guest"

Request 元数据中没有 "ftp_password" 时,用于 FTP 连接的密码。

注意

释义 RFC 1635,尽管通常使用“guest”或电子邮件地址作为匿名 FTP 的密码,但某些 FTP 服务器会明确要求用户的电子邮件地址,并且不允许使用“guest”密码登录。

FTP_USER

默认值:"anonymous"

Request 元数据中没有 "ftp_user" 时,用于 FTP 连接的用户名。

GCS_PROJECT_ID

默认值:None

将数据存储到 Google Cloud Storage 时使用的项目 ID。

ITEM_PIPELINES

默认值:{}

包含要使用的项目管道及其顺序的字典。顺序值是任意的,但习惯上在 0-1000 范围内定义它们。较低的顺序在较高的顺序之前处理。

示例

ITEM_PIPELINES = {
    "mybot.pipelines.validate.ValidateMyItem": 300,
    "mybot.pipelines.validate.StoreMyItem": 800,
}

ITEM_PIPELINES_BASE

默认值:{}

一个包含Scrapy中默认启用的管道(pipelines)的字典。您不应该在项目中修改此设置,而是修改ITEM_PIPELINES

JOBDIR

默认值:None

一个字符串,指示在暂停和恢复爬取时存储爬取状态的目录。

LOG_ENABLED

默认值:True

是否启用日志记录。

LOG_ENCODING

默认值:'utf-8'

用于日志记录的编码。

LOG_FILE

默认值:None

用于日志输出的文件名。如果为None,则使用标准错误。

LOG_FILE_APPEND

默认值:True

如果为False,则使用LOG_FILE指定的文件将被覆盖(丢弃之前运行的任何输出)。

LOG_FORMAT

默认值:'%(asctime)s [%(name)s] %(levelname)s: %(message)s'

用于格式化日志消息的字符串。有关可用占位符的完整列表,请参阅Python 日志记录文档

LOG_DATEFORMAT

默认值:'%Y-%m-%d %H:%M:%S'

用于格式化日期/时间的字符串,扩展了LOG_FORMAT%(asctime)s占位符。有关可用指令的完整列表,请参阅Python 日期时间文档

LOG_FORMATTER

默认值:scrapy.logformatter.LogFormatter

用于格式化不同操作的日志消息的类。

LOG_LEVEL

默认值:'DEBUG'

要记录的最低级别。可用级别:CRITICAL、ERROR、WARNING、INFO、DEBUG。有关更多信息,请参阅日志记录

LOG_STDOUT

默认值:False

如果为True,则进程的所有标准输出(和错误)将重定向到日志。例如,如果您print('hello'),它将显示在Scrapy日志中。

LOG_SHORT_NAMES

默认值:False

如果为True,则日志仅包含根路径。如果设置为False,则显示负责日志输出的组件。

LOGSTATS_INTERVAL

默认值:60.0

LogStats每次打印统计信息的间隔(以秒为单位)。

MEMDEBUG_ENABLED

默认值:False

是否启用内存调试。

MEMDEBUG_NOTIFY

默认值:[]

启用内存调试时,如果此设置不为空,则内存报告将发送到指定的地址,否则报告将写入日志。

示例

MEMDEBUG_NOTIFY = ['[email protected]']

MEMUSAGE_ENABLED

默认值:True

范围:scrapy.extensions.memusage

是否启用内存使用扩展。此扩展跟踪进程使用的峰值内存(将其写入统计信息)。它还可以选择在超过内存限制时关闭Scrapy进程(请参阅MEMUSAGE_LIMIT_MB),并在发生这种情况时通过电子邮件通知(请参阅MEMUSAGE_NOTIFY_MAIL)。

请参阅内存使用扩展

MEMUSAGE_LIMIT_MB

默认值:0

范围:scrapy.extensions.memusage

在关闭Scrapy之前允许的最大内存量(以兆字节为单位)(如果MEMUSAGE_ENABLED为True)。如果为零,则不会执行检查。

请参阅内存使用扩展

MEMUSAGE_CHECK_INTERVAL_SECONDS

默认值:60.0

范围:scrapy.extensions.memusage

内存使用扩展以固定的时间间隔检查当前内存使用情况,与MEMUSAGE_LIMIT_MBMEMUSAGE_WARNING_MB设置的限制进行比较。

这设置了这些间隔的长度,以秒为单位。

请参阅内存使用扩展

MEMUSAGE_NOTIFY_MAIL

默认值:False

范围:scrapy.extensions.memusage

如果达到内存限制,则通知的电子邮件列表。

示例

MEMUSAGE_NOTIFY_MAIL = ['[email protected]']

请参阅内存使用扩展

MEMUSAGE_WARNING_MB

默认值:0

范围:scrapy.extensions.memusage

在发送警告电子邮件以通知内存使用情况之前允许的最大内存量(以兆字节为单位)。如果为零,则不会发出警告。

NEWSPIDER_MODULE

默认值:''

使用genspider命令创建新蜘蛛的模块。

示例

NEWSPIDER_MODULE = 'mybot.spiders_dev'

RANDOMIZE_DOWNLOAD_DELAY

默认值:True

如果启用,Scrapy将在从同一网站获取请求时等待随机时间(在0.5 * DOWNLOAD_DELAY和1.5 * DOWNLOAD_DELAY之间)。

此随机化降低了爬虫被检测到(并随后被阻止)的可能性,因为网站会分析请求以查找其请求之间时间上的统计上显着的相似性。

随机化策略与wget --random-wait选项使用的策略相同。

如果DOWNLOAD_DELAY为零(默认值),则此选项无效。

REACTOR_THREADPOOL_MAXSIZE

默认值:10

Twisted Reactor线程池大小的最大限制。这是Scrapy各种组件使用的通用多用途线程池。线程化DNS解析器、BlockingFeedStorage、S3FilesStore仅举几例。如果您遇到阻塞IO不足的问题,请增加此值。

REDIRECT_PRIORITY_ADJUST

默认值:+2

范围:scrapy.downloadermiddlewares.redirect.RedirectMiddleware

调整重定向请求相对于原始请求的优先级。

  • 正的优先级调整(默认值)表示更高的优先级。

  • 负的优先级调整表示较低的优先级。

ROBOTSTXT_OBEY

默认值:False

范围:scrapy.downloadermiddlewares.robotstxt

如果启用,Scrapy将遵守robots.txt策略。有关更多信息,请参阅RobotsTxtMiddleware

注意

由于历史原因,默认值为False,但此选项在scrapy startproject命令生成的settings.py文件中默认启用。

ROBOTSTXT_PARSER

默认值:'scrapy.robotstxt.ProtegoRobotParser'

用于解析robots.txt文件的解析器后端。有关更多信息,请参阅RobotsTxtMiddleware

ROBOTSTXT_USER_AGENT

默认值:None

用于在robots.txt文件中匹配的用户代理字符串。如果为None,则使用您随请求发送的用户代理标头或USER_AGENT设置(按此顺序)来确定要在robots.txt文件中使用的用户代理。

SCHEDULER

默认值:'scrapy.core.scheduler.Scheduler'

用于爬取的调度程序类。有关详细信息,请参阅调度程序主题。

SCHEDULER_DEBUG

默认值:False

设置为True将记录有关请求调度程序的调试信息。目前仅记录(一次)请求无法序列化到磁盘的情况。统计计数器(scheduler/unserializable)跟踪发生这种情况的次数。

日志中的示例条目

1956-01-31 00:00:00+0800 [scrapy.core.scheduler] ERROR: Unable to serialize request:
<GET http://example.com> - reason: cannot serialize <Request at 0x9a7c7ec>
(type Request)> - no more unserializable requests will be logged
(see 'scheduler/unserializable' stats counter)

SCHEDULER_DISK_QUEUE

默认值:'scrapy.squeues.PickleLifoDiskQueue'

调度器将使用的磁盘队列类型。其他可用类型包括 scrapy.squeues.PickleFifoDiskQueuescrapy.squeues.MarshalFifoDiskQueuescrapy.squeues.MarshalLifoDiskQueue

SCHEDULER_MEMORY_QUEUE

默认值:'scrapy.squeues.LifoMemoryQueue'

调度器使用的内存队列类型。其他可用类型为:scrapy.squeues.FifoMemoryQueue

SCHEDULER_PRIORITY_QUEUE

默认值:'scrapy.pqueues.ScrapyPriorityQueue'

调度器使用的优先级队列类型。另一种可用类型是 scrapy.pqueues.DownloaderAwarePriorityQueue。当您并行抓取许多不同的域名时,scrapy.pqueues.DownloaderAwarePriorityQueue 的效果优于 scrapy.pqueues.ScrapyPriorityQueue。但目前 scrapy.pqueues.DownloaderAwarePriorityQueue 无法与 CONCURRENT_REQUESTS_PER_IP 同时使用。

SCRAPER_SLOT_MAX_ACTIVE_SIZE

版本 2.0 中新增。

默认值:5_000_000

正在处理的响应数据的软限制(以字节为单位)。

当所有正在处理的响应的大小总和超过此值时,Scrapy 不会处理新的请求。

SPIDER_CONTRACTS

默认值:: {}

一个字典,包含在您的项目中启用的蜘蛛契约,用于测试蜘蛛。有关更多信息,请参阅 Spiders Contracts

SPIDER_CONTRACTS_BASE

默认值

{
    "scrapy.contracts.default.UrlContract": 1,
    "scrapy.contracts.default.ReturnsContract": 2,
    "scrapy.contracts.default.ScrapesContract": 3,
}

一个字典,包含 Scrapy 在默认情况下启用的契约。您不应该在您的项目中修改此设置,而应该修改 SPIDER_CONTRACTS。有关更多信息,请参阅 Spiders Contracts

您可以通过在 SPIDER_CONTRACTS 中将其类路径分配给 None 来禁用这些契约中的任何一个。例如,要禁用内置的 ScrapesContract,请将其放在您的 settings.py

SPIDER_CONTRACTS = {
    "scrapy.contracts.default.ScrapesContract": None,
}

SPIDER_LOADER_CLASS

默认值:'scrapy.spiderloader.SpiderLoader'

将用于加载蜘蛛的类,它必须实现 SpiderLoader API

SPIDER_LOADER_WARN_ONLY

默认值:False

默认情况下,当 Scrapy 尝试从 SPIDER_MODULES 导入蜘蛛类时,如果出现任何 ImportErrorSyntaxError 异常,它将发出响亮的错误。但是,您可以选择使此异常静默并将其转换为简单的警告,方法是设置 SPIDER_LOADER_WARN_ONLY = True

注意

一些 scrapy 命令 已经将此设置运行为 True(即,它们只会发出警告,不会失败),因为它们实际上不需要加载蜘蛛类即可工作:scrapy runspiderscrapy settingsscrapy startprojectscrapy version

SPIDER_MIDDLEWARES

默认值:: {}

一个字典,包含在您的项目中启用的蜘蛛中间件及其顺序。有关更多信息,请参阅 Activating a spider middleware

SPIDER_MIDDLEWARES_BASE

默认值

{
    "scrapy.spidermiddlewares.httperror.HttpErrorMiddleware": 50,
    "scrapy.spidermiddlewares.referer.RefererMiddleware": 700,
    "scrapy.spidermiddlewares.urllength.UrlLengthMiddleware": 800,
    "scrapy.spidermiddlewares.depth.DepthMiddleware": 900,
}

一个字典,包含 Scrapy 在默认情况下启用的蜘蛛中间件及其顺序。较低的顺序更靠近引擎,较高的顺序更靠近蜘蛛。有关更多信息,请参阅 Activating a spider middleware

SPIDER_MODULES

默认值:[]

Scrapy 将在其中查找蜘蛛的模块列表。

示例

SPIDER_MODULES = ["mybot.spiders_prod", "mybot.spiders_dev"]

STATS_CLASS

默认值:'scrapy.statscollectors.MemoryStatsCollector'

用于收集统计数据的类,它必须实现 Stats Collector API

STATS_DUMP

默认值:True

在蜘蛛完成抓取后,将 Scrapy 统计数据(到 Scrapy 日志)转储。

有关更多信息,请参阅:Stats Collection

STATSMAILER_RCPTS

默认值:[](空列表)

在蜘蛛完成抓取后发送 Scrapy 统计数据。有关更多信息,请参阅 StatsMailer

TELNETCONSOLE_ENABLED

默认值:True

一个布尔值,指定是否启用 telnet 控制台(前提是其扩展也已启用)。

TEMPLATES_DIR

默认值:scrapy 模块内的 templates 目录

使用 startproject 命令创建新项目和使用 genspider 命令创建新蜘蛛时,查找模板的目录。

项目名称不得与 project 子目录中的自定义文件或目录的名称冲突。

TWISTED_REACTOR

版本 2.0 中新增。

默认值:None

给定 reactor 的导入路径。

如果尚未安装其他反应器,Scrapy 将安装此反应器,例如当调用 scrapy CLI 程序或使用 CrawlerProcess 类时。

如果您使用的是 CrawlerRunner 类,您还需要手动安装正确的反应器。您可以使用 install_reactor() 来完成此操作。

scrapy.utils.reactor.install_reactor(reactor_path: str, event_loop_path: str | None = None) None[source]

使用指定的导入路径安装 reactor。如果启用了 asyncio 反应器,则还会使用指定的导入路径安装 asyncio 事件循环。

如果反应器已经安装,install_reactor() 不会有任何影响。

CrawlerRunner.__init__ 如果安装的反应器与 TWISTED_REACTOR 设置不匹配,则会引发 Exception;因此,在项目文件和导入的第三方库中具有顶级 reactor 导入将导致 Scrapy 在检查已安装的反应器时引发 Exception

为了使用 Scrapy 安装的反应器

import scrapy
from twisted.internet import reactor


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def __init__(self, *args, **kwargs):
        self.timeout = int(kwargs.pop("timeout", "60"))
        super(QuotesSpider, self).__init__(*args, **kwargs)

    def start_requests(self):
        reactor.callLater(self.timeout, self.stop)

        urls = ["https://quotes.toscrape.com/page/1"]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {"text": quote.css("span.text::text").get()}

    def stop(self):
        self.crawler.engine.close_spider(self, "timeout")

引发 Exception,变为

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def __init__(self, *args, **kwargs):
        self.timeout = int(kwargs.pop("timeout", "60"))
        super(QuotesSpider, self).__init__(*args, **kwargs)

    def start_requests(self):
        from twisted.internet import reactor

        reactor.callLater(self.timeout, self.stop)

        urls = ["https://quotes.toscrape.com/page/1"]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        for quote in response.css("div.quote"):
            yield {"text": quote.css("span.text::text").get()}

    def stop(self):
        self.crawler.engine.close_spider(self, "timeout")

设置 TWISTED_REACTOR 的默认值为 None,这意味着 Scrapy 将会使用已安装的现有反应器,或者安装 Twisted 为当前平台定义的默认反应器。这样做是为了保持向后兼容性,并避免使用非默认反应器可能导致的问题。

2.7 版中的更改: 现在,startproject 命令会将此设置在生成的 settings.py 文件中设置为 twisted.internet.asyncioreactor.AsyncioSelectorReactor

更多信息,请参阅 选择反应器和 GUI 工具包集成

URLLENGTH_LIMIT

默认值:2083

范围:spidermiddlewares.urllength

允许抓取的 URL 的最大长度。

如果 URL 长度不断增加,此设置可以作为停止条件,例如,可能是目标服务器或您的代码中存在编程错误导致的。另请参阅 REDIRECT_MAX_TIMESDEPTH_LIMIT

使用 0 允许任何长度的 URL。

默认值是从 Microsoft Internet Explorer 的最大 URL 长度 复制而来,即使此设置存在的原因有所不同。

USER_AGENT

默认值:"Scrapy/VERSION (+https://scrapy.net.cn)"

抓取时使用的默认 User-Agent,除非被覆盖。如果 ROBOTSTXT_USER_AGENT 设置为 None 并且没有为请求指定覆盖的 User-Agent 标头,则 RobotsTxtMiddleware 也使用此 User-Agent。

其他地方记录的设置:

以下设置在其他地方有记录,请检查每个具体情况以了解如何启用和使用它们。