设置

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

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

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

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

指定设置

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

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

填充设置

设置可以通过不同的机制进行填充,每种机制都有不同的优先级。以下是按优先级递减顺序排列的列表:

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

  2. 每个爬虫的设置

  3. 项目设置模块

  4. 由附加组件设置的设置

  5. 每个命令的默认设置

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

这些设置源的人口由内部处理,但也可以使用API调用进行手动处理。请参阅Settings API主题以获取参考。

这些机制将在下面更详细地描述。

1. 命令行选项

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

示例:

scrapy crawl myspider -s LOG_FILE=scrapy.log

2. 每个爬虫的设置

蜘蛛(请参考Spiders章节)可以定义自己的设置,这些设置将优先并覆盖项目设置。一种方法是通过设置它们的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 arguments 或其他逻辑:

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. 由附加组件设置的设置

Add-ons 可以修改设置。它们应该按照这个优先级进行,尽管这不是强制性的。

5. 每个命令的默认设置

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

6. 默认全局设置

全局默认设置位于scrapy.settings.default_settings模块中,并在内置设置参考部分中有详细文档。

与pickle的兼容性

设置的值必须是picklable

导入路径和类

版本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 属性在蜘蛛初始化后在基础蜘蛛类中设置。如果你想在初始化之前使用设置(例如,在你的蜘蛛的 __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_ENABLED, ROBOTSTXT_OBEY, ROBOTSTXT_CACHEDIR等。

内置设置参考

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

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

附加组件

默认值:{}

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

AWS_ACCESS_KEY_ID

默认值:None

用于需要访问亚马逊网络服务的代码的AWS访问密钥, 例如S3 feed storage backend

AWS_SECRET_ACCESS_KEY

默认值:None

用于需要访问亚马逊网络服务的代码的AWS密钥, 例如S3 feed storage backend

AWS_SESSION_TOKEN

默认值:None

用于需要访问亚马逊网络服务的代码的AWS安全令牌, 例如在使用临时安全凭证时的S3 feed storage backend

AWS_ENDPOINT_URL

默认值:None

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

AWS_USE_SSL

默认值:None

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

AWS_验证

默认值:None

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

AWS_REGION_NAME

默认值:None

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

ASYNCIO_EVENT_LOOP

默认值:None

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

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

如果您正在手动安装asyncio反应器,使用install_reactor()函数,您可以使用event_loop_path参数来指定要使用的事件循环类的导入路径。

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

注意

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

BOT_NAME

默认值:'scrapybot'

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

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

并发项目

默认值:100

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

并发请求

默认值:16

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

每个域的并发请求数

默认值:8

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

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

每个IP的并发请求数

默认值:0

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

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

DEFAULT_ITEM_CLASS

默认值:'scrapy.Item'

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

默认请求头

默认:

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

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

注意

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

深度限制

默认值:0

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

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

深度优先

默认值:0

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

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

请求的优先级调整如下:

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

随着深度的增加,DEPTH_PRIORITY的正值会降低请求优先级(BFO),而负值则会增加请求优先级(DFO)。另请参阅Does Scrapy crawl in breadth-first or depth-first order?

注意

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

深度统计详细信息

默认值:False

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

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

DNSCACHE_ENABLED

默认值:True

是否启用DNS内存缓存。

DNSCACHE_SIZE

默认值:10000

DNS内存缓存大小。

DNS解析器

版本2.0新增。

默认值:'scrapy.resolver.CachingThreadedResolver'

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

DNS超时

默认值:60

处理DNS查询的超时时间,单位为秒。支持浮点数。

下载器

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

用于爬取的下载器。

下载器_HTTP客户端工厂

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

下载器客户端上下文工厂

默认值:'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网站所必需的:例如,您可能需要使用'DEFAULT:!DH'来访问具有弱DH参数的网站,或者如果网站要求,启用DEFAULT中未包含的特定加密算法。

下载器客户端TLS方法

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

下载器客户端TLS详细日志记录

默认值:False

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

此设置仅用于默认的 DOWNLOADER_CLIENTCONTEXTFACTORY

下载器中间件

默认值:: {}

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

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。更多信息请参见激活下载器中间件

下载器统计

默认值:True

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

下载延迟

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

你可以通过将None分配给它们在DOWNLOAD_HANDLERS中的URI方案来禁用任何这些下载处理器。例如,要禁用内置的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 = {
    "quotes.toscrape.com": {"concurrency": 1, "delay": 2, "randomize_delay": False},
    "books.toscrape.com": {"delay": 3, "randomize_delay": False},
}

注意

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

下载超时

默认值:180

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

注意

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

下载最大大小

默认值:1073741824 (1 GiB)

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

这适用于压缩前后。如果解压缩响应体超过此限制,解压缩将被中止,并且响应将被忽略。

使用 0 来禁用此限制。

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

下载警告大小

默认值: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' 来禁用重复请求的过滤。 但是,请非常小心这一点,因为您可能会陷入爬取循环。 通常更好的做法是在不应过滤的特定 Request 上将 dont_filter 参数设置为 True

DUPEFILTER_DEBUG

默认值:False

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

编辑器

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

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

扩展

默认值:: {}

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

扩展基础

默认:

{
    "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 目录允许您设置一个自定义文件夹,用于在上传到 FTP feed storageAmazon S3 之前保存爬虫的临时文件。

FEED_STORAGE_GCS_ACL

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

FTP被动模式

默认值:True

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

FTP密码

默认值: "guest"

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

注意

引用RFC 1635,虽然通常使用密码“guest”或电子邮件地址进行匿名FTP登录,但一些FTP服务器明确要求用户提供电子邮件地址,并且不允许使用“guest”密码登录。

FTP用户

默认值:"anonymous"

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

GCS_PROJECT_ID

默认值:None

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

项目管道

默认值:{}

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

示例:

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

ITEM_PIPELINES_BASE

默认值:{}

一个包含Scrapy中默认启用的管道的字典。你永远不应该在你的项目中修改这个设置,而是应该修改ITEM_PIPELINES

JOBDIR

默认值:None

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

日志启用

默认值:True

是否启用日志记录。

日志编码

默认值:'utf-8'

用于日志记录的编码。

日志文件

默认值:None

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

LOG_FILE_APPEND

默认值:True

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

日志格式

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

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

日志日期格式

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

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

日志格式化器

默认值:scrapy.logformatter.LogFormatter

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

日志级别

默认值:'DEBUG'

记录的最低级别。可用的级别有:CRITICAL, ERROR, WARNING, INFO, DEBUG。更多信息请参见 Logging

LOG_STDOUT

默认值:False

如果 True,你的进程的所有标准输出(和错误)将被重定向到日志中。例如,如果你 print('hello'),它将会出现在 Scrapy 日志中。

日志简称

默认值:False

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

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)。

参见 内存使用扩展

内存使用限制(MB)

默认值:0

范围: scrapy.extensions.memusage

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

参见 内存使用扩展

内存使用检查间隔秒数

默认值:60.0

范围: scrapy.extensions.memusage

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

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

参见 内存使用扩展

内存使用通知邮件

默认值:False

范围: scrapy.extensions.memusage

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

示例:

MEMUSAGE_NOTIFY_MAIL = ['user@example.com']

参见 内存使用扩展

内存使用警告(MB)

默认值:0

范围: scrapy.extensions.memusage

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

NEWSPIDER_MODULE

默认值: ''

使用genspider命令创建新爬虫的模块。

示例:

NEWSPIDER_MODULE = 'mybot.spiders_dev'

随机化下载延迟

默认值: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不足的问题,请增加此值。

重定向优先级调整

默认值:+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头或USER_AGENT设置(按此顺序)来确定在robots.txt文件中使用的用户代理。

调度器

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

用于爬取的调度器类。 详情请参见Scheduler主题。

调度器调试

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

调度器磁盘队列

默认值:'scrapy.squeues.PickleLifoDiskQueue'

调度器将使用的磁盘队列类型。其他可用的类型有 scrapy.squeues.PickleFifoDiskQueue, scrapy.squeues.MarshalFifoDiskQueue, scrapy.squeues.MarshalLifoDiskQueue.

调度器内存队列

默认值:'scrapy.squeues.LifoMemoryQueue'

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

调度器优先级队列

默认值: 'scrapy.pqueues.ScrapyPriorityQueue'

调度器使用的优先级队列类型。另一种可用的类型是 scrapy.pqueues.DownloaderAwarePriorityQueuescrapy.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中默认启用的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 runspider, scrapy settings, scrapy startproject, scrapy 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

默认值:[]

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

示例:

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

统计类

默认值:'scrapy.statscollectors.MemoryStatsCollector'

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

统计信息转储

默认值:True

在蜘蛛完成后,将Scrapy统计信息转储(到Scrapy日志中)。

更多信息请参阅:Stats Collection

STATSMAILER_RCPTS

默认值:[](空列表)

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

TELNETCONSOLE_ENABLED

默认值:True

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

模板目录

默认:templates 目录在 scrapy 模块内

在使用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 reactor,还会安装具有指定导入路径的asyncio事件循环。

如果已经安装了反应器, install_reactor() 将不会产生任何效果。

CrawlerRunner.__init__ 如果安装的反应器与 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 命令现在将此设置设置为 twisted.internet.asyncioreactor.AsyncioSelectorReactor 在生成的 settings.py 文件中。

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

URL长度限制

默认值:2083

范围: spidermiddlewares.urllength

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

此设置可以作为停止条件,以防止URL长度不断增加,这可能是由于目标服务器或您的代码中的编程错误引起的。另请参阅REDIRECT_MAX_TIMESDEPTH_LIMIT

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

默认值是从Microsoft Internet Explorer 最大 URL 长度复制的,尽管此设置存在的原因不同。

用户代理

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

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

在其他地方记录的设置:

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