Skip to main content

下载中间件

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

激活下载中间件

要激活下载程序中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES 设置,这是一个dict,其中键是中间件类路径,它们的值是中间件顺序。

这里有一个例子:

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类,它定义了一个或多个以下方法:

class scrapy.downloadermiddlewares.DownloaderMiddleware

注解

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

process_request(request, spider)

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

process_request() 应该:返回 None,返回一个 Response 对象,返回一个 Request 对象,或者提高 IgnoreRequest

如果它返回 None,Scrapy将继续处理此请求,执行所有其他中间件,直到最后,适当的下载器处理程序被称为执行的请求(及其响应已下载)。

如果它返回一个 Response 对象,Scrapy不会打扰呼叫 any 其他 process_request()process_exception() 方法,或适当的下载功能;它会返回该响应。在每个响应上总是调用安装的中间件的 process_response() 方法。

如果它返回一个 Request 对象,Scrapy将停止调用process_request方法并重新计划返回的请求。一旦执行了新返回的请求,将在下载的响应上调用适当的中间件链。

如果它引发 IgnoreRequest 异常,将调用安装的下载中间件的 process_exception() 方法。如果它们都不处理异常,则调用请求(Request.errback)的errback函数。如果没有代码处理引发的异常,它将被忽略并且不被记录(与其他异常不同)。

参数:
  • request (Request object) – 正在处理的请求
  • spider (Spider object) – 该请求所针对的蜘蛛
process_response(request, response, spider)

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

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

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

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

参数:
  • request (is a Request object) – 发起响应的请求
  • response (Response object) – 正在处理的响应
  • spider (Spider object) – 这个响应所针对的蜘蛛
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 (is a Request object) – 生成异常的请求
  • exception (an Exception object) – 引发异常
  • spider (Spider object) – 该请求所针对的蜘蛛

内置下载器中间件参考

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

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

Cookie中间件

class scrapy.downloadermiddlewares.cookies.CookiesMiddleware

此中间件允许使用需要Cookie的网站,例如使用会话的网站。它跟踪Web服务器发送的Cookie,并在后续请求(来自该蜘蛛)时发送Cookie,就像Web浏览器那样。

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

COOKIES_ENABLED

默认值:True

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

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

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

下载时间中间件

class scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware

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

注解

您还可以使用 download_timeout Request.meta键设置下载超时每个请求;即使禁用了DownloadTimeoutMiddleware,也支持此功能。

HttpAuthMiddleware

class scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware

此中间件使用 Basic access authentication (也称为HTTP auth)验证从特定蜘蛛生成的所有请求。

要启用某些蜘蛛的HTTP身份验证,请设置这些蜘蛛的 http_userhttp_pass 属性。

例:

from scrapy.spiders import CrawlSpider

class SomeIntranetSiteSpider(CrawlSpider):

    http_user = 'someuser'
    http_pass = 'somepass'
    name = 'intranet.example.com'

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

HttpCache中间件

class scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware

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

Scrapy附带三个HTTP缓存存储后端:

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

Scrapy附带两种HTTP缓存策略:

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

您还可以避免在使用 dont_cache 元关键字等于 True 的每个策略上缓存响应。

虚拟策略(默认)

此策略没有任何HTTP缓存控制指令的意识。每个请求及其相应的响应都被缓存。当再次出现相同的请求时,返回响应而不从互联网传送任何内容。

Dummy策略对于更快地测试蜘蛛(无需每次都等待下载)和在没有Internet连接时脱机尝试蜘蛛非常有用。目标是能够“重放”蜘蛛跑 正如它跑了之前

要使用此策略,请设置:

RFC2616策略

此策略提供符合RFC2616标准的HTTP缓存,即HTTP缓存控制感知,旨在生产并在连续运行中使用,以避免下载未修改的数据(以节省带宽并加快爬网)。

什么实现:

  • 不要尝试使用 no-store 高速缓存控制指令集存储响应/请求

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

  • 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

什么不见了:

要使用此策略,请设置:

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

文件系统存储后端可用于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存储后端

0.13 新版功能.

DBM 存储后端也可用于HTTP高速缓存中间件。

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

要使用此存储后端,请设置:

LevelDB存储后端

0.23 新版功能.

LevelDB 存储后端也可用于HTTP高速缓存中间件。

不建议将此后端用于开发,因为只有一个进程可以同时访问LevelDB数据库,因此您无法对同一个蜘蛛并行运行爬网并打开scrapy shell。

要使用此存储后端:

HTTPCache中间件设置

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

HTTPCACHE_ENABLED

0.11 新版功能.

默认值:False

是否启用HTTP缓存。

在 0.11 版更改: 在0.11之前,HTTPCACHE_DIR 用于启用高速缓存。

HTTPCACHE_EXPIRATION_SECS

默认值:0

缓存请求的到期时间(以秒为单位)。

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

在 0.11 版更改: 在0.11之前,零意味着缓存请求总是过期。

HTTPCACHE_DIR

默认值:'httpcache'

用于存储(低级)HTTP缓存的目录。如果为空,则HTTP缓存将被禁用。如果给出相对路径,则取相对于项目数据dir。详情请参阅:Scrapy项目的默认结构

HTTPCACHE_IGNORE_HTTP_CODES

0.10 新版功能.

默认值:[]

不要使用这些HTTP代码缓存响应。

HTTPCACHE_IGNORE_MISSING

默认值:False

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

HTTPCACHE_IGNORE_SCHEMES

0.10 新版功能.

默认值:['file']

不要使用这些URI方案缓存响应。

HTTPCACHE_STORAGE

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

实现缓存存储后端的类。

HTTPCACHE_DBM_MODULE

0.13 新版功能.

默认值:'anydbm'

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

HTTPCACHE_POLICY

0.18 新版功能.

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

实现缓存策略的类。

HTTPCACHE_GZIP

1.0 新版功能.

默认值:False

如果启用,将使用gzip压缩所有缓存的数据。此设置特定于文件系统后端。

HTTPCACHE_ALWAYS_STORE

1.1 新版功能.

默认值:False

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

蜘蛛可能希望在缓存中具有所有响应,以便将来与 Cache-Control: max-stale 一起使用。 DummyPolicy缓存所有响应,但不会重新验证它们,有时需要一个更细微的策略。

此设置仍然遵守 Cache-Control: no-store 指令的响应。如果你不想要,从响应中的缓存控制头中过滤 no-store 到缓存中间件。

HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS

1.1 新版功能.

默认值:[]

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

网站通常设置“无存储”,“无高速缓存”,“必须重新验证”等,但是对于蜘蛛可以生成的流量,如果它尊重那些指令,会感到不安。这允许选择性地忽略已知对于正被爬网的站点不重要的高速缓存控制指令。

我们假设蜘蛛不会在请求中发出Cache-Control指令,除非它实际上需要它们,因此请求中的指令不会被过滤。

HttpCompression中间件

class scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware

此中间件允许从网站发送/接收压缩(gzip,deflate)流量。

HttpCompressionMiddleware设置

COMPRESSION_ENABLED

默认值:True

是否将启用Compression中间件。

HttpProxyMiddleware

0.8 新版功能.

class scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

此中间件通过为 Request 对象设置 proxy 元值来设置要用于请求的HTTP代理。

像Python标准库模块 urlliburllib2 一样,它遵循以下环境变量:

  • http_proxy

  • https_proxy

  • no_proxy

您还可以将元键 proxy 每个请求设置为类似于 http://some_proxy_server:port 的值。

重定向中间件

class scrapy.downloadermiddlewares.redirect.RedirectMiddleware

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

请求经过(当被重定向时)的URL可以在 redirect_urls Request.meta 密钥中找到。

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

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

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

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

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

Request.metahandle_httpstatus_list 密钥也可以用于指定在每个请求的基础上允许哪个响应代码。如果要允许请求的任何响应代码,您还可以将元键 handle_httpstatus_all 设置为 True

重定向中间件设置

REDIRECT_ENABLED

0.13 新版功能.

默认值:True

是否将启用重定向中间件。

REDIRECT_MAX_TIMES

默认值:20

单个请求将遵循的重定向的最大数量。

MetaRefreshMiddleware

class scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware

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

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

这个中间件服从 REDIRECT_MAX_TIMES 设置,dont_redirectredirect_urls 请求如 RedirectMiddleware 所述的元密钥

MetaRefreshMiddleware设置

METAREFRESH_ENABLED

0.17 新版功能.

默认值:True

是否将启用Meta Refresh中间件。

METAREFRESH_MAXDELAY

默认值:100

跟随重定向的最大元刷新延迟(以秒为单位)。有些网站使用meta-refresh重定向到会话过期页面,因此我们将自动重定向限制为最大延迟。

重试中间件

class scrapy.downloadermiddlewares.retry.RetryMiddleware

中间件重试可能由临时问题(如连接超时或HTTP 500错误)导致的失败请求。

失败的页面会在抓取过程中收集,并在蜘蛛结束抓取所有常规(非失败)页面后重新计划。一旦没有更多的失败页面重试,这个中间件发送一个信号(retry_complete),所以其他扩展可以连接到那个信号。

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

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

重试中间件设置

RETRY_ENABLED

0.13 新版功能.

默认值:True

是否将启用重试中间件。

RETRY_TIMES

默认值:2

除了首次下载之外,还要重试的最大次数。

RETRY_HTTP_CODES

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

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

在某些情况下,您可能需要向 RETRY_HTTP_CODES 添加400,因为它是用于指示服务器超载的常用代码。默认情况下不包括它,因为HTTP规范说。

机器人Txt中间件

class scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware

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

要确保Scrapy尊重robots.txt,请确保中间件已启用,并且 ROBOTSTXT_OBEY 设置已启用。

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

下载器状态

class scrapy.downloadermiddlewares.stats.DownloaderStats

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

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

UserAgentMiddleware

class scrapy.downloadermiddlewares.useragent.UserAgentMiddleware

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

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

AjaxCrawlMiddleware

class scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware

基于元碎片html标记查找“AJAX可抓取”页面变体的中间件。有关详细信息,请参阅 https://developers.google.com/webmasters/ajax-crawling/docs/getting-started

注解

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

AjaxCrawlMiddleware设置

AJAXCRAWL_ENABLED

0.21 新版功能.

默认值:False

是否将启用AjaxCrawlMiddleware。您可能需要为 宽阔的爬行 启用它。

HttpProxy中间件设置

H ROXY_AUTH_ENCODING

默认值:"latin-1"

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