对于下载中间件

settings里的数字大小:

  • process_request的顺序 数字越小,越先调用
  • process_response 的顺序, 数字越大,越先调用
返回值:
process_request: 【None :继续调用下一个中间件的process_request方法;】
         【Response object:预示着下载已经完成,就以返回的response作为下载结果,进而开始调用process_response方法】
         【Request object: 将这个请求request添加到任务队列中,当前的request的process_request流程就结束了,没有其他操作了】
         【抛出IgnoreRequest异常:将调用process_exception(),process_exception()如果没有处理该异常,则会继续调用errback来处理,如果errback
          中也没有对它处理的,就会忽视该异常】
process_response : 【Response :这个response可以是传过来的response,也可以是一个新的response,将继续调用下一个process_response】
          【Request :这个request将被添加到请求队列,然后该response的process_response流程就结束了】
           【抛出IgnoreRequest异常:将调用request.errback方法处理,如果该方法中没有对此异常进行处理,此异常 将被忽视】
process_exception : 【None : 继续调用其他process_exception处理这个异常】
          【Response object:开始调用process_response方法】
          【Request object: 此request将被添加到请求队列,process_exception流程就结束了】
process_exception是在下载处理器(download handler)或下载中间件的process_request抛出异常时被调用的。
from_crawler : 这个方法是scrapy的核心属性的一个入口,用于创建中间件实例 。如果需要用到signals,settings,spiders等,可以通过crawler.settings这种操作来
获取,cls(crawler.stats)是调用这个方法所在的class来实例化一个对象,crawler.stats相当于传给__init__(self,stats)的参数stats
@classmethod
from_crawler(cls,crawler):
  instance = cls(crawler.stats)
  return instance 
自定义retry中间件
from scrapy.downloadermiddlewares.retry import RetryMiddleware
import time 

class CustomRetryMiddleware(RetryMiddleware):
 
    def __init__(self,settings):
        self.request_error = 0
        super(CustomRetryMiddleware, self).__init__(settings)
    def process_response(self, request, response, spider):
        if request.meta.get('dont_retry', False):
            return response
        if response.status in self.retry_http_codes:
            if response.status==429: #在这里可以添加一些逻辑,在重试请求之前,
                spider.logger.info("[response]retry Middleware,Got 429 error,would stop 6 minutes,%s",request.url)
                time.sleep(60*6)
            spider.logger.info("[response]Retry Middleware ,response.status :%d,will start retry request,%s",response.status,request.url)
            reason = response_status_message(response.status)
            return self._retry(request, reason, spider) or response
        return response
 
 
    def process_exception(self, request, exception, spider):
        if isinstance(exception, self.EXCEPTIONS_TO_RETRY) \
                and not request.meta.get('dont_retry', False):
            spider.logger.info("[exception]Retry Middleware ,exception :%s,will start retry request,%s",exception,request.url)
            #返回一个request,到schedule中,等待下载,从重新走所有的middleware。    
            return self._retry(request, exception, spider)
 

要启用自定义的retry middleware ,需要将默认的RetryMiddleware设置为None

'DOWNLOADER_MIDDLEWARES' :{

'dayspider.middlewares.my_retry_middleware.CustomRetryMiddleware': 550,
'scrapy.downloadermiddlewares.retry.RetryMiddleware' : None,
},

下载异常

  • 像是 响应超时,网络连接异常, forbidden 502这类的没有response的异常  直接被process_exception 捕获
  • 像是 429(请求太频繁,403(禁止访问)500(服务器端返回一个表示错误的代码),有收到response的异常,可以用process_response进行处理

转载于:https://www.cnblogs.com/Ting-light/p/9582843.html

scrapy的Middleware相关推荐

  1. python中scrapy的middleware是干嘛的_python爬虫常用之Scrapy 中间件

    一.概述 1.中间件的作用 在scrapy运行的整个过程中,对scrapy框架运行的某些步骤做一些适配自己项目的动作. 例如scrapy内置的HttpErrorMiddleware,可以在http请求 ...

  2. python中scrapy的middleware是干嘛的_Python之爬虫(十九) Scrapy框架中Download Middleware用法...

    这篇文章中写了常用的下载中间件的用法和例子. Downloader Middleware处理的过程主要在调度器发送requests请求的时候以及网页将response结果返回给spiders的时候,所 ...

  3. 爬虫——scrapy框架爬取多个页面电影的二级子页面的详细信息

    文章目录 需求: 总结: 代码: movieinfo.py items.py middleware.py pipelines.py 结果: 附加: crawlspider可以改进: 需求: scrap ...

  4. scrapy中集成selenium+浏览器池实现selenium的并发爬取LCSC网站中非结构化表格数据+异步存储进mysql+完整代码

    爬取https://lcsc.com/products/Connectors_365.html这个网址下所有的表格数据. 蓝色的都是要爬取的子页面,要爬取子页面里面的表格数据 ,表格数据如下: 右上角 ...

  5. WebMagic之优秀爬虫框架

    2019独角兽企业重金招聘Python工程师标准>>> 1. 一个框架,一个领域 一个好的框架必然凝聚了领域知识.WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应 ...

  6. 三十八、Scrapy 下载中间件Middleware

    @Author:Runsen 文章目录 1. Spider 下载中间件(Middleware) 2. 激活一个下载DOWNLOADER_MIDDLEWARES 3. 编写你自己的下载中间件 4 使用代 ...

  7. 六、Scrapy中Download Middleware的用法

    本文转载自: https://scrapy-chs.readthedocs.io/zh_CN/latest/topics/downloader-middleware.html https://doc. ...

  8. 第44讲:scrapy中间键Middleware的使用

    我们在 Scrapy 架构中,可以看到有一个叫作 Middleware 的概念,中文翻译过来就叫作中间件,在 Scrapy 中有两种 Middleware,一种是 Spider Middleware, ...

  9. 框架下载_25. Scrapy 框架-下载中间件Middleware

    1. Spider 下载中间件(Middleware) Spider 中间件(Middleware) 下载器中间件是介入到 Scrapy 的 spider 处理机制的钩子框架,您可以添加代码来处理发送 ...

最新文章

  1. 云平台架构实践中的微服务分解原则
  2. Scrum联盟发布《2016年度Scrum状态调查报告》
  3. 2009-08-19股市大跌分析(转载)
  4. Good Luck!_JAVA
  5. 模式识别与智能系统和计算机视觉,天津大学模式识别与智能系统
  6. 低能量社交时代,我们都成了小心翼翼的「舔狗」
  7. 揭秘华尔街人工智能真实水平:距离40%的金融民工被取代或只剩8年
  8. HC-05蓝牙模块的配置和使用方法
  9. 百度入股汽车照明模组晶合光电
  10. proe虚拟服务器,ProE安装以及虚拟网卡的配置
  11. python flask http 接口开发
  12. python相关性系数显著性检验_【Python计算检验值】一元线性回归拟合,t值与p值,显著性检验...
  13. 卡尔曼滤波c语言程序,卡尔曼滤波算法及C语言实现
  14. 盗版 Win7 试用到期后黑屏咋办
  15. 五款好用到爆炸的小众软件,用过的都好说!建议收藏转发
  16. p20华为云电脑白屏_华为云电脑体验评测,原来手机办公、修图这么强大了
  17. 【微信小程序】wx.request请求后success回调的数据无法显示到页面上
  18. [生存志] 第79节 国语述诸国
  19. linux profiling 工具,高性能:LEP (LINUX EASY PROFILING) 工具介绍
  20. Linux安装谷歌浏览器chrome

热门文章

  1. 服务器物理结构,物理 I/O 体系结构
  2. odciexttableopen 调用出错 error open log_如何在 Spring 异步调用中传递上下文
  3. java jpanel 缓冲画图_Java:Jpanel 缓冲区 图像
  4. 应用事件探查器优化SQL Server系统[转]
  5. ARM开发板上iconv调用失败的解决方法
  6. day17(JDBC入门jdbcUtils工具介绍)
  7. protobuf java基础
  8. SQL Server中删除重复数据的2个方法
  9. GDI对象和CDC的使用方法(防止资源泄漏)
  10. 组播IP地址到底是谁的IP?