Python3 Scrapy爬虫框架-Spider Middleware

  • 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对象的可迭代对象
原文地址:https://www.cnblogs.com/My-Sun-Shine/p/13568269.html