对于下载中间件

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进行处理

scrapy的Middleware的更多相关文章

  1. Scrapy Spider MiddleWare 设置

    # -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...

  2. python爬虫scrapy之downloader_middleware设置proxy代理

    一.背景: 小编在爬虫的时候肯定会遇到被封杀的情况,昨天爬了一个网站,刚开始是可以了,在settings的设置DEFAULT_REQUEST_HEADERS伪装自己是chrome浏览器,刚开始是可以的 ...

  3. Scrapy 增加随机请求头 user_agent

    原文: 为什么要增加随机请求头:更好地伪装浏览器,防止被 Ban. 如何在每次请求时,更换不同的 user_agent,Scrapy 使用 Middleware 即可 Spider 中间件 (Midd ...

  4. Scrapy+Chromium+代理+selenium

    上周说到scrapy的基本入门.这周来写写其中遇到的代理和js渲染的坑. js渲染 js是爬虫中毕竟麻烦处理的一块.通常的解决办法是通过抓包,然后查看request信息,接着捕获ajax返回的消息.但 ...

  5. webmagic的设计机制及原理-如何开发一个Java爬虫

    之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方 ...

  6. webmagic 增量爬取

    webmagic  是一个很好并且很简单的爬虫框架,其教程网址:http://my.oschina.net/flashsword/blog/180623 webmagic参考了scrapy的模块划分, ...

  7. webmagic的设计机制及原理-如何开发一个Java爬虫 转

    此文章是webmagic 0.1.0版的设计手册,后续版本的入门及用户手册请看这里:https://github.com/code4craft/webmagic/blob/master/user-ma ...

  8. Python爬虫从入门到放弃(十七)之 Scrapy框架中Download Middleware用法

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

  9. Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换

    总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...

随机推荐

  1. 52.JQ---向上滚动显示,向下滚动隐藏

    js: var windowTop = 0;$(window).scroll(function() { var scrolls = $(this).scrollTop(); if(scrolls &l ...

  2. 网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+

    网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+ HTTPDNS_移动开发_域名解析_域名防劫持-阿里云https://www.aliyun.com/prod ...

  3. Win10问题

    WIN10去除我的电脑上面的6个文件夹 把下面代码复制,保存到.reg中,然后执行即可(修改注册表文件.reg) Windows Registry Editor Version 5.00 ;如需还原去 ...

  4. 2019 GOALS

    ANNUAL GOAL 生活 1. 养成早睡早起的习惯 2. 体重:43kg 总体来讲希望自己有一个健康的生活方式,良好的饮食.运动习惯. 2019-04-17 18:47:14 UPDATE 3. ...

  5. ProcessExplorer使用分享

    工具描述 Process Explorer使用个轻量级的进程管理器,是由Sysinternals出品的免费工具,请猛击这里下载最新版本使用. 以下是官方介绍的翻译: “想知道是那个程序打开了某个文件或 ...

  6. python学习笔记:深浅拷贝的使用和原理

    在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型 1.变量和对象 变量-引用-对象(可变对象,不可变对象) 在python中一切都是对象,比如[1,2],'hello world',123,{'k1 ...

  7. flask --- 03 .特殊装饰器, CBV , redis ,三方组件

    一.特殊装饰器(中间件) 1.before_request 在请求进入视图函数之前 @app.before_request def look(): 2. after_request 在结束视图函数之后 ...

  8. eclipse中如何打开工作空间里面已经有的项目

    File->Import->打开大类General->找到小类Existing Projects info Workspace->选择Select root dirctory, ...

  9. [笔记] SQL性能优化 - 避免使用 IN 和 NOT IN

    WHY? IN 和 NOT IN 是比较常用的关键字,为什么要尽量避免呢? 1.效率低 可以参看我之前遇到的一个例子([小问题笔记(九)] SQL语句Not IN 效率低,用 NOT EXISTS试试 ...

  10. 714-Card Trick

    思维题,把n个卡片倒着放,然后每个卡片循环放到最底下i次,最后出来的结果就是要求的卡牌顺序 #include<stdio.h> #include<string.h> #incl ...