设置

Scrapy 设置允许您自定义所有 Scrapy 组件的行为,包括核心、扩展、pipeline 以及 Spider 本身。

设置的基础设施提供了一个全局的键值映射命名空间,代码可以使用它来获取配置值。设置可以通过不同的机制来填充,这些机制将在下面介绍。

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

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

指定设置

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

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

填充设置

设置可以使用不同的机制来填充,每种机制具有不同的优先级

1. 命令行设置

命令行中设置的设置具有最高优先级,会覆盖任何其他设置。

您可以使用 -s(或 --set)命令行选项显式覆盖一个或多个设置。

示例

scrapy crawl myspider -s LOG_LEVEL=INFO -s LOG_FILE=scrapy.log

2. Spider 设置

Spiders 可以定义自己的设置,这些设置将具有更高的优先级并覆盖项目设置。

注意

爬虫前设置 不能按 spider 定义,并且 reactor 设置在同一进程中运行多个 spider 时,不应按 spider 设置不同的值。

实现这一点的一种方法是设置它们的 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() 方法中修改设置,例如根据 spider 参数 或其他逻辑

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 项目包含一个设置模块,通常是一个名为 settings.py 的文件,您应该在该文件中填充适用于所有 spider 的大多数设置。

另请参阅

指定设置

4. Add-on 设置

Add-ons 可以修改设置。如果可能,它们应使用 "addon" 优先级来完成此操作。

5. 命令特定的默认设置

每个 Scrapy 命令 都可以有自己的默认设置,这些设置会覆盖 全局默认设置

这些命令特定的默认设置在每个命令类的 default_settings 属性中指定。

6. 全局默认设置

scrapy.settings.default_settings 模块定义了一些 内置设置 的全局默认值。

注意

startproject 会生成一个 settings.py 文件,该文件将一些设置设置为不同的值。

设置的参考文档会指示默认值(如果存在)。如果 startproject 设置了一个值,则该值被记录为默认值,而来自 scrapy.settings.default_settings 的值被记录为“备用值”(fallback)。

与 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,
}

注意

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

如何访问设置

在 spider 中,可以通过 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 初始化后在基础 Spider 类中设置。如果您想在初始化之前使用设置(例如,在 spider 的 __init__() 方法中),您需要覆盖 from_crawler() 方法。

组件 也可以 访问设置

settings 对象可以像 dict 一样使用(例如 settings["LOG_ENABLED"])。但是,为了支持非字符串设置值(可能从命令行作为字符串传递),建议使用 Settings API 提供的方法之一。

组件优先级字典

一个 组件优先级字典 是一个 dict,其中键是 组件,值是组件优先级。例如

{
    "path.to.ComponentA": None,
    ComponentB: 100,
}

组件可以指定为类对象或通过导入路径指定。

警告

组件优先级字典是常规的 dict 对象。请注意不要多次定义同一组件,例如使用不同的导入路径字符串或同时定义导入路径和 type 对象。

优先级可以是 intNone

优先级为 1 的组件会比优先级为 2 的组件 更早 执行。然而,更早执行的具体含义取决于对应的设置。例如,在 DOWNLOADER_MIDDLEWARES 设置中,组件的 process_request() 方法会在后续组件的方法之前执行,但其 process_response() 方法会在后续组件的方法之后执行。

优先级为 None 的组件会被禁用。

一些组件优先级字典会与一些内置值合并。例如,DOWNLOADER_MIDDLEWARES 会与 DOWNLOADER_MIDDLEWARES_BASE 合并。这就是 None 的便利之处,它允许您在常规设置中禁用基本设置中的组件

DOWNLOADER_MIDDLEWARES = {
    "scrapy.downloadermiddlewares.offsite.OffsiteMiddleware": None,
}

特殊设置

以下设置与其他所有设置的工作方式略有不同。

爬虫前设置

爬虫前设置 是在创建 Crawler 对象之前使用的设置。

这些设置不能 从 spider 中设置

这些设置包括 SPIDER_LOADER_CLASS 以及相应 组件 使用的设置,例如默认组件的 SPIDER_MODULESSPIDER_LOADER_WARN_ONLY

Reactor 设置

Reactor 设置 是与 Twisted reactor 相关联的设置。

这些设置可以从 spider 中定义。但是,由于每个进程只能使用 1 个 reactor,因此在 在同一进程中运行多个 spider 时,这些设置不能按 spider 使用不同的值。

一般来说,如果不同的 spider 定义了不同的值,则使用第一个定义的值。但是,如果两个 spider 请求不同的 reactor,则会引发异常。

这些设置包括

ASYNCIO_EVENT_LOOPTWISTED_REACTOR 在安装 reactor 时使用。其余设置在启动 reactor 时应用。

内置设置参考

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

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

ADDONS

默认值: {}

一个字典,包含项目中启用的 add-ons 的路径及其优先级。有关更多信息,请参阅 Add-ons

AWS_ACCESS_KEY_ID

默认值: None

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

AWS_SECRET_ACCESS_KEY

默认值: None

需要访问 Amazon Web Services 的代码(例如 S3 feed 存储后端)使用的 AWS 秘密密钥。

AWS_SESSION_TOKEN

默认值: None

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

AWS_ENDPOINT_URL

默认值: None

用于 S3 兼容存储(例如 Minio 或 s3.scality)的端点 URL。

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

Caution

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

BOT_NAME

默认值: <项目名称> (备用值: 'scrapybot')

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

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

CONCURRENT_ITEMS

默认值: 100

item pipelines 中并行处理的最大并发 item 数(每个响应)。

CONCURRENT_REQUESTS

默认值: 16

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

CONCURRENT_REQUESTS_PER_DOMAIN

默认值: 8

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

另请参阅: AutoThrottle 扩展 及其 AUTOTHROTTLE_TARGET_CONCURRENCY 选项。

CONCURRENT_REQUESTS_PER_IP

默认值: 0

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

此设置也影响 DOWNLOAD_DELAYAutoThrottle 扩展:如果 CONCURRENT_REQUESTS_PER_IP 非零,则下载延迟将按 IP 执行,而不是按域名执行。

DEFAULT_DROPITEM_LOG_LEVEL

默认值: "WARNING"

关于丢弃 item 的消息的默认 日志级别

当 item pipeline 的 process_item() 方法通过引发 scrapy.exceptions.DropItem 来丢弃 item 时,会记录一条消息,默认情况下其日志级别为此设置中配置的级别。

您可以将此日志级别指定为整数(例如 20)、日志级别常量(例如 logging.INFO)或带有日志级别常量名称的字符串(例如 "INFO")。

编写 item pipeline 时,您可以通过在 scrapy.exceptions.DropItem 异常中设置 scrapy.exceptions.DropItem.log_level 来强制使用不同的日志级别。例如

from scrapy.exceptions import DropItem


class MyPipeline:
    def process_item(self, item, spider):
        if not item.get("price"):
            raise DropItem("Missing price data", log_level="INFO")
        return item

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中填充。

Caution

通过 Cookie 头部设置的cookie不会被CookiesMiddleware考虑。如果您需要为请求设置cookie,请使用Request.cookies参数。这是一个已知且正在解决的当前限制。

DEPTH_LIMIT

默认值: 0

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

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

DEPTH_PRIORITY

默认值: 0

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

一个整数,用于根据Request的深度调整其priority

请求的优先级调整如下:

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'

定义用于HTTP/1.0连接 (对于HTTP10DownloadHandler) 的Twisted protocol.ClientFactory 类。

注意

HTTP/1.0现在很少使用,其Scrapy支持已弃用,因此您可以安全地忽略此设置,除非您确实想使用HTTP/1.0并相应地为http(s)方案覆盖DOWNLOAD_HANDLERS,即设置为'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蜘蛛属性为每个蜘蛛设置此延迟。

也可以按域名更改此设置,但这需要非平凡的代码。请参阅AutoThrottle扩展的实现以获取示例。

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 实现的已知限制包括:

  • 不支持HTTP/2 明文 (h2c),因为没有主流浏览器支持未加密的HTTP/2 (参考http2 faq)。

  • 没有设置可以指定大于默认值16384的最大帧大小。连接到发送更大帧的服务器将失败。

  • 不支持服务器推送,服务器推送将被忽略。

  • 不支持bytes_receivedheaders_received信号。

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指向RFPDupeFilter的自定义子类,该子类覆盖其__init__方法以使用不同的请求指纹生成类。例如:

from scrapy.dupefilters import RFPDupeFilter
from scrapy.utils.request import fingerprint


class CustomRequestFingerprinter:
    def fingerprint(self, request):
        return fingerprint(request, include_headers=["X-ID"])


class CustomDupeFilter(RFPDupeFilter):

    def __init__(self, path=None, debug=False, *, fingerprinter=None):
        super().__init__(
            path=path, debug=debug, fingerprinter=CustomRequestFingerprinter()
        )

要禁用重复请求过滤,请将DUPEFILTER_CLASS设置为'scrapy.dupefilters.BaseDupeFilter'。请注意,不过滤重复请求可能会导致爬取循环。通常最好在不应过滤的特定Request对象的__init__方法中将dont_filter参数设置为True

分配给DUPEFILTER_CLASS的类必须实现以下接口:

class MyDupeFilter:

    @classmethod
    def from_settings(cls, settings):
        """Returns an instance of this duplicate request filtering class
        based on the current crawl settings."""
        return cls()

    def request_seen(self, request):
        """Returns ``True`` if *request* is a duplicate of another request
        seen in a previous call to :meth:`request_seen`, or ``False``
        otherwise."""
        return False

    def open(self):
        """Called before the spider opens. It may return a deferred."""
        pass

    def close(self, reason):
        """Called before the spider closes. It may return a deferred."""
        pass

    def log(self, request, spider):
        """Logs that a request has been filtered out.

        It is called right after a call to :meth:`request_seen` that
        returns ``True``.

        If :meth:`request_seen` always returns ``False``, such as in the
        case of :class:`~scrapy.dupefilters.BaseDupeFilter`, this method
        may be omitted.
        """
        pass
class scrapy.dupefilters.BaseDupeFilter[源代码]

空的重复请求过滤类(DUPEFILTER_CLASS),不会过滤任何请求。

class scrapy.dupefilters.RFPDupeFilter(path: str | None = None, debug: bool = False, *, fingerprinter: RequestFingerprinterProtocol | None = None)[源代码]

重复请求过滤类(DUPEFILTER_CLASS),根据规范化(w3lib.url.canonicalize_url())的urlmethodbody来过滤请求。

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 Temp dir 允许您设置一个自定义文件夹来保存爬虫临时文件,以便在使用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 meta 中没有 "ftp_password" 时,用于 FTP 连接的密码。

注意

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

FTP_USER

默认值: "anonymous"

Request meta 中没有 "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 中默认启用的管道。您不应在项目中修改此设置,而应修改 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 datetime 文档

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,则显示负责日志输出的组件。

LOG_VERSIONS

默认值: ["lxml", "libxml2", "cssselect", "parsel", "w3lib", "Twisted", "Python", "pyOpenSSL", "cryptography", "Platform"]

记录指定项目的已安装版本。

项目可以是任何已安装的 Python 包。

还支持以下特殊项目:

LOGSTATS_INTERVAL

默认值: 60.0

LogStats 记录统计数据的间隔(以秒为单位)。

MEMDEBUG_ENABLED

默认值: False

是否启用内存调试。

MEMDEBUG_NOTIFY

默认值: []

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

示例

MEMDEBUG_NOTIFY = ['user@example.com']

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 = ['user@example.com']

参见 内存使用扩展

MEMUSAGE_WARNING_MB

默认值: 0

范围: scrapy.extensions.memusage

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

NEWSPIDER_MODULE

默认值: "<project name>.spiders"回退: ""

使用 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

默认值: True回退: False

如果启用,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 头部或 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.DownloaderAwarePriorityQueuescrapy.pqueues.DownloaderAwarePriorityQueue 在您并行爬取许多不同域名时比 scrapy.pqueues.ScrapyPriorityQueue 效果更好。但目前 scrapy.pqueues.DownloaderAwarePriorityQueue 不与 CONCURRENT_REQUESTS_PER_IP 一起工作。

SCHEDULER_START_DISK_QUEUE

默认值: 'scrapy.squeues.PickleFifoDiskQueue'

调度器 用于 start requests 的磁盘队列类型(参见 JOBDIR)。

有关可用选项,请参见 SCHEDULER_DISK_QUEUE

使用 None"" 完全禁用这些单独的队列,改为让 start requests 与其他请求共享相同的队列。

注意

禁用单独的 start request 队列会使 start request 顺序 不直观:start requests 只会按顺序发送,直到达到 CONCURRENT_REQUESTS,然后剩余的 start requests 将按反向顺序发送。

SCHEDULER_START_MEMORY_QUEUE

默认值: 'scrapy.squeues.FifoMemoryQueue'

调度器 用于 start requests 的内存队列类型。

有关可用选项,请参见 SCHEDULER_MEMORY_QUEUE

使用 None"" 完全禁用这些单独的队列,改为让 start requests 与其他请求共享相同的队列。

注意

禁用单独的 start request 队列会使 start request 顺序 不直观:start requests 只会按顺序发送,直到达到 CONCURRENT_REQUESTS,然后剩余的 start requests 将按反向顺序发送。

SCRAPER_SLOT_MAX_ACTIVE_SIZE

版本 2.0 中新增。

默认值: 5_000_000

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

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

SPIDER_CONTRACTS

默认值:: {}

一个字典,包含项目中启用的爬虫契约,用于测试爬虫。更多信息请参阅 爬虫契约

SPIDER_CONTRACTS_BASE

默认值

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

一个字典,包含 Scrapy 中默认启用的爬虫契约。您不应在项目中修改此设置,而应修改 SPIDER_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

默认值:: {}

一个字典,包含项目中启用的爬虫中间件及其顺序。更多信息请参阅 激活爬虫中间件

SPIDER_MIDDLEWARES_BASE

默认值

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

一个字典,包含 Scrapy 中默认启用的爬虫中间件及其顺序。较低的顺序更接近引擎,较高的顺序更接近爬虫。更多信息请参阅 激活爬虫中间件

SPIDER_MODULES

默认值: ["<project name>.spiders"]回退: []

一个列表,列出了 Scrapy 将查找爬虫的模块。

示例

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

STATS_CLASS

默认值: 'scrapy.statscollectors.MemoryStatsCollector'

用于收集统计信息的类,该类必须实现 Stats Collector API

STATS_DUMP

默认值: True

爬虫完成时转储 Scrapy 统计信息(到 Scrapy 日志)。

更多信息请参阅: 统计信息收集

STATSMAILER_RCPTS

默认值: [] (空列表)

在爬虫完成爬取后发送 Scrapy 统计信息。更多信息请参阅 StatsMailer

TELNETCONSOLE_ENABLED

默认值: True

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

TEMPLATES_DIR

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

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

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

TWISTED_REACTOR

版本 2.0 中新增。

默认值: "twisted.internet.asyncioreactor.AsyncioSelectorReactor"

给定 reactor 的导入路径。

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

如果您正在使用 CrawlerRunner 类,您还需要手动安装正确的 reactor。您可以使用 install_reactor() 来实现:

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

安装具有指定导入路径的 reactor。如果启用了 asyncio reactor,也会安装具有指定导入路径的 asyncio 事件循环。

如果已安装 reactor,install_reactor() 无效。

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

为了使用 Scrapy 安装的 reactor:

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)

    async def start(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)

    async def start(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")

如果此设置设置为 None,则 Scrapy 将使用已安装的现有 reactor(如果存在),否则安装 Twisted 为当前平台定义的默认 reactor。

版本 2.7 中的变化: startproject 命令现在在生成的 settings.py 文件中将此设置设置为 twisted.internet.asyncioreactor.AsyncioSelectorReactor

版本 2.13 中的变化: 默认值从 None 更改为 "twisted.internet.asyncioreactor.AsyncioSelectorReactor"

更多信息请参阅 选择 Reactor 和 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 也会使用此用户代理。

WARN_ON_GENERATOR_RETURN_VALUE

默认值: True

启用后,如果基于生成器的回调方法(如 parse)包含非 None 值的 return 语句,Scrapy 将发出警告。这有助于检测爬虫开发中的潜在错误。

禁用此设置可防止在运行时动态修改生成器函数源代码时可能发生的语法错误,跳过对回调函数的 AST 解析,或在自动重载开发环境中提高性能。

其他地方记录的设置:

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