下载器中间件

下载器中间件是 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。例如,如果要禁用用户代理中间件

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

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

编写自己的下载器中间件

每个下载器中间件都是一个 Python 类,它定义了一个或多个下面定义的方法。

主要入口点是 from_crawler 类方法,它接收一个 Crawler 实例。例如,Crawler 对象使您可以访问 设置

class scrapy.downloadermiddlewares.DownloaderMiddleware

注意

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

process_request(request, spider)

此方法会对通过下载器中间件的每个请求调用。

process_request() 应该:

如果它返回 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(它可能是给定的相同响应或一个全新的响应),则该响应将继续使用链中下一个中间件的 process_response() 进行处理。

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

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

参数:
  • request(是 Request 对象) – 导致响应的请求

  • responseResponse 对象) – 正在处理的响应

  • spiderSpider 对象) – 此响应的目标蜘蛛

process_exception(request, exception, spider)

当下载处理器或 process_request()(来自下载器中间件)引发异常(包括 IgnoreRequest 异常)时,Scrapy 会调用 process_exception()

process_exception() 应该返回:NoneResponse 对象或 Request 对象。

如果它返回 None,Scrapy 将继续处理此异常,执行已安装中间件的其他任何 process_exception() 方法,直到没有剩余中间件并且默认异常处理开始。

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

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

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

  • exceptionException 对象) – 引发的异常

  • spider (Spider 对象) – 此请求的目标爬虫

from_crawler(cls, crawler)

如果存在,则会调用此类方法以从 Crawler 创建中间件实例。它必须返回中间件的新实例。Crawler 对象提供对所有 Scrapy 核心组件(如设置和信号)的访问;它是中间件访问它们并将功能挂钩到 Scrapy 的一种方式。

参数:

crawlerCrawler 对象) – 使用此中间件的爬虫

内置下载器中间件参考

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

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

CookiesMiddleware

class scrapy.downloadermiddlewares.cookies.CookiesMiddleware[source]

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

注意

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

注意

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

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

COOKIES_ENABLED

默认值:True

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

请注意,尽管 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 来避免在每个策略上缓存响应。

虚拟策略(默认)

class scrapy.extensions.httpcache.DummyPolicy[source]

此策略不了解任何 HTTP Cache-Control 指令。每个请求及其对应的响应都将被缓存。当再次看到相同的请求时,将返回响应,而无需从 Internet 传输任何内容。

虚拟策略可用于更快地测试爬虫(无需每次都等待下载)以及在没有 Internet 连接的情况下尝试脱机运行爬虫。目标是能够“重放”爬虫运行,使其与之前运行完全相同

RFC2616 策略

class scrapy.extensions.httpcache.RFC2616Policy[source]

此策略提供符合 RFC2616 的 HTTP 缓存,即具有 HTTP Cache-Control 意识,旨在用于生产环境并在连续运行中使用,以避免下载未修改的数据(以节省带宽并加快爬取速度)。

已实现的功能

  • 不要尝试存储设置了 no-store 缓存控制指令的响应/请求

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

  • 根据 max-age 缓存控制指令计算新鲜度生命周期

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

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

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

  • 根据 Date 头计算当前年龄

  • 基于 Last-Modified 响应头重新验证陈旧响应

  • 基于 ETag 响应头重新验证陈旧响应

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

  • 支持请求中的 max-stale 缓存控制指令

这允许爬虫配置完整的 RFC2616 缓存策略,但避免在请求的基础上进行重新验证,同时仍然符合 HTTP 规范。

示例

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 中相同的元数据,但已序列化,以便更有效地反序列化

目录名称由请求指纹生成(请参阅 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)

此方法在蜘蛛打开以供爬取后被调用。它处理 open_spider 信号。

参数:

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

close_spider(spider)

此方法在蜘蛛关闭后被调用。它处理 close_spider 信号。

参数:

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

retrieve_response(spider, request)

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

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

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

store_response(spider, request, response)

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

参数:
  • spider (Spider 对象) – 响应的目标蜘蛛

  • request (Request 对象) – 蜘蛛生成的相应请求

  • 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 压缩所有缓存数据。此设置特定于文件系统后端。

HTTPCACHE_ALWAYS_STORE

默认值:False

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

蜘蛛可能希望所有响应都可用于缓存,以便将来与 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”等,但如果蜘蛛实际尊重这些指令,则会对生成的流量感到不安。这允许有选择地忽略已知对正在爬取的站点不重要的 Cache-Control 指令。

我们假设蜘蛛不会在请求中发出 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 元值来设置要用于请求的 HTTP 代理。

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

  • http_proxy

  • https_proxy

  • no_proxy

您还可以为每个请求设置元键 proxy,其值为 http://some_proxy_server:porthttp://username:password@some_proxy_server:port。请记住,此值将优先于 http_proxy/https_proxy 环境变量,并且它也将忽略 no_proxy 环境变量。

OffsiteMiddleware

class scrapy.downloadermiddlewares.offsite.OffsiteMiddleware[source]

版本 2.11.2 中的新功能。

过滤掉超出蜘蛛覆盖的域的 URL 的请求。

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

当您的蜘蛛返回对不属于蜘蛛覆盖的域的请求时,此中间件将记录类似于以下内容的调试消息

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

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

如果蜘蛛没有定义 allowed_domains 属性,或者该属性为空,则 offsite 中间件将允许所有请求。

如果请求具有dont_filter属性设置,即使其域名未列在允许的域名中,离站中间件也将允许该请求。

重定向中间件

class scrapy.downloadermiddlewares.redirect.RedirectMiddleware[source]

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

请求经过的 URL(在重定向期间)可以在redirect_urls Request.meta键中找到。

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

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

RedirectMiddleware可以通过以下设置进行配置(有关更多信息,请参阅设置文档)

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

如果要处理蜘蛛中的某些重定向状态代码,可以在handle_httpstatus_list蜘蛛属性中指定这些代码。

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

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

handle_httpstatus_listRequest.meta也可以用于指定每个请求允许哪些响应代码。如果要允许请求的任何响应代码,还可以将元数据键handle_httpstatus_all设置为True

重定向中间件设置

REDIRECT_ENABLED

默认值:True

是否启用重定向中间件。

REDIRECT_MAX_TIMES

默认值:20

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

元刷新中间件

class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[source]

此中间件根据元刷新 html 标签处理请求的重定向。

MetaRefreshMiddleware可以通过以下设置进行配置(有关更多信息,请参阅设置文档)

此中间件遵守REDIRECT_MAX_TIMES设置、dont_redirectredirect_urlsredirect_reasons请求元数据键,如RedirectMiddleware所述。

元刷新中间件设置

METAREFRESH_ENABLED

默认值:True

是否启用元刷新中间件。

METAREFRESH_IGNORE_TAGS

默认值:[]

这些标签中的元标签将被忽略。

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

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

METAREFRESH_MAXDELAY

默认值:100

要遵循重定向的最大元刷新延迟(以秒为单位)。某些站点使用元刷新重定向到会话过期页面,因此我们将自动重定向限制为最大延迟。

重试中间件

class scrapy.downloadermiddlewares.retry.RetryMiddleware[source]

一个中间件,用于重试可能由临时问题(例如连接超时或 HTTP 500 错误)引起的失败请求。

失败的页面在抓取过程中收集,并在蜘蛛完成所有常规(非失败)页面的抓取后重新安排。

RetryMiddleware可以通过以下设置进行配置(有关更多信息,请参阅设置文档)

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

要重试蜘蛛回调中的请求,可以使用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 元键读取该数字。如果 max_retry_times 元键未定义或为 None,则从 RETRY_TIMES 设置读取该数字。

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

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

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

RetryMiddleware 设置

RETRY_ENABLED

默认值:True

Retry 中间件是否启用。

RETRY_TIMES

默认值:2

除了第一次下载之外,重试的最大次数。

还可以使用 Request.metamax_retry_times 属性为每个请求指定最大重试次数。初始化时,max_retry_times 元键的优先级高于 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[source]

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

要确保 Scrapy 遵守 robots.txt,请确保启用了中间件,并启用了 ROBOTSTXT_OBEY 设置。

ROBOTSTXT_USER_AGENT 设置可用于指定用于在 robots.txt 文件中匹配的用户代理字符串。如果它为 None,则将使用您与请求一起发送的用户代理标头或 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[source]
abstract allowed(url: str | bytes, user_agent: str | bytes) bool[source]

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

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

  • user_agent (strbytes) – 用户代理

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

robots.txt 文件的内容(以字节形式)进行解析。这必须是一个类方法。它必须返回解析器后端的新实例。

参数:

DownloaderStats

class scrapy.downloadermiddlewares.stats.DownloaderStats[source]

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

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

UserAgentMiddleware

class scrapy.downloadermiddlewares.useragent.UserAgentMiddleware[source]

允许蜘蛛覆盖默认用户代理的中间件。

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

AjaxCrawlMiddleware

class scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware[source]

基于元片段 html 标签查找“AJAX 可抓取”页面变体的中间件。

注意

即使没有此中间件,Scrapy 也会为类似 'http://example.com/!#foo=bar' 的 URL 查找“AJAX 可抓取”页面。当 URL 不包含 '!#' 时,需要使用 AjaxCrawlMiddleware。这通常是网站“索引”或“主”页面的情况。

AjaxCrawlMiddleware 设置

AJAXCRAWL_ENABLED

默认值:False

是否启用 AjaxCrawlMiddleware。对于 广泛抓取,您可能希望启用它。

HttpProxyMiddleware 设置

HTTPPROXY_ENABLED

默认值:True

是否启用 HttpProxyMiddleware

HTTPPROXY_AUTH_ENCODING

默认值:"latin-1"

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