|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Stubborn 于 2020-1-7 16:42 编辑
middlewares(爬虫中间件介绍)
如果你有阅读前面一篇,下载中间件,这个理解起来就不是很难。爬虫中间件的用法与下载器中间件非常相似,只是它们的作用对象不同。下载器中间件的作用对象是请求request和返回response;爬虫中间件的作用对象是爬虫,更具体地来说,就是写在spiders文件夹下面的各个文件。
爬虫中间件SpiderMiddleware(上图6,7号标记处为下载中间件)
Spider官网,对齐爬虫中间键,解释如下:
Spider中间件是介入到Scrapy的spider处理机制的钩子框架,您可以添加代码来处理发送给 Spiders 的response及spider产生的item和request。
爬虫中间键位于爬虫文件和Scrrapy引擎中间,所以它能处理的是一些,爬虫文件上面的问题,比如爬虫文件没有写完善,出现的Error,你有不能一直盯着电脑,又希望知道是那个url引起的报错 ,就可以用它处理。
同样的,爬虫中间件,有如下几个函数,被Scrapy管理:
- def process_spider_input(self, response, spider):
参数介绍:
- response (Response 对象) – 被处理的response
- spider (Spider 对象) – 该response对应的spider
注意事项:
- 当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() 。
- def process_spider_output(self, response, result, spider):
参数介绍:
- response (Response 对象) – 生成该输出的response
- result (包含 Request 或 Item 对象的可迭代对象(iterable)) – spider返回的result
- spider (Spider 对象) – 其结果被处理的spider
注意事项:
- 当Spider处理response返回result时,该方法被调用。
- process_spider_output() 必须返回包含 Request 或 Item 对象的可迭代对象(iterable)
- def process_spider_exception(self, response, exception, spider):
参数介绍:
- response (Response 对象) – 异常被抛出时被处理的response
- exception (Exception 对象) – 被跑出的异常
- spider (Spider 对象) – 抛出该异常的spider
注意事项:
- 当spider或(其他spider中间件的) process_spider_input() 跑出异常时, 该方法被调用。
- process_spider_exception() 必须要么返回 None , 要么返回一个包含 Response 或 Item 对象的可迭代对象(iterable)。
- 如果其返回 None ,Scrapy将继续处理该异常,调用中间件链中的其他中间件的 process_spider_exception() 方法,直到所有中间件都被调用,该异常到达引擎(异常将被记录并被忽略)。
- 如果其返回一个可迭代对象,则中间件链的 process_spider_output() 方法被调用, 其他的 process_spider_exception() 将不会被调用。
- def process_start_requests(self, start_requests, spider):
参数介绍:
- start_requests (包含 Request 的可迭代对象) – start requests
- spider (Spider 对象) – start requests所属的spider
注意事项:
- 该方法以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记数)。
总结下爬虫中间件在什么时候会被触发,或者调用。
- 当运行到yield scrapy.Request()或者yield item的时候,爬虫中间件的process_spider_output()方法被调用。
- 当爬虫本身的代码出现了Exception的时候,爬虫中间件的process_spider_exception()方法被调用。
- 当爬虫里面的某一个回调函数parse_xxx()被调用之前,爬虫中间件的process_spider_input()方法被调用。
- 当运行到start_requests()的时候,爬虫中间件的process_start_requests()方法被调用。
下面是一个示例Demo(假如,你的爬虫文件产生错误,比如Xpath到空数据,出现IndexError, 或者请求异常,status不是200):
|
|