版本号:Scrapy 2.4
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,
}
class scrapy.spidermiddlewares.SpiderMiddleware
对于通过spider中间件并进入spider的每个响应,都会调用此方法进行处理。process_spider_input()应该返回None或提出异常。
参数:
在处理完响应之后,使用Spider返回的结果调用此方法。
process_spider_output()必须返回一个可迭代的 Request,dict或Item 对象。
参数:
当spider或process_spider_output() 方法(来自先前的spider中间件)引发异常时,将调用此方法。process_spider_exception()应该返回一个None或一个可迭代的Request,dict或 Item对象。
参数:
当spider运行到start_requests()的时候,爬虫中间件的process_start_requests()方法被调用,接收一个iterable(在start_requests参数中)并且必须返回另一个可迭代的Request对象。
参数:
这个类方法通常是访问settings和signals的入口函数
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() 方法。
用于跟踪要抓取的站点内每个请求的深度。
class scrapy.spidermiddlewares.depth.DepthMiddleware
spider.py中的设置
request.meta['depth'] = 0
参数:
筛选不进行处理的不成功的(错误的)HTTP响应。
class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware
spider.py中的设置
class MySpider(CrawlSpider):
handle_httpstatus_list = [404]
参数:
HTTPERROR_ALLOWED_CODES = [] # 不处理的包含非200状态代码的所有响应。
HTTPERROR_ALLOW_ALL = False # 传递所有响应,无论其状态码如何,默认Fasle
过滤掉spider涵盖的域之外的URL请求。
classscrapy.spidermiddlewares.offsite.OffsiteMiddleware
spider.py中的设置
allowed_domains = ['http://xxxx.com'] # 只抓取该域名下内容
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_LIMIT的请求。
class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware
spider.py中的设置
URLLENGTH_LIMIT = 200 # 允许抓取的URL的最大URL长度。