下载器中间件

下载器中间件是一个钩子框架,用于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 对象让你可以访问,例如,settings

class scrapy.downloadermiddlewares.DownloaderMiddleware

注意

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

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()方法将被调用。如果它们都没有处理该异常,请求的错误回调函数(Request.errback)将被调用。如果没有代码处理引发的异常,它将被忽略且不会被记录(与其他异常不同)。

Parameters:
  • 请求 (Request 对象) – 正在处理的请求

  • spider (Spider 对象) – 此请求所针对的蜘蛛

process_response(request, response, spider)

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

如果它返回一个Response(可能是相同的响应,或者是一个全新的响应),该响应将继续被链中的下一个中间件的process_response()处理。

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

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

Parameters:
  • request (是一个 Request 对象) – 发起响应的请求

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

  • spider (Spider 对象) – 此响应所针对的蜘蛛

process_exception(request, exception, spider)

Scrapy 在下载处理器或下载器中间件的 process_request() 抛出异常(包括 IgnoreRequest 异常)时调用 process_exception()

process_exception() 应该返回:要么是 None, 一个 Response 对象,或者一个 Request 对象。

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

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

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

Parameters:
  • request (是一个 Request 对象) – 生成异常的请求

  • 异常 (一个 Exception 对象) – 引发的异常

  • spider (Spider 对象) – 此请求所针对的蜘蛛

from_crawler(cls, crawler)

如果存在,这个类方法被调用来从Crawler创建一个中间件实例。它必须返回一个新的中间件实例。Crawler对象提供了对Scrapy所有核心组件的访问,如设置和信号;这是中间件访问它们并将其功能集成到Scrapy中的一种方式。

Parameters:

爬虫 (Crawler object) – 使用此中间件的爬虫

内置下载器中间件参考

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

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

Cookies中间件

class scrapy.downloadermiddlewares.cookies.CookiesMiddleware[源代码]

此中间件使您能够处理需要cookie的网站,例如使用会话的网站。它跟踪由Web服务器发送的cookie,并在后续请求(来自该爬虫)时将它们发送回去,就像Web浏览器所做的那样。

注意

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

注意

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

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

COOKIES_ENABLED

默认值:True

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

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

有关更多详细信息,请参见cookies参数在 Request中。

COOKIES_DEBUG

默认值:False

如果启用,Scrapy 将记录所有在请求中发送的 cookies(即 Cookie 头)和所有在响应中接收到的 cookies(即 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)
[...]

默认头中间件

class scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware[source]

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

下载超时中间件

class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware[源代码]

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

注意

你也可以使用 download_timeout Request.meta 键为每个请求设置下载超时;即使 DownloadTimeoutMiddleware 被禁用,这也是支持的。

HttpAuthMiddleware

class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware[源代码]

这个中间件使用基本访问认证(也称为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[源代码]

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

Scrapy 附带以下 HTTP 缓存存储后端:

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

Scrapy 提供了两种 HTTP 缓存策略:

你可以通过HTTPCACHE_POLICY设置来更改HTTP缓存策略。或者你也可以实现自己的策略。

你也可以通过使用dont_cache元键等于True来避免在每个策略上缓存响应。

虚拟策略(默认)

class scrapy.extensions.httpcache.DummyPolicy[source]

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

Dummy策略对于更快地测试爬虫(无需每次等待下载)以及在无法使用互联网连接时离线尝试您的爬虫非常有用。目标是能够“重放”爬虫运行完全像之前运行的那样

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]

一个DBM存储后端也可用于HTTP缓存中间件。

默认情况下,它使用dbm,但你可以通过HTTPCACHE_DBM_MODULE设置来更改它。

编写您自己的存储后端

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

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

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

Parameters:

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

close_spider(spider)

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

Parameters:

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

retrieve_response(spider, request)

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

Parameters:
  • spider (Spider 对象) – 生成请求的爬虫

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

store_response(spider, request, response)

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

Parameters:
  • 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 设置

压缩启用

默认值:True

是否启用压缩中间件。

HttpProxyMiddleware

class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware[源代码]

此中间件通过为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[源代码]

新版本2.11.2中新增。

过滤掉请求中URL不在爬虫覆盖的域名范围内的请求。

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

当你的爬虫返回一个不属于爬虫覆盖域名的请求时,这个中间件会记录一个类似于以下的调试信息:

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

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

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

如果请求具有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]

Request.metahandle_httpstatus_list 键也可以用于指定每个请求允许的响应代码。如果你想允许请求的任何响应代码,也可以将元键 handle_httpstatus_all 设置为 True

重定向中间件设置

重定向已启用

默认值:True

是否启用重定向中间件。

重定向最大次数

默认值:20

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

MetaRefreshMiddleware

class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware[source]

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

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

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

MetaRefreshMiddleware 设置

METAREFRESH_ENABLED

默认值:True

是否启用Meta Refresh中间件。

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[源代码]

一个中间件,用于重试可能由临时问题(如连接超时或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[源代码]

返回一个新的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 是一个字符串,用作与重试相关的作业统计信息的基础键

重试中间件设置

重试启用

默认值:True

是否启用重试中间件。

重试次数

默认值:2

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

每次请求的最大重试次数也可以通过使用 max_retry_times 属性在 Request.meta 中指定。 初始化时,max_retry_times 元键的优先级高于 RETRY_TIMES 设置。

重试HTTP代码

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

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

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

重试异常

默认:

[
    '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()

重试优先级调整

默认值:-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 解析器的支持:

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

如果 Request.meta 中的 dont_obey_robotstxt 键设置为 True, 即使启用了 ROBOTSTXT_OBEY,该请求也将被此中间件忽略。

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

  • 实现语言

  • 支持的规范

  • 支持通配符匹配

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

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

Protego 解析器

基于 Protego:

Scrapy 默认使用此解析器。

RobotFileParser

基于 RobotFileParser:

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

为了使用这个解析器,请设置:

机器人排除规则解析器

基于 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[source]

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

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

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

Parameters:

下载器统计

class scrapy.downloadermiddlewares.stats.DownloaderStats[源代码]

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

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

用户代理中间件

class scrapy.downloadermiddlewares.useragent.UserAgentMiddleware[源代码]

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

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

AjaxCrawlMiddleware

class scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware[源代码]

中间件,基于meta-fragment html标签找到‘AJAX可抓取’的页面变体。

注意

Scrapy 可以找到像 'http://example.com/!#foo=bar' 这样的‘AJAX 可爬取’页面,即使没有这个中间件。当 URL 不包含 '!#' 时,AjaxCrawlMiddleware 是必要的。这通常是‘索引’或‘主’网站页面的情况。

AjaxCrawlMiddleware 设置

AJAXCRAWL_ENABLED

默认值:False

是否启用AjaxCrawlMiddleware。您可能希望为broad crawls启用它。

HttpProxyMiddleware 设置

HTTPPROXY_ENABLED

默认值:True

是否启用HttpProxyMiddleware

HTTPPROXY_AUTH_ENCODING

默认值: "latin-1"

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