Scrapy:Scrapy 中 SPIDER_MIDDLEWARES 和 DOWNLOADER_MIDDLEWARES 的区别

1. 下载中间件的方法

  • process_request(request,spider): 所有请求都会调用此方法
  • process_response(request, response, spider): 这里的参数比上面的多了response,肯定是用来处理response的
  • process_exception(request, exception, spider):处理异常
  • from_crawler(cls, crawler):从settings.py获取配置

2. 蜘蛛中间件的方法

  • process_spider_input(response, spider):所有请求都会调用这个方法
  • process_spider_output(response, result, spider):spider解析完response之后调用该方法,result就是解析的结果(是一个可迭代对象),其中可能是items也可能是request对象
  • process_spider_exception(response, exception, spider):处理异常
  • process_start_requests(start_requests, spider):同process_spider_output,不过只处理spider中start_requests方法返回的结果
  • from_crawler(cls, crawler):从settings.py获取配置

3. 区别

  • 下载中间件是连通引擎和下载器的,所以如果修改请求只会影响下载器返回的结果,如果修改响应会影响 spider 处理;
  • 而 spider 中间件是连通引擎和 spider 的,如果修改请求则会影响整个 scrapy 的请求,因为scrapy的所有请求都来自于 spider,当然包括调度器和下载器,如果修改响应,则只会影响蜘蛛的解析,因为响应是由引擎传递给蜘蛛的。
scrapy_1.png

4. 使用

  • spider 中间件:
    -- 一般用于操作 spider 返回的request,比如记录深度、丢弃非200状态码响应、丢弃非指定域名请求等;
    -- 蜘蛛中间件一般不需要自己编写,使用内置的几个也足够了;
  • 下载中间件:
    -- 下载中间件用于操作向互联网发起请求的request和返回的response,比如修改请求头、修改响应、管理cookies、丢弃非200状态码响应、丢弃非指定域名请求等;

你可能感兴趣的:(Scrapy:Scrapy 中 SPIDER_MIDDLEWARES 和 DOWNLOADER_MIDDLEWARES 的区别)