爬虫框架 Scrapy入门基础之Spider Middleware

Spider Middleware 是 Scrapy 的 Spider 处理机制的一个钩子框架,我们可以在其中插入自定义功能,以处理发送到 Spider 进行处理的响应以及处理 Spider 生成的请求和项目。

内置爬虫中间件

和前文介绍过的 Downloader Middleware 一样, Scrapy 同样为我们内置了一部分的 Spider Middleware ,这些内置的 Spider Middleware 被保存在变量 SPIDER_MIDDLEWARES_BASE 中,具体如下:

{
    'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,
    'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,
    'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,
    'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,
}

同样和 Downloader Middleware 一样的是, Spider Middleware 会被加入到 SPIDER_MIDDLEWARES 的设置中,该设置会和 Scrapy 中定义的 SPIDER_MIDDLEWARES_BASE 合并,根据数值的大小进行优先级排序,第一个 Middleware 是靠近引擎的,最后一个 Middleware 是靠近 Spider 的。

自定义爬虫中间件

Scrapy 内置的 Spider Middleware 只提供了一些基础的功能,我们如果需要扩展其功能,实现一个自定义的爬虫中间件,只需要实现以下某几个方法即可。

核心方法如下:

processspiderinput(response, spider)
processspideroutput(response, result, spider)
processspiderexception(response, exception, spider)
processstartrequests(start_requests, spider)

只需要实现其中一个方法就可以定义一个爬虫中间件。

processspiderinput(response, spider)

参数:

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

spider (spider 对象)–此响应预期用于的蜘蛛

对于通过 Spider Middleware 并进入 Spider 进行处理的每个响应,都会调用此方法。

processspiderinput() )应该返回 None 或引发异常。

如果返回 None ,则 Scrapy 将继续处理此响应,并执行所有其他中间件,直到最终将响应交给蜘蛛进行处理。

如果引发异常, Scrapy 不会费心调用任何其他蜘蛛中间件 processspiderinput() ,并且会在存在错误时调用请求 errback ,否则它将启动 processspiderexception() 链。 errback 的输出在另一个方向上链回,以供 processspideroutput() 处理,或者如果引发异常,则链接到 processspiderexception() 。

processspideroutput(response, result, spider)

参数:

response ( response 对象)–从蜘蛛生成此输出的响应

result (可迭代的 Request , dict 或 Item 对象)– spider 返回的结果

spider ( spider 对象)–正在处理其结果的蜘蛛

处理完响应后,将使用 Spider 从返回的结果中调用此方法。

processspideroutput() 必须返回 Request , dict 或 Item 对象的可迭代对象。

processspiderexception(response, exception, spider)

参数:

response ( response  对象)–引发异常时正在处理的响应

exception (Exception对象)–引发的异常

spider ( spider 对象)–引发异常的蜘蛛

当 Spider 或 processspideroutput() 方法(来自先前的 Spider 中间件)引发异常时,将调用此方法。

processspiderexception() 应该返回 None 或可迭代的 Request , dict 或 Item 对象。

如果返回 None ,则 Scrapy 将继续处理此异常,并在以下中间件组件中执行任何其他 processspiderexception() ,直到没有剩余中间件组件且异常到达引擎为止(记录并丢弃该异常)。

如果返回可迭代,则从下一个蜘蛛中间件开始, processspideroutput() 管道将启动,并且不会调用其他 processspiderexception() 。

processstartrequests(start_requests, spider)

参数:

start_requests (可迭代的 Request )–启动请求

spider ( spider 对象)–启动请求所属的蜘蛛

此方法是由 Spider 的启动请求调用的,其工作原理与 processspideroutput() 方法类似,不同之处在于它没有关联的响应,并且仅返回请求(不返回项目)。

它接收一个可迭代的(在 start_requests 参数中),并且必须返回另一个可迭代的 Request 对象。

在实际使用过程中, Spider Middleware 的使用率并不如 Downloader Middleware 高,小编这里就不做示例了,在一些必要的情况下, Spider Middleware 可以用作一些数据处理。

来源:PY学习网:原文地址:https://www.py.cn/article.html