在上一篇文章中详细的描述了爬虫框架Scrapy的工作流程,在其中我们会发现包含有两个中间件:
下载中间件处理的过程主要在调度器经engine发送request请求的时候以及网页将response结果返回给spiders的时候,所以-----下载中间件是介于scrapy的request/response处理的钩子,用于修改request和response.
下载中间件三大函数:
1、process_request(request,spider)
当每个request通过下载中间件时,该方法被调用:
返回None: Scrapy继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用,该request被执行;
返回response对象:Scrapy将不会调用任何其他的process_request或process_exception方法,或相应的下载函数,返回该response,已安装的中间件的process_response方法会在每个response返回时被调用;
返回request对象:Scrapy会停止调用process_request方法并重新调度返回的request,也就是把request重新返回,进入调度器;
返回raise IgnoreRequest异常:下载中间件的process_exc方法被调用,如果没有任何一个方法处理该异常,则request的errback(Request.errback)方法被调用;如果没有代码处理抛出的异常,则该异常被忽略且不记录.
2、process_response(request,response,spider)
当下载器完成http请求,传递response给engine时,该方法被调用:
返回一个response对象:该response会被在链中的其他中间件的process_response方法处理;
返回一个request对象:中间件链停止,返回的request会被重新调度下载.
抛出一个IgnoreRequest异常:调用request的errback(Request.errback).如果没有代码处理抛出的异常,则该异常被忽略且不记录.
3、process_exception(request,exception,spider)
当下载处理器(download handler)或process_request抛出异常时,Scrapy调用process_exception函数处理,但是不处理process_response返回的异常
返回None:Scrapy将会继续处理该异常,调用已安装的其他中间件的process_exception方法,直到所有中间件都调用完毕,则调用默认的异常处理;
返回一个Response对象:异常被纠正,已安装的中间件链的process_response方法则调用.Scrapy将不会调用任何其他中间件的process_exception方法;
返回一个request对象:返回的request对象会重新调用下载,将停止中间件的process_exception方法执行;
Spider中间件是在引擎及Spider的特定钩子,处理spider的输入(response)和输出(item及requests).
爬虫中间件函数:
1、process_spider_input(response,spider)
当response通过中间件时,该方法被调用,处理该response.
返回None:Scrapy会继续处理该response,调用所有其他的中间件直到spider处理该response;
抛出一个异常:Scrapy将不会调用任何其他中间件的process_spider_input方法,并调用request的errback.errback的输出将会以另一个方向被输入到中间链中,使用process_spide_output方法来处理,当其抛出异常时则带调用process_spider_exception。
2、process_spider_output(response,result,spider)
当Spider处理response返回result,该方法被调用.
该方法必须返回包含request或item对象的可迭代对象iterable.
3、process_spider_exception(response,exception,spider)
当spider或(其他spider中间件的)process_spider_input()抛出异常时,该方法被调用.
返回None:Scrapy将继续处理该异常,调用中间件链的其他中间件的process_spider_exception;
返回一个包含Response或item对象的可迭代对象(iterable):中间件;链的process_spider_output方法被调用,其他的process_spider_exception将不会被调用.
4.process_start_requests(start_requests,spider)
该方法以spider启动的request为参数被调用.
接受一个可迭代对象(start_request参数)且必须返回一个包含Request对象的可迭代对象