您的位置:  首页 » Python » 爬虫蜘蛛Scrapy内置蜘蛛中间件SPIDER_MIDDLEWARES的详细介绍(61)python Scrapy教程1.51以上版本

内置蜘蛛中间件参考

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

有关默认启用的组件列表(及其订单),请参阅 SPIDER_MIDDLEWARES_BASE设置。

DepthMiddleware 

scrapy.spidermiddlewares.depth.DepthMiddleware
DepthMiddleware用于跟踪被抓取站点内每个请求的深度。只要没有先前设置的值(通常只是第一个请求)并将其递增1,它就可以通过设置request.meta [‘depth’] = 0来工作。

它可用于限制刮擦的最大深度,根据深度控制请求优先级等。

DepthMiddleware可通过以下设置进行配置(详情参见设置文档):

  • DEPTH_LIMIT – 允许为任何站点爬网的最大深度。如果为零,则不会施加任何限制。
  • DEPTH_STATS – 是否收集深度统计数据。
  • DEPTH_PRIORITY – 是否根据深度确定请求的优先级。

HttpErrorMiddleware 

scrapy.spidermiddlewares.httperror.HttpErrorMiddleware
过滤掉不成功(错误)的HTTP响应,以便蜘蛛不必处理它们(大多数时候)会产生开销,消耗更多资源,并使蜘蛛逻辑更复杂。

根据HTTP标准,成功的响应是那些状态代码在200-300范围内的响应。

如果您仍希望处理该范围之外的响应代码,则可以使用handle_httpstatus_listspider属性或HTTPERROR_ALLOWED_CODES设置指定spider能够处理的响应代码 。

例如,如果您希望蜘蛛处理404响应,您可以执行以下操作:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]

所述handle_httpstatus_list的键Request.meta也可以被用于指定的响应代码,以允许在每个请求基础。您还可以设置meta键handle_httpstatus_all 来True,如果你想以允许请求的任何响应代码。

但请记住,处理非200响应通常是一个坏主意,除非你真的知道你在做什么。

有关更多信息,请参阅:HTTP状态代码定义

HttpErrorMiddleware设置

HTTPERROR_ALLOWED_CODES 

默认: []

传递包含在此列表中的非200状态代码的所有响应。

HTTPERROR_ALLOW_ALL 

默认: False

传递所有响应,无论其状态代码如何。

OffsiteMiddleware 

scrapy.spidermiddlewares.offsite.OffsiteMiddleware
过滤掉蜘蛛所涵盖域外的URL请求。

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

当您的蜘蛛返回不属于蜘蛛所涵盖的域的请求时,此中间件将记录类似于此的调试消息:

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

为避免在日志中填充太多噪音,它只会为每个过滤的新域打印其中一条消息。因此,例如,如果www.othersite.com过滤了另一个请求,则不会打印任何日志消息。但是,如果请求someothersite.com被过滤,则将打印一条消息(但仅针对第一个请求进行过滤)。

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

如果请求具有dont_filter设置的属性,则异地中间件将允许该请求,即使其域未在允许的域中列出。

RefererMiddleware 

scrapy.spidermiddlewares.referer.RefererMiddleware
Referer根据生成它的响应的URL 填充请求标头。

RefererMiddleware设置

REFERER_ENABLED 

0.15版本的新功能。

默认: True

是否启用referer中间件。

REFERRER_POLICY 

版本1.4中的新功能。

默认: 'scrapy.spidermiddlewares.referer.DefaultReferrerPolicy'

在填充请求“Referer”标头时应用的Referrer策略。

注意

您还可以使用特殊的"referrer_policy" Request.meta键为每个请求设置Referrer Policy ,其REFERRER_POLICY设置的可接受值相同。

REFERRER_POLICY的可接受值
  • 要么是scrapy.spidermiddlewares.referer.ReferrerPolicy 子类的路径- 自定义策略,要么是内置策略之一(参见下面的类),
  • 或者标准的W3C定义的字符串值之一,
  • 还是特别的"scrapy-default"
字符串值 类名(作为字符串)
"scrapy-default" (默认) scrapy.spidermiddlewares.referer.DefaultReferrerPolicy
“无引荐” scrapy.spidermiddlewares.referer.NoReferrerPolicy
“无引荐,当降级” scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy
“同源” scrapy.spidermiddlewares.referer.SameOriginPolicy
“起源” scrapy.spidermiddlewares.referer.OriginPolicy
“严格的原产地” scrapy.spidermiddlewares.referer.StrictOriginPolicy
“源 – 当交起源” scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy
“严格的原产地,当交起源” scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy
“不安全的URL” scrapy.spidermiddlewares.referer.UnsafeUrlPolicy
scrapy.spidermiddlewares.referer.DefaultReferrerPolicy
“no-referrer-when-downgrade”的变体,如果父请求正在使用file://或者s3://计划,则不会发送“Referer” 。

警告

Scrapy的默认引荐策略 – 就像“no-referrer-when-downgrade”,W3C推荐的浏览器值 – 将从http(s)://任何https://URL 向任何URL 发送非空的“Referer”头,即使域不同。

如果要删除跨域请求的引用者信息,“同源”可能是更好的选择。

scrapy.spidermiddlewares.referer.NoReferrerPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-no-referrer

最简单的策略是“no-referrer”,它指定不将引用者信息与从特定请求客户端发出的请求一起发送到任何源。标题将完全省略。

scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-no-referrer-when-downgrade

“no-referrer-when-downgrade”策略将完整URL以及来自受TLS保护的环境设置对象的请求发送到可能值得信赖的URL,以及来自未受TLS保护的客户端的请求。

另一方面,从受TLS保护的客户端到非潜在可信赖URL的请求将不包含引用者信息。不会发送Referer HTTP标头。

如果未指定任何策略,则这是用户代理的默认行为。

注意

“no-referrer-when-downgrade”策略是W3C推荐的默认值,并由主要Web浏览器使用。

但是,它不是Scrapy的默认引荐策略(请参阅参考资料DefaultReferrerPolicy)。

scrapy.spidermiddlewares.referer.SameOriginPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-same-origin

“同源”策略指定在从特定请求客户端发出同源请求时,将作为引用者剥离的完整URL作为引用者信息发送。

另一方面,跨源请求不包含引用者信息。不会发送Referer HTTP标头。

scrapy.spidermiddlewares.referer.OriginPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-origin

“origin”策略指定在发出来自特定请求客户端的同源请求和跨源请求时,仅将请求客户端的源的ASCII序列化作为引用者信息发送。

scrapy.spidermiddlewares.referer.StrictOriginPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-strict-origin

“严格来源”策略在发出请求时发送请求客户端源的ASCII序列化: – 从受TLS保护的环境设置对象到可能值得信赖的URL,以及 – 从非TLS保护的环境设置对象到任何起源。

另一方面,来自受TLS保护的请求客户端对不可信赖的URL的请求将不包含引用者信息。不会发送Referer HTTP标头。

scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-origin-when-cross-origin

“origin-when-cross-origin”策略指定在从特定请求客户端发出同源请求时,将作为引用者剥离的完整URL作为引用者信息发送,并且仅对源的ASCII序列化发送当从特定请求客户端发出跨源请求时,请求客户端作为引用者信息被发送。

scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-strict-origin-when-cross-origin

“strict-origin-when-cross-origin”策略指定在从特定请求客户端发出同源请求时,将作为引用者剥离的完整URL作为引用者信息发送,并且只有ASCII序列化进行跨源请求时请求客户端的来源:

  • 从受TLS保护的环境设置对象到可能值得信赖的URL,以及
  • 从非TLS保护的环境设置对象到任何来源。

另一方面,来自受TLS保护的客户端对不可信赖的URL的请求将不包含引用者信息。不会发送Referer HTTP标头。

scrapy.spidermiddlewares.referer.UnsafeUrlPolicy
https://www.w3.org/TR/referrer-policy/#referrer-policy-unsafe-url

“unsafe-url”策略指定剥离用作引用者的完整URL以及来自特定请求客户端的跨源请求和同源请求。

注意:政策名称不是谎言; 这是不安全的。此政策将泄露从受TLS保护的资源到不安全来源的起源和路径。仔细考虑为可能敏感的文档设置此类策略的影响。

警告

不建议使用“unsafe-url”政策。

UrlLengthMiddleware 

scrapy.spidermiddlewares.urllength.UrlLengthMiddleware
使用长于URLLENGTH_LIMIT的网址过滤掉请求

UrlLengthMiddleware可通过以下设置进行配置(详情参见设置文档):

  • URLLENGTH_LIMIT – 允许抓取的URL的最大URL长度。