- Spider Middleware:介于Scrapy的Spider处理机制的钩子框架
- 在Downloader生成的Response发送给Spider之前对Response进行处理
- 在Spider生成的Request发送给Schedule之前对Request进行处理
- 在Spider生成Item发送给Item Pipeline之前对Item进行处理
- Scrapy其实已经提供了许多Spider Middleware,它们被SPIDER_MIDDLEWARES_BASE这个变量所定义,自定义Spider Middleware首先加入到SPIDER_MIDDLEWARES设置中
1 SPIDER_MIDDLEWARES_BASE{ 2 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 3 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500, 4 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700, 5 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800, 6 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900, 7 }
- 核心方法
- process_spider_input(response, spider):当Response被Spider Middleware处理时,process_spider_input()方法被调用
- response:Response对象,即被处理的Response
- spider:Spider对象,即该Response对应的Spider
- 返回None:Scrapy将会继续处理该Response,调用所有其他的Spider Middleware,直到Spider处理该Response
- 抛出一个异常:Scrapy将不会调用任何其他Spider Middleware的process_spider_input()方法,而调用Request的errback()方法;errback的输出将会被重新输入到中间件中,使用process_spider_output()方法来处理,当其抛出异常时则调用process_spider_exception()来处理
- process_spider_output(response, result, spider):当Spider处理Response返回结果时,process_spider_output()被调用
- response:是Response对象,即生成该输出的Response
- result:包含Request或Item对象的可迭代对象,即Spider返回的结果
- spider:是Spider对象,即其结果对应的Spider
- 返回包含Request或Item对象的可迭代对象
- process_spider_exception(response, exception, spider):当Spider或Spider Middleware的process_spider_input()方法抛出异常时,process_spider_exception()方法被调用
- response:Response对象,即异常被抛出时被处理的Response
- exception:Exception对象,即被抛出的异常
- spider:Spider对象,即抛出该异常的Spider
- 返回None:Scrapy将继续处理该异常,调用其他Spider Middleware中的process_spider_exception()方法,直到所有Spider Middleware都被调用
- 返回一个可迭代对象:则其他Spider Middleware的process_spider_output()方法被调用,其他的process_spider_exception()不会被调用
- process_start_requests(start_requests, spider):该方法以Spider启动的Request为参数被调用,执行的过程类似于process_spider_output(),只不过它没有相关联的Response
- start_requests:包含Request的可迭代对象,即Start Requests
- spider:Spider对象,即Start Requests所属的Spider
- 必须返回另一个包含Request对象的可迭代对象