Spider中间件是介入到Scrapy的spider处理机制的钩子框架,您能够添加代码来处理发送给 Spiders的response及spider产生的item和request。html
要启用spider中间件,您能够将其加入到 SPIDER_MIDDLEWARES
设置中。 该设置是一个字典,键位中间件的路径,值为中间件的顺序(order)。框架
样例:dom
SPIDER_MIDDLEWARES = { 'myproject.middlewares.CustomSpiderMiddleware': 543, }
SPIDER_MIDDLEWARES
设置会与Scrapy定义的 SPIDER_MIDDLEWARES_BASE
设置合并(但不是覆盖), 然后根据顺序(order)进行排序,最后获得启用中间件的有序列表: 第一个中间件是最靠近引擎的,最后一个中间件是最靠近spider的。scrapy
关于如何分配中间件的顺序请查看 SPIDER_MIDDLEWARES_BASE
设置,然后根据您想要放置中间件的位置选择一个值。 因为每一个中间件执行不一样的动做,您的中间件可能会依赖于以前(或者以后)执行的中间件,所以顺序是很重要的。ide
若是您想禁止内置的(在 SPIDER_MIDDLEWARES_BASE
中设置并默认启用的)中间件, 您必须在项目的 SPIDER_MIDDLEWARES
设置中定义该中间件,并将其值赋为 None 。 例如,若是您想要关闭off-site中间件:网站
SPIDER_MIDDLEWARES = { 'myproject.middlewares.CustomSpiderMiddleware': 543, 'scrapy.contrib.spidermiddleware.offsite.OffsiteMiddleware': None, }
最后,请注意,有些中间件须要经过特定的设置来启用。更多内容请查看相关中间件文档。url
编写spider中间件十分简单。每一个中间件组件是一个定义了如下一个或多个方法的Python类:spa
classscrapy.contrib.spidermiddleware.
SpiderMiddleware
code
process_spider_input
(response, spider)htm
当response经过spider中间件时,该方法被调用,处理该response。
process_spider_input()
应该返回 None
或者抛出一个异常。
若是其返回 None
,Scrapy将会继续处理该response,调用全部其余的中间件直到spider处理该response。
若是其跑出一个异常(exception),Scrapy将不会调用任何其余中间件的process_spider_input()
方法,并调用request的errback。 errback的输出将会以另外一个方向被从新输入到中间件链中,使用 process_spider_output()
方法来处理,当其抛出异常时则带调用 process_spider_exception()
。
参数: |
|
---|
process_spider_output
(response, result, spider)
当Spider处理response返回result时,该方法被调用。
process_spider_output()
必须返回包含 Request
或 Item
对象的可迭代对象(iterable)。
参数: |
|
---|
process_spider_exception
(response, exception, spider)
当spider或(其余spider中间件的) process_spider_input()
跑出异常时, 该方法被调用。
process_spider_exception()
必需要么返回 None
, 要么返回一个包含 Response
或 Item
对象的可迭代对象(iterable)。
若是其返回 None
,Scrapy将继续处理该异常,调用中间件链中的其余中间件的process_spider_exception()
方法,直到全部中间件都被调用,该异常到达引擎(异常将被记录并被忽略)。
若是其返回一个可迭代对象,则中间件链的 process_spider_output()
方法被调用, 其余的 process_spider_exception()
将不会被调用。
参数: |
|
---|
process_start_requests
(start_requests, spider)
0.15 新版功能.
该方法以spider 启动的request为参数被调用,执行的过程相似于 process_spider_output()
,只不过其没有相关联的response而且必须返回request(不是item)。
其接受一个可迭代的对象(start_requests
参数)且必须返回另外一个包含 Request
对象的可迭代对象。
注解
当在您的spider中间件实现该方法时, 您必须返回一个可迭代对象(相似于参数start_requests)且不要遍历全部的 start_requests
。 该迭代器会很大(甚至是无限),进而致使内存溢出。 Scrapy引擎在其具备能力处理start request时将会拉起request, 所以start request迭代器会变得无限,而由其余参数来中止spider( 例如时间限制或者item/page记数)。
参数: |
|
---|
本页面介绍了Scrapy自带的全部spider中间件。
关于默认启用的中间件列表(及其顺序)请参考 SPIDER_MIDDLEWARES_BASE
设置。
classscrapy.contrib.spidermiddleware.depth.
DepthMiddleware
DepthMiddleware是一个用于追踪每一个Request在被爬取的网站的深度的中间件。 其能够用来限制爬取深度的最大深度或相似的事情。
DepthMiddleware
能够经过下列设置进行配置(更多内容请参考设置文档):
DEPTH_LIMIT
- 爬取所容许的最大深度,若是为0,则没有限制。DEPTH_STATS
- 是否收集爬取状态。DEPTH_PRIORITY
- 是否根据其深度对requet安排优先级
classscrapy.contrib.spidermiddleware.httperror.
HttpErrorMiddleware
过滤出全部失败(错误)的HTTP response,所以spider不须要处理这些request。 处理这些request意味着消耗更多资源,而且使得spider逻辑更为复杂。
根据 HTTP标准 ,返回值为200-300之间的值为成功的resonse。
若是您想处理在这个范围以外的response,您能够经过 spider的 handle_httpstatus_list
属性或HTTPERROR_ALLOWED_CODES
设置来指定spider能处理的response返回值。
例如,若是您想要处理返回值为404的response您能够这么作:
class MySpider(CrawlSpider): handle_httpstatus_list = [404]
Request.meta
中的 handle_httpstatus_list
键也能够用来指定每一个request所容许的response code。
不过请记住,除非您知道您在作什么,不然处理非200返回通常来讲是个糟糕的决定。
HTTPERROR_ALLOWED_CODES
默认: []
忽略该列表中全部非200状态码的response。
HTTPERROR_ALLOW_ALL
默认: False
忽略全部response,无论其状态值。
classscrapy.contrib.spidermiddleware.offsite.
OffsiteMiddleware
过滤出全部URL不禁该spider负责的Request。
该中间件过滤出全部主机名不在spider属性 allowed_domains
的request。
当spide返回一个主机名不属于该spider的request时, 该中间件将会作一个相似于下面的记录:
DEBUG: Filtered offsite request to 'www.othersite.com': <GET http://www.othersite.com/some/page.html>
为了不记录太多无用信息,其将对每一个新发现的网站记录一次。所以,例如, 若是过滤出另外一个 www.othersite.com
请求,将不会有新的记录。 但若是过滤出 someothersite.com
请求,仍然会有记录信息(仅针对第一次)。
若是spider没有定义 allowed_domains
属性,或该属性为空, 则offsite 中间件将会容许全部request。
若是request设置了 dont_filter
属性, 即便该request的网站不在容许列表里,则offsite中间件将会容许该request。
classscrapy.contrib.spidermiddleware.referer.
RefererMiddleware
根据生成Request的Response的URL来设置Request Referer
字段。
REFERER_ENABLED
0.15 新版功能.
默认: True
是否启用referer中间件。
classscrapy.contrib.spidermiddleware.urllength.
UrlLengthMiddleware
过滤出URL长度比URLLENGTH_LIMIT的request。
UrlLengthMiddleware
能够经过下列设置进行配置(更多内容请参考设置文档):
URLLENGTH_LIMIT
- 容许爬取URL最长的长度.