全部源码解析文章索引目录传送门
【Scrapy 框架】版本 2.4.0 源码篇:全部配置目录索引
内容介绍
Spider中间件是Scrapy的Spider处理机制的一个挂钩框架,您可以在其中插入自定义功能,以处理发送到Spider进行处理的响应以及处理从Spider生成的请求和项目。
激活蜘蛛中间件
要激活Spider中间件组件,请将其添加到 SPIDER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序。
SPIDER_MIDDLEWARES = {
'myproject.middlewares.CustomSpiderMiddleware': 543,
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}
全部中间件设置
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,
}
自定义Spider中间件
class scrapy.spidermiddlewares.SpiderMiddleware
process_spider_input(self, response, spider)
对于通过spider中间件并进入spider的每个响应,都会调用此方法进行处理。process_spider_input()应该返回None或提出异常。
- 如果它返回None,Scrapy将继续处理此响应,执行所有其他中间件,直到最后,响应被交给spider进行处理。
- 如果它引发异常,Scrapy将不会调用任何其他spider中间件的process_spider_input(),将调用请求errback(如果有的话),否则它将进入process_spider_exception()。
参数:
- response(Responseobject) - 正在处理的响应
- spider(Spiderobject) - 此响应所针对的spider
process_spider_output(self, response, result, spider)
在处理完响应之后,使用Spider返回的结果调用此方法。
process_spider_output()必须返回一个可迭代的 Request,dict或Item 对象。
参数:
- response(Responseobject) - 从spider生成此输出的响应
- result(可迭代的Request,dict或Item对象) - spider返回的结果
- spider(Spiderobject) - 正在处理其结果的spider
process_spider_exception(self, response, exception, spider)
当spider或process_spider_output() 方法(来自先前的spider中间件)引发异常时,将调用此方法。process_spider_exception()应该返回一个None或一个可迭代的Request,dict或 Item对象。
- 如果它返回None,Scrapy将继续处理此异常,执行process_spider_exception()以下中间件组件中的任何其他组件,直到没有剩余中间件组件并且异常到达引擎(它被记录并丢弃)。
- 如果它返回一个iterable,那么process_spider_output()管道将从下一个spider中间件开始启动,并且不会process_spider_exception()调用其他任何一个 。
参数:
- response(Responseobject) - 引发异常时正在处理的响应
- exception(异常对象) - 引发异常
- spider(Spiderobject) - 引发异常的spider
process_start_requests(self, start_requests, spider)
当spider运行到start_requests()的时候,爬虫中间件的process_start_requests()方法被调用,接收一个iterable(在start_requests参数中)并且必须返回另一个可迭代的Request对象。
参数:
- start_requests(可迭代Request) - 开始请求
- spider(Spiderobject) - 启动请求所属的spider
from_crawler(cls, crawler)
这个类方法通常是访问settings和signals的入口函数
spider中间件总结
-
spider开始start_requests()时,调用spider中间件的process_start_requests()。
-
response成功后,返回 spider 回调函数 parse,调用process_spider_input()。
-
当spider yield scrapy.Request()或者yield item 时,调用 spider 中间件的process_spider_output()方法。
-
当 spider 出现了 Exception 时,调用 spider 中间件的process_spider_exception() 方法。
内置Spider中间件参数参考
DepthMiddleware(深度中间件)
用于跟踪要抓取的站点内每个请求的深度。
class scrapy.spidermiddlewares.depth.DepthMiddleware
spider.py中的设置
request.meta['depth'] = 0
参数:
- DEPTH_LIMIT 任何网站将允许爬网的最大深度。如果为零,则不施加限制。
- DEPTH_STATS_VERBOSE 是否收集每个深度的请求数。
- DEPTH_PRIORITY -是否根据请求的深度确定请求的优先级。
HttpErrorMiddleware(错误响应中间件)
筛选不进行处理的不成功的(错误的)HTTP响应。
class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware
spider.py中的设置
class MySpider(CrawlSpider):
handle_httpstatus_list = [404]
参数:
HTTPERROR_ALLOWED_CODES = [] # 不处理的包含非200状态代码的所有响应。
HTTPERROR_ALLOW_ALL = False # 传递所有响应,无论其状态码如何,默认Fasle
OffsiteMiddleware(过滤作用域中间件)
过滤掉spider涵盖的域之外的URL请求。
classscrapy.spidermiddlewares.offsite.OffsiteMiddleware
spider.py中的设置
allowed_domains = ['http://xxxx.com'] # 只抓取该域名下内容
RefererMiddleware(请求来源中间件)
Referer根据生成请求的响应的URL填充请求标头。
class scrapy.spidermiddlewares.referer.RefererMiddleware
spider.py中的设置
REFERER_ENABLED = True # 是否启用引用中间件。
REFERRER_POLICY = "scrapy-default"
选项 | 使用的方法类 |
---|---|
“scrapy-default” (default) | scrapy.spidermiddlewares.referer.DefaultReferrerPolicy |
“no-referrer” | scrapy.spidermiddlewares.referer.NoReferrerPolicy |
“no-referrer-when-downgrade” | scrapy.spidermiddlewares.referer.NoReferrerWhenDowngradePolicy |
“same-origin” | scrapy.spidermiddlewares.referer.SameOriginPolicy |
“origin” | scrapy.spidermiddlewares.referer.OriginPolicy |
“strict-origin” | scrapy.spidermiddlewares.referer.StrictOriginPolicy |
“origin-when-cross-origin” | scrapy.spidermiddlewares.referer.OriginWhenCrossOriginPolicy |
“strict-origin-when-cross-origin” | scrapy.spidermiddlewares.referer.StrictOriginWhenCrossOriginPolicy |
“unsafe-url” | scrapy.spidermiddlewares.referer.UnsafeUrlPolicy |
UrlLength中间件
过滤出网址长度超过URLLENGTH_LIMIT的请求。
class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware
spider.py中的设置
URLLENGTH_LIMIT = 200 # 允许抓取的URL的最大URL长度。