蜘蛛中间件
蜘蛛中间件是一个挂钩到Scrapy的蜘蛛处理机制的框架,您可以在其中插入自定义功能,以处理发送到Spiders进行处理和处理从蜘蛛生成的请求和项目的响应。
激活蜘蛛中间件
要激活蜘蛛中间件组件,请将其添加到SPIDER_MIDDLEWARES设置中,该设置是一个dict,其密钥是中间件类路径,其值是中间件订单。
这里有一个例子:
SPIDER_MIDDLEWARES = {
'myproject.middlewares.CustomSpiderMiddleware':543,
}
SPIDER_MIDDLEWARES设置与Scrapy中定义的SPIDER_MIDDLEWARES_BASE设置合并(并不意味着被覆盖),然后按顺序排序以获得启用的中间件的最终排序列表:第一个中间件是靠近引擎的最后一个中间件一个更接近蜘蛛。换句话说,每个中间件的process_spider_input()方法将以增加的中间件顺序(100,200,300,...)被调用,并且每个中间件的process_spider_output()方法将以递减的顺序被调用。
要确定分配给您的中间件的顺序,请参阅SPIDER_MIDDLEWARES_BASE设置,并根据您要插入中间件的位置选择一个值。该顺序是重要的,因为每个中间件都执行不同的操作,并且您的中间件可能依赖于一些先前(或后续的)中间件被应用。
如果要禁用内置中间件(SPIDER_MIDDLEWARES_BASE中定义的中间件,并且默认启用),则必须在项目SPIDER_MIDDLEWARES设置中定义它,并将“无”作为其值。例如,如果要禁用站外中间件:
SPIDER_MIDDLEWARES = {
'myproject.middlewares.CustomSpiderMiddleware':543,
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware':无,
}
最后,请记住,一些中间件可能需要通过特定设置启用。有关更多信息,请参阅每个中间件文档。
编写自己的蜘蛛中间件
每个中间件组件都是一个Python类,它定义了一个或多个以下方法:
类scrapy.spidermiddlewares.SpiderMiddleware
process_spider_input(响应,蜘蛛)
对于通过蜘蛛中间件并进入蜘蛛的每个响应,都会调用此方法进行处理。
process_spider_input()应该返回None或引发异常。
如果返回None,Scrapy将继续处理此响应,执行所有其他中间件,直到最后将响应提交给蜘蛛进行处理。
如果引发异常,Scrapy不会打扰任何其他蜘蛛中间件process_spider_input()并调用请求errback。如果process_spider_output()处理它,或者process_spider_exception())引发异常,那么将errback的输出向另一个方向链接。
参数:
响应(响应对象) - 正在处理的响应
蜘蛛(Spider对象) - 这个响应是打算的蜘蛛
process_spider_output(响应,结果,蜘蛛)
在处理响应后,将从Spider返回的结果调用此方法。
process_spider_output()必须返回一个可迭代的Request,dict或Item对象。
参数:
响应(响应对象) - 从蜘蛛生成此输出的响应
结果(Request,dict或Item对象的迭代) - 蜘蛛返回的结果
蜘蛛(Spider对象) - 正在处理结果的蜘蛛
process_spider_exception(响应,异常,蜘蛛)
当蜘蛛或process_spider_input()方法(来自其他蜘蛛中间件)引发异常时,将调用此方法。
process_spider_exception()应该返回None或Response,dict或Item对象的可迭代。
如果它返回None,Scrapy将继续处理此异常,在以下中间件组件中执行任何其他process_spider_exception(),直到没有中间件组件被遗留,异常到达引擎(在哪里被记录和丢弃)。
如果它返回一个可迭代的process_spider_output()管道,并且没有其他process_spider_exception()将被调用。
参数:
response(响应对象) - 异常引发时正在处理的响应
异常(异常对象) - 引发异常
蜘蛛(Spider对象) - 引起异常的蜘蛛
process_start_requests(start_requests,spider)
新版本0.15。
该方法与蜘蛛的起始请求一起调用,并且与process_spider_output()方法类似,但它没有关联的响应,并且只返回请求(而不是项)。
它接收一个可迭代的(在start_requests参数中),并且必须返回另一个可迭代的Request对象。
注意
当您在蜘蛛中间件中实现此方法时,您应该总是返回一个可迭代的(跟随输入的方法),而不是使用所有的start_requests迭代器,因为它可能非常大(甚至是无限制),并导致内存溢出。 Scrapy引擎被设计为在处理它们的时候拉动启动请求,所以启动请求迭代器可以在有其他一些停止蜘蛛的条件(如时间限制或项目/页面计数)的情况下是无限的。
参数:
start_requests(Request的可迭代) - 启动请求
蜘蛛(Spider对象) - 启动请求所属的蜘蛛
内置蜘蛛中间件参考
此页面描述了Scrapy附带的所有蜘蛛中间件组件。有关如何使用它们以及如何编写自己的蜘蛛中间件的信息,请参阅“蜘蛛中间件使用指南”。
有关默认启用的组件(及其顺序)的列表,请参阅SPIDER_MIDDLEWARES_BASE设置。
DepthMiddleware
class scrapy.spidermiddlewares.depth.DepthMiddleware
DepthMiddleware是一个刮擦中间件,用于跟踪被刮除的站点内每个请求的深度。它可以用来限制最大的深度刮擦或类似的东西。
深度中间件可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
DEPTH_LIMIT - 允许任何站点爬网的最大深度。如果为零,则不受限制。
DEPTH_STATS - 是否收集深度统计信息。
DEPTH_PRIORITY - 是否根据其深度对请求进行优先级排序。
HttpErrorMiddleware
class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware
过滤出不成功(错误的)HTTP响应,以便蜘蛛不需要处理它们(大部分时间)施加开销,消耗更多的资源,并使蜘蛛逻辑更加复杂。
根据HTTP标准,成功的响应是状态码在200-300范围内的响应。
如果您仍然希望在该范围之外处理响应代码,则可以使用handle_httpstatus_list spider属性或HTTPERROR_ALLOWED_CODES设置指定蜘蛛能够处理的响应代码。
例如,如果你希望你的蜘蛛处理404的回复你可以这样做:
MySpider类(CrawlSpider):
handle\_httpstatus\_list = \[404\]
Request.meta的handle_httpstatus_list键也可用于指定每个请求允许的响应代码。如果要允许请求的任何响应代码,还可以将元键handle_httpstatus_all设置为True。
不过请记住,除非你真的知道你在做什么,否则处理非200条答复通常是一个坏主意。
有关详细信息,请参阅:HTTP状态代码定义。
HttpErrorMiddleware设置
HTTPERROR_ALLOWED_CODES
默认值:[]
通过包含在此列表中的非200状态代码传递所有响应。
HTTPERROR_ALLOW_ALL
默认值:False
通过所有响应,无论其状态代码如何。
OffsiteMiddleware
课堂scrapy.spidermiddlewares.offsite.OffsiteMiddleware
过滤掉蜘蛛覆盖的域之外的URL的请求。
该中间件过滤每个请求,其主机名不在蜘蛛的allowed_domains属性中。列表中任何域的所有子域也是允许的。例如。规则www.example.org也将允许bob.www.example.org而不是www2.example.com或example.com。
当您的蜘蛛返回对不属于蜘蛛覆盖范围的域的请求时,此中间件将记录类似于以下内容的调试消息:
调试:对“www.othersite.com”进行过滤的异地请求:<GET http://www.othersite.com/some/page.html>
为了避免用太多的噪音填写日志,只会对每个新的域进行过滤的打印其中一个消息。因此,例如,如果对www.othersite.com的另一个请求进行过滤,则不会打印日志消息。但是如果对someothersite.com的请求进行过滤,则会打印一条消息(但仅对第一个请求进行过滤)。
如果蜘蛛没有定义一个allowed_domains属性,或该属性为空,则异地中间件将允许所有请求。
如果请求中设置了dont_filter属性,那么异地中间件将允许该请求,即使其域未列在允许的域中。
RefererMiddleware
class scrapy.spidermiddlewares.referer.RefererMiddleware
根据生成它的响应的URL填充请求请求者标题。
RefererMiddleware设置
REFERER_ENABLED
新版本0.15。
默认值:True
是否启用引用中间件。
REFERRER_POLICY
版本1.4中的新功能。
默认值:'scrapy.spidermiddlewares.referer.DefaultReferrerPolicy'
引用者策略在填写请求“引用者”标题时应用。
注意
您也可以使用特殊的“referrer_policy”Request.meta键设置引用者策略,具有与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
class scrapy.spidermiddlewares.referer.DefaultReferrerPolicy
“no-referrer-when-downgrade”的变体,如果父请求使用file://或s3:// scheme,则不会发送“Referer”。
警告
Scrapy的默认引荐来源策略 - 就像“no-referrer-when-downgrade”一样,W3C推荐的浏览器值 - 将从任何http://发送一个非空的“Referer”头到任何https://网址,即使域名不同。
如果要删除跨域请求的引荐来源网址信息,“同源”可能是一个更好的选择。
class scrapy.spidermiddlewares.referer.NoReferrerPolicy
https://www.w3.org/TR/referrer-policy/\#referrer-policy-no-referrer
最简单的策略是“no-referrer”,它指定不会将引用者信息与特定请求客户端发出的请求一起发送到任何来源。标题将被完全省略。
class 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的请求将不包含引用信息。引用者HTTP头不会发送。
这是用户代理的默认行为,如果没有指定策略。
注意
“no-referrer-when-downgrade”策略是W3C推荐的默认值,并被主要的网络浏览器使用。
但是,它不是Scrapy的默认引荐来源策略(请参阅DefaultReferrerPolicy)。
class scrapy.spidermiddlewares.referer.SameOriginPolicy
https://www.w3.org/TR/referrer-policy/\#referrer-policy-same-origin
“同源”策略规定,在从特定请求客户端进行相同来源请求时,将完整的URL剥离为用作引荐来源的URL作为引用者信息发送。
另一方面,跨原始请求将不包含引荐来源信息。引用者HTTP头不会发送。
class scrapy.spidermiddlewares.referer.OriginPolicy
https://www.w3.org/TR/referrer-policy/\#referrer-policy-origin
“origin”策略规定,当进行来自特定请求客户端的同源请求和跨原始请求时,只有请求客户端的ASCII序列化作为引用者信息发送。
class scrapy.spidermiddlewares.referer.StrictOriginPolicy
https://www.w3.org/TR/referrer-policy/\#referrer-policy-strict-origin
“严格起源”策略在请求时发送请求客户端的ASCII序列化: - 从TLS保护的环境设置对象到潜在可信赖的URL,以及 - 从非TLS保护的环境设置对象到任何起源。
另一方面,从TLS受保护的请求客户端到非潜在可信赖的URL的请求将不包含引荐来源网址信息。引用者HTTP头不会发送。
课堂上的琐事。Spidermiddlewares.referer.OriginWhenCrossOriginPolicy
https://www.w3.org/TR/referrer-policy/\#referrer-policy-origin-when-cross-origin
“起源于跨原产地”政策规定,在从特定请求客户端进行相同来源请求时,将完整的URL剥离为用作引荐来源的客户端,作为引用来源信息发送,只有ASCII序列化当从特定请求客户端进行跨原始请求时,请求客户端作为引用者信息发送。
class 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的请求将不包含引荐来源网址信息。引用者HTTP头不会发送。
class scrapy.spidermiddlewares.referer.UnsafeUrlPolicy
https://www.w3.org/TR/referrer-policy/\#referrer-policy-unsafe-url
“unsafe-url”策略规定,一个完整的URL被剥离用作引荐来源,同时发送来自特定请求客户端的跨原始请求和同源请求。
注意:政策的名称不在于;这是不安全的。此政策将泄漏从TLS保护资源到不安全来源的起源和路径。仔细考虑为潜在敏感文件制定此类政策的影响。
警告
不建议使用“不安全网址”政策。
UrlLengthMiddleware
class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware
过滤出URL超过URLLENGTH_LIMIT的URL的请求
UrlLengthMiddleware可以通过以下设置进行配置(有关详细信息,请参阅设置文档):
URLLENGTH_LIMIT - 允许抓取网址的最大网址长度。