下载器中间件

下载器中间件是 Scrapy 请求/响应处理的钩子框架。它是一个轻量级的低层系统,用于全局修改 Scrapy 的请求和响应。

激活下载器中间件

要激活下载器中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES 设置中,该设置是一个字典,其键是中间件类路径,值是中间件的顺序。

示例

DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.CustomDownloaderMiddleware": 543,
}

DOWNLOADER_MIDDLEWARES 设置会与 Scrapy 中定义的 DOWNLOADER_MIDDLEWARES_BASE 设置(不应被覆盖)合并,然后按顺序排序以获得最终启用的中间件列表:第一个中间件离引擎更近,最后一个离下载器更近。换句话说,每个中间件的 process_request() 方法将按中间件顺序递增调用(100、200、300 等),而每个中间件的 process_response() 方法将按顺序递减调用。

要决定为您的中间件分配哪个顺序,请查看 DOWNLOADER_MIDDLEWARES_BASE 设置并根据您想插入中间件的位置选择一个值。顺序很重要,因为每个中间件执行不同的操作,您的中间件可能依赖于之前(或之后)应用的一些中间件。

如果您想禁用内置中间件(即 DOWNLOADER_MIDDLEWARES_BASE 中定义并默认启用的中间件),您必须在项目的 DOWNLOADER_MIDDLEWARES 设置中定义它,并将其值设置为 None。例如,如果您想禁用 user-agent 中间件

DOWNLOADER_MIDDLEWARES = {
    "myproject.middlewares.CustomDownloaderMiddleware": 543,
    "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": None,
}

最后,请记住某些中间件可能需要通过特定设置来启用。有关更多信息,请参阅每个中间件的文档。

编写自己的下载器中间件

每个下载器中间件都是一个 组件,它定义了一个或多个以下方法

class scrapy.downloadermiddlewares.DownloaderMiddleware

注意

任何下载器中间件方法也可能返回一个 deferred(延迟对象)。

process_request(request, spider)

此方法在每个经过下载器中间件的请求被调用时执行。

process_request() 应该返回以下之一:None,一个 Response 对象,一个 Request 对象,或抛出 IgnoreRequest 异常。

如果它返回 None,Scrapy 将继续处理此请求,执行所有其他中间件,直到最终调用相应的下载器处理程序来执行请求(并下载其响应)。

如果它返回一个 Response 对象,Scrapy 将不再调用 *任何* 其他 process_request()process_exception() 方法,也不会调用相应的下载函数;它将直接返回该响应。已安装中间件的 process_response() 方法始终会在每个响应上被调用。

如果它返回一个 Request 对象,Scrapy 将停止调用 process_request() 方法并重新调度返回的请求。一旦新的请求被执行,相应的中间件链将对下载的响应进行调用。

如果它抛出 IgnoreRequest 异常,则将调用已安装下载器中间件的 process_exception() 方法。如果没有中间件处理该异常,则会调用请求的 errback 函数(Request.errback)。如果没有代码处理抛出的异常,它将被忽略且不记录日志(与其他异常不同)。

参数:
  • request (Request 对象) – 正在处理的请求

  • spider (Spider 对象) – 此请求所属的爬虫

process_response(request, response, spider)

process_response() 应该返回以下之一:一个 Response 对象,一个 Request 对象,或抛出 IgnoreRequest 异常。

如果它返回一个 Response 对象(可以是给定的同一个响应,也可以是一个全新的响应),该响应将继续由链中下一个中间件的 process_response() 方法处理。

如果它返回一个 Request 对象,中间件链将中止,并且返回的请求将被重新调度以便将来下载。这与 process_request() 返回请求时的行为相同。

如果它抛出 IgnoreRequest 异常,则会调用请求的 errback 函数(Request.errback)。如果没有代码处理抛出的异常,它将被忽略且不记录日志(与其他异常不同)。

参数:
  • request (Request 对象) – 产生此响应的请求

  • response (Response 对象) – 正在处理的响应

  • spider (Spider 对象) – 此响应所属的爬虫

process_exception(request, exception, spider)

当下载处理程序或 process_request()(来自下载器中间件)抛出异常(包括 IgnoreRequest 异常)时,Scrapy 会调用 process_exception() 方法

process_exception() 应该返回以下之一:None,一个 Response 对象,或一个 Request 对象。

如果它返回 None,Scrapy 将继续处理此异常,执行所有其他已安装中间件的 process_exception() 方法,直到没有中间件剩余,然后启用默认异常处理。

如果它返回一个 Response 对象,则会启动已安装中间件的 process_response() 方法链,Scrapy 将不再调用任何其他中间件的 process_exception() 方法。

如果它返回一个 Request 对象,返回的请求将被重新调度以便将来下载。这会像返回响应一样停止中间件 process_exception() 方法的执行。

参数:
  • request (Request 对象) – 产生异常的请求

  • exception (`Exception` 对象) – 抛出的异常

  • spider (Spider 对象) – 此请求所属的爬虫

内置下载器中间件参考

本页面描述了 Scrapy 内置的所有下载器中间件组件。有关如何使用它们以及如何编写自己的下载器中间件的信息,请参阅下载器中间件使用指南

有关默认启用(及其顺序)的组件列表,请参阅 DOWNLOADER_MIDDLEWARES_BASE 设置。

CookiesMiddleware

class scrapy.downloadermiddlewares.cookies.CookiesMiddleware[source]

此中间件支持处理需要 cookie 的网站,例如使用会话的网站。它会跟踪 Web 服务器发送的 cookie,并在后续请求(来自同一个爬虫)中像 Web 浏览器一样将它们发送回去。

注意

当非 UTF-8 编码的字节序列传递给 Request 时,CookiesMiddleware 将记录一个警告。请参阅高级自定义以定制日志行为。

注意

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

以下设置可用于配置 cookie 中间件

COOKIES_ENABLED

默认值:True

是否启用 cookies 中间件。如果禁用,将不会向 Web 服务器发送任何 cookie。

请注意,无论 COOKIES_ENABLED 设置的值如何,如果 Request.meta['dont_merge_cookies'] 的计算结果为 True,则请求的 cookie 将**不会**发送到 Web 服务器,并且在 Response 中收到的 cookie 将**不会**与现有 cookie 合并。

有关更详细的信息,请参阅 Request 中的 cookies 参数。

COOKIES_DEBUG

默认值:False

如果启用,Scrapy 将记录请求中发送的所有 cookie(即 Cookie 头)以及响应中收到的所有 cookie(即 Set-Cookie 头)。

以下是启用 COOKIES_DEBUG 时的日志示例

2011-04-06 14:35:10-0300 [scrapy.core.engine] INFO: Spider opened
2011-04-06 14:35:10-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Sending cookies to: <GET http://www.diningcity.com/netherlands/index.html>
        Cookie: clientlanguage_nl=en_EN
2011-04-06 14:35:14-0300 [scrapy.downloadermiddlewares.cookies] DEBUG: Received cookies from: <200 http://www.diningcity.com/netherlands/index.html>
        Set-Cookie: JSESSIONID=B~FA4DC0C496C8762AE4F1A620EAB34F38; Path=/
        Set-Cookie: ip_isocode=US
        Set-Cookie: clientlanguage_nl=en_EN; Expires=Thu, 07-Apr-2011 21:21:34 GMT; Path=/
2011-04-06 14:49:50-0300 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.diningcity.com/netherlands/index.html> (referer: None)
[...]

DefaultHeadersMiddleware

class scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware[source]

此中间件设置 DEFAULT_REQUEST_HEADERS 设置中指定的所有默认请求头。

DownloadTimeoutMiddleware

class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware[source]

此中间件设置 DOWNLOAD_TIMEOUT 设置或 download_timeout 爬虫属性中指定的请求下载超时。

注意

您还可以使用 download_timeout Request.meta 键按请求设置下载超时;即使禁用 DownloadTimeoutMiddleware,这也受支持。

HttpAuthMiddleware

class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware[source]

此中间件使用基本访问认证(即 HTTP 认证)对某些爬虫生成的请求进行认证。

要为爬虫启用 HTTP 认证,请将 http_userhttp_pass 爬虫属性设置为认证数据,并将 http_auth_domain 爬虫属性设置为需要此认证的域名(其子域名也将以相同方式处理)。您可以将 http_auth_domain 设置为 None 以启用所有请求的认证,但这可能会将您的认证凭据泄露给不相关的域名。

警告

在以前的 Scrapy 版本中,HttpAuthMiddleware 会随所有请求一起发送认证数据,如果爬虫向多个不同域名发出请求,这会带来安全问题。目前,如果未设置 http_auth_domain 属性,中间件将使用第一个请求的域名,这适用于某些爬虫但不适用于其他爬虫。将来,中间件将产生错误而不是继续处理。

示例

from scrapy.spiders import CrawlSpider


class SomeIntranetSiteSpider(CrawlSpider):
    http_user = "someuser"
    http_pass = "somepass"
    http_auth_domain = "intranet.example.com"
    name = "intranet.example.com"

    # .. rest of the spider code omitted ...

HttpCacheMiddleware

class scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware[source]

此中间件为所有 HTTP 请求和响应提供低级缓存。它必须与缓存存储后端和缓存策略结合使用。

Scrapy 内置了以下 HTTP 缓存存储后端

您可以使用 HTTPCACHE_STORAGE 设置更改 HTTP 缓存存储后端。或者您也可以实现自己的存储后端。

Scrapy 内置了两种 HTTP 缓存策略

您可以使用 HTTPCACHE_POLICY 设置更改 HTTP 缓存策略。或者您也可以实现自己的策略。

您还可以通过将 dont_cache 元数据键设置为 True 来阻止对任何策略的响应进行缓存。

Dummy policy(默认策略)

class scrapy.extensions.httpcache.DummyPolicy[source]

此策略不感知任何 HTTP Cache-Control 指令。每个请求及其相应的响应都会被缓存。当再次看到相同的请求时,直接返回缓存中的响应,而无需从互联网传输任何内容。

Dummy policy 对于更快地测试爬虫(无需每次都等待下载)以及在没有互联网连接时离线尝试爬虫非常有用。其目标是能够 *精确地* “重放”爬虫之前的运行。

RFC2616 策略

class scrapy.extensions.httpcache.RFC2616Policy[source]

此策略提供符合 RFC2616 标准的 HTTP 缓存,即感知 HTTP Cache-Control 指令,旨在用于生产环境和持续运行中,避免下载未修改的数据(以节省带宽并加快爬取速度)。

已实现的功能

  • 不尝试存储设置了 no-store cache-control 指令的响应/请求

  • 即使对于新鲜的响应,如果设置了 no-cache cache-control 指令,也不从缓存中提供响应

  • 根据 max-age cache-control 指令计算新鲜度生命周期

  • 根据 Expires 响应头计算新鲜度生命周期

  • 根据 Last-Modified 响应头计算新鲜度生命周期(Firefox 使用的启发式方法)

  • 根据 Age 响应头计算当前年龄

  • 根据 Date 头计算当前年龄

  • 根据 Last-Modified 响应头重新验证过时响应

  • 根据 ETag 响应头重新验证过时响应

  • 为任何缺少 Date 头的接收到的响应设置 Date

  • 支持请求中的 max-stale cache-control 指令

这使得爬虫可以配置完整的 RFC2616 缓存策略,同时按请求避免重新验证,并保持与 HTTP 规范的一致性。

示例

向 Request 头添加 Cache-Control: max-stale=600 以接受过期时间不超过 600 秒的响应。

另请参阅:RFC2616, 14.9.3

缺失的功能

文件系统存储后端(默认)

class scrapy.extensions.httpcache.FilesystemCacheStorage[source]

文件系统存储后端可用于 HTTP 缓存中间件。

每个请求/响应对存储在不同的目录中,包含以下文件

  • request_body - 原始请求体

  • request_headers - 请求头(原始 HTTP 格式)

  • response_body - 原始响应体

  • response_headers - 请求头(原始 HTTP 格式)

  • meta - 此缓存资源的一些元数据,采用 Python repr() 格式(grep 友好格式)

  • pickled_meta - 与 meta 中相同的元数据,但经过 pickle 处理以实现更高效的反序列化

目录名称由请求的指纹(参见 scrapy.utils.request.fingerprint)生成,并使用一级子目录来避免在同一目录中创建过多文件(这在许多文件系统中效率低下)。示例目录可能如下

/path/to/cache/dir/example.com/72/72811f648e718090f041317756c03adb0ada46c7

DBM 存储后端

class scrapy.extensions.httpcache.DbmCacheStorage[source]

HTTP 缓存中间件也提供了 DBM 存储后端。

默认情况下,它使用 dbm,但您可以使用 HTTPCACHE_DBM_MODULE 设置更改它。

编写您自己的存储后端

您可以通过创建一个定义以下方法的 Python 类来实现缓存存储后端。

class scrapy.extensions.httpcache.CacheStorage
open_spider(spider)

此方法在 spider 已打开以进行抓取后调用。它处理 open_spider 信号。

参数:

spider (Spider 对象) – 已打开的 spider

close_spider(spider)

此方法在 spider 已关闭后调用。它处理 close_spider 信号。

参数:

spider (Spider 对象) – 已关闭的 spider

retrieve_response(spider, request)

如果缓存中存在响应,则返回响应,否则返回 None

参数:
  • spider (Spider 对象) – 生成请求的 spider

  • request (Request 对象) – 要查找缓存响应的请求

store_response(spider, request, response)

将给定的响应存储到缓存中。

参数:
  • spider (Spider 对象) – 响应所属的 spider

  • request (Request 对象) – spider 生成的对应请求

  • response (Response 对象) – 要存储到缓存中的响应

为了使用您自己的存储后端,请将

HTTPCache 中间件设置

HttpCacheMiddleware 可以通过以下设置进行配置

HTTPCACHE_ENABLED

默认值:False

是否启用 HTTP 缓存。

HTTPCACHE_EXPIRATION_SECS

默认值:0

缓存请求的过期时间,单位为秒。

早于此时间的缓存请求将被重新下载。如果为零,缓存请求将永远不会过期。

HTTPCACHE_DIR

默认值:'httpcache'

用于存储(低级别)HTTP 缓存的目录。如果为空,HTTP 缓存将被禁用。如果给定相对路径,则相对于项目数据目录。更多信息请参见:Scrapy 项目的默认结构

HTTPCACHE_IGNORE_HTTP_CODES

默认值:[]

不对具有这些 HTTP 状态码的响应进行缓存。

HTTPCACHE_IGNORE_MISSING

默认值:False

如果启用,缓存中找不到的请求将被忽略,而不是下载。

HTTPCACHE_IGNORE_SCHEMES

默认值:['file']

不对具有这些 URI 方案的响应进行缓存。

HTTPCACHE_STORAGE

默认值:'scrapy.extensions.httpcache.FilesystemCacheStorage'

实现缓存存储后端的类。

HTTPCACHE_DBM_MODULE

默认值:'dbm'

DBM 存储后端 中使用的数据库模块。此设置为 DBM 后端特有。

HTTPCACHE_POLICY

默认值:'scrapy.extensions.httpcache.DummyPolicy'

实现缓存策略的类。

HTTPCACHE_GZIP

默认值:False

如果启用,将使用 gzip 压缩所有缓存数据。此设置为 Filesystem 后端特有。

HTTPCACHE_ALWAYS_STORE

默认值:False

如果启用,将无条件缓存页面。

spider 可能希望将所有响应都存储在缓存中,以便将来配合 Cache-Control: max-stale 使用。DummyPolicy 缓存所有响应但从不重新验证它们,有时需要更细致的策略。

此设置仍然遵循响应中的 Cache-Control: no-store 指令。如果您不希望这样,请过滤掉您提供给缓存中间件的响应中的 no-store Cache-Control 头部。

HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS

默认值:[]

要忽略的响应中 Cache-Control 指令列表。

网站通常设置“no-store”、“no-cache”、“must-revalidate”等,但如果 spider 实际遵守这些指令,就会因为流量而感到困扰。这允许有选择地忽略那些对于被抓取的网站而言已知不重要的 Cache-Control 指令。

我们假设 spider 在请求中发出的 Cache-Control 指令是它确实需要的,因此不会过滤请求中的指令。

HttpCompressionMiddleware

class scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware[source]

此中间件允许发送/接收来自网站的压缩(gzip、deflate)流量。

此中间件还支持解码 brotli 压缩以及 zstd 压缩的响应,前提是分别安装了 brotlizstandard

HttpCompressionMiddleware 设置

COMPRESSION_ENABLED

默认值:True

是否启用压缩中间件。

HttpProxyMiddleware

class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware[source]

此中间件通过为 Request 对象设置 proxy meta 值来为请求设置 HTTP 代理。

与 Python 标准库模块 urllib.request 一样,它遵循以下环境变量:

  • http_proxy

  • https_proxy

  • no_proxy

您还可以为每个请求设置 proxy meta 键,值为 http://some_proxy_server:porthttp://username:password@some_proxy_server:port。请注意,此值优先于 http_proxy/https_proxy 环境变量,并且会忽略 no_proxy 环境变量。

HttpProxyMiddleware 设置

HTTPPROXY_ENABLED

默认值:True

是否启用 HttpProxyMiddleware

HTTPPROXY_AUTH_ENCODING

默认值:"latin-1"

HttpProxyMiddleware 中代理身份验证的默认编码。

OffsiteMiddleware

class scrapy.downloadermiddlewares.offsite.OffsiteMiddleware[source]

版本 2.11.2 中新增。

过滤掉 URL 不在 spider 所覆盖域范围内的请求。

此中间件过滤掉所有主机名不在 spider 的 allowed_domains 属性中的请求。列表中任何域的所有子域也都允许。例如,规则 www.example.org 也允许 bob.www.example.org,但不允许 www2.example.comexample.com

当您的 spider 返回一个不属于 spider 覆盖域的请求时,此中间件将记录类似如下的调试消息:

DEBUG: Filtered offsite request to 'offsite.example': <GET http://offsite.example/some/page.html>

为避免日志中出现过多噪音,它只会为每个新过滤的域打印一条这样的消息。因此,例如,如果过滤掉另一个指向 offsite.example 的请求,将不会打印日志消息。但如果过滤掉指向 other.example 的请求,则会打印一条消息(但仅针对第一个过滤的请求)。

如果 spider 未定义 allowed_domains 属性,或该属性为空,则 Offsite 中间件将允许所有请求。

如果请求的 dont_filter 属性设置为 True,或者 Request.meta 中的 allow_offsite 设置为 True,则 OffsiteMiddleware 将允许该请求,即使其域未列在允许的域中。

RedirectMiddleware

class scrapy.downloadermiddlewares.redirect.RedirectMiddleware[source]

此中间件根据响应状态处理请求的重定向。

请求(在重定向过程中)经过的 URL 可以在 Request.metaredirect_urls 键中找到。

redirect_urls 中每次重定向的原因可以在 Request.metaredirect_reasons 键中找到。例如:[301, 302, 307, 'meta refresh']

原因的格式取决于处理相应重定向的中间件。例如,RedirectMiddleware 将触发的响应状态码表示为整数,而 MetaRefreshMiddleware 总是使用字符串 'meta refresh' 作为原因。

RedirectMiddleware 可以通过以下设置进行配置(更多信息请参见设置文档):

如果 Request.meta 中的 dont_redirect 键设置为 True,则此中间件将忽略该请求。

如果您希望在 spider 中处理某些重定向状态码,可以在 handle_httpstatus_list spider 属性中指定这些状态码。

例如,如果您希望重定向中间件忽略 301 和 302 响应(并将它们传递给您的 spider),您可以这样做:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [301, 302]

Request.meta 中的 handle_httpstatus_list 键也可用于按请求指定允许的响应码。您还可以将 meta 键 handle_httpstatus_all 设置为 True,以便允许任何请求的任何响应码。

RedirectMiddleware 设置

REDIRECT_ENABLED

默认值:True

是否启用重定向中间件。

REDIRECT_MAX_TIMES

默认值:20

单个请求将遵循的最大重定向次数。如果超过最大重定向次数,则请求被中止并忽略。

MetaRefreshMiddleware

class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[source]

此中间件根据 meta-refresh html 标签处理请求的重定向。

MetaRefreshMiddleware 可以通过以下设置进行配置(更多信息请参见设置文档):

此中间件遵循 REDIRECT_MAX_TIMES 设置、dont_redirectredirect_urlsredirect_reasons 请求 meta 键,如 RedirectMiddleware 中所述

MetaRefreshMiddleware 设置

METAREFRESH_ENABLED

默认值:True

是否启用 Meta Refresh 中间件。

METAREFRESH_IGNORE_TAGS

默认值:[]

忽略这些标签内的 meta 标签。

版本 2.0 中修改:METAREFRESH_IGNORE_TAGS 的默认值从 ["script", "noscript"] 变为 []

版本 2.11.2 中修改:METAREFRESH_IGNORE_TAGS 的默认值从 [] 变为 ["noscript"]

METAREFRESH_MAXDELAY

默认值:100

遵循重定向的最大 meta-refresh 延迟(单位为秒)。一些网站使用 meta-refresh 重定向到会话过期页面,因此我们将自动重定向限制在最大延迟之内。

RetryMiddleware

class scrapy.downloadermiddlewares.retry.RetryMiddleware[source]

一个用于重试因连接超时或 HTTP 500 错误等临时问题导致的失败请求的中间件。

失败的页面在抓取过程中收集起来,并在 spider 完成所有常规(非失败)页面的抓取后重新调度。

RetryMiddleware 可以通过以下设置进行配置(更多信息请参见设置文档):

如果 Request.meta 中的 dont_retry 键设置为 True,则此中间件将忽略该请求。

要从 spider 回调中重试请求,可以使用 get_retry_request() 函数

scrapy.downloadermiddlewares.retry.get_retry_request(request: Request, *, spider: Spider, reason: str | Exception | type[Exception] = 'unspecified', max_retry_times: int | None = None, priority_adjust: int | None = None, logger: Logger = <Logger scrapy.downloadermiddlewares.retry (WARNING)>, stats_base_key: str = 'retry') Request | None[source]

返回一个新的 Request 对象以重试指定的请求,如果指定请求的重试次数已用尽,则返回 None

例如,在 Spider 回调中,您可以按如下方式使用它:

def parse(self, response):
    if not response.text:
        new_request_or_none = get_retry_request(
            response.request,
            spider=self,
            reason='empty',
        )
        return new_request_or_none

spider 是请求重试请求的 Spider 实例。它用于访问 设置统计信息,并提供额外的日志记录上下文(参见 logging.debug())。

reason 是一个字符串或 Exception 对象,表示请求需要重试的原因。它用于命名重试统计信息。

max_retry_times 是一个数字,确定 request 可以重试的最大次数。如果未指定或为 None,则从请求的 max_retry_times meta 键中读取该数字。如果 max_retry_times meta 键未定义或为 None,则从 RETRY_TIMES 设置中读取该数字。

priority_adjust 是一个数字,确定新请求优先级相对于 request 的变化。如果未指定,则从 RETRY_PRIORITY_ADJUST 设置中读取该数字。

logger 是用于记录消息的 logging.Logger 对象

stats_base_key 是一个字符串,用作与重试相关的 job 统计信息的基键

RetryMiddleware 设置

RETRY_ENABLED

默认值:True

是否启用重试中间件。

RETRY_TIMES

默认值:2

最大重试次数,不包括第一次下载。

最大重试次数也可以通过 Request.metamax_retry_times 属性按请求指定。初始化时,max_retry_times meta 键优先于 RETRY_TIMES 设置。

RETRY_HTTP_CODES

默认值:[500, 502, 503, 504, 522, 524, 408, 429]

需要重试的 HTTP 响应码。其他错误(DNS 查找问题、连接丢失等)总是会重试。

在某些情况下,您可能希望将 400 添加到 RETRY_HTTP_CODES,因为它是一个常用的代码,用于表示服务器过载。默认情况下不包含它,因为 HTTP 规范是这样规定的。

RETRY_EXCEPTIONS

默认值

[
    'twisted.internet.defer.TimeoutError',
    'twisted.internet.error.TimeoutError',
    'twisted.internet.error.DNSLookupError',
    'twisted.internet.error.ConnectionRefusedError',
    'twisted.internet.error.ConnectionDone',
    'twisted.internet.error.ConnectError',
    'twisted.internet.error.ConnectionLost',
    'twisted.internet.error.TCPTimedOutError',
    'twisted.web.client.ResponseFailed',
    IOError,
    'scrapy.core.downloader.handlers.http11.TunnelError',
]

要重试的异常列表。

列表中的每个条目可以是异常类型或其导入路径字符串。

当异常类型不在 RETRY_EXCEPTIONS 中,或者当请求的最大重试次数已超过时(参见 RETRY_TIMES),异常将不会被捕获。要了解未捕获异常的传播,请参见 process_exception()

RETRY_PRIORITY_ADJUST

默认值:-1

调整重试请求的优先级相对于原始请求

  • 正优先级调整意味着优先级更高。

  • 负数优先级调整(默认)意味着较低优先级。

RobotsTxtMiddleware

class scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware[来源]

此中间件会过滤掉 robots.txt 排除标准禁止的请求。

为确保 Scrapy 遵守 robots.txt,请确保此中间件已启用且 ROBOTSTXT_OBEY 设置已启用。

ROBOTSTXT_USER_AGENT 设置可用于指定在 robots.txt 文件中进行匹配时使用的用户代理字符串。如果该值为 None,则将按顺序使用您随请求发送的 User-Agent 头部或 USER_AGENT 设置来确定在 robots.txt 文件中使用的用户代理。

此中间件必须与 robots.txt 解析器结合使用。

Scrapy 内置支持以下 robots.txt 解析器

您可以使用 ROBOTSTXT_PARSER 设置更改 robots.txt 解析器。或者您也可以实现对新解析器的支持

如果 Request.metadont_obey_robotstxt 键设置为 True,则即使 ROBOTSTXT_OBEY 已启用,此中间件也会忽略该请求。

解析器在以下几个方面有所不同

  • 实现语言

  • 支持的规范

  • 支持通配符匹配

  • 长度规则的使用:特别是对于 AllowDisallow 指令,其中基于路径长度的最具体规则优先于不太具体(较短)的规则

不同解析器的性能比较可在此链接 查看

Protego 解析器

基于 Protego

Scrapy 默认使用此解析器。

RobotFileParser

基于 RobotFileParser

它比 Protego 快,并且向后兼容 1.8.0 版本之前的 Scrapy。

为了使用此解析器,请设置

Robotexclusionrulesparser

基于 Robotexclusionrulesparser

为了使用此解析器

  • 通过运行 pip install robotexclusionrulesparser 安装 Robotexclusionrulesparser

  • ROBOTSTXT_PARSER 设置为 scrapy.robotstxt.RerpRobotParser

实现对新解析器的支持

您可以通过继承抽象基类 RobotParser 并实现下述方法来为新的 robots.txt 解析器实现支持。

class scrapy.robotstxt.RobotParser[来源]
abstract allowed(url: str | bytes, user_agent: str | bytes) bool[来源]

如果 user_agent 允许抓取 url,则返回 True,否则返回 False

参数:
  • url (strbytes) – 绝对 URL

  • user_agent (strbytes) – 用户代理

abstract classmethod from_crawler(crawler: Crawler, robotstxt_body: bytes) Self[来源]

robots.txt 文件内容解析为字节。这必须是一个类方法。它必须返回一个新的解析器后端实例。

参数:

DownloaderStats

class scrapy.downloadermiddlewares.stats.DownloaderStats[来源]

此中间件存储所有通过它的请求、响应和异常的统计信息。

要使用此中间件,必须启用 DOWNLOADER_STATS 设置。

UserAgentMiddleware

class scrapy.downloadermiddlewares.useragent.UserAgentMiddleware[来源]

此中间件允许爬虫覆盖默认的用户代理。

为了让爬虫覆盖默认用户代理,必须设置其 user_agent 属性。