对于下载中间件

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. mysql数据库定义某字段为唯一约束

    第二:根据以上图片的第四步获得sql语句,并执行sql语句就可以了

  2. Eclipse集成scala插件

    1.Eclipse中右击help,选择Eclipse Marketplace,搜索scala,一路点击安装,重启Eclipse. 2.新建工程,new->other->出现scala wi ...

  3. db2空值、null

    1. 输入参数为字符类型,且允许为空的,可以使用COALESCE(inputParameter,'')把NULL转换成''; 2. 输入类型为整型,且允许为空的,可以使用COALESCE(inputP ...

  4. n皇后问题——关于斜线的编号

    题目大意:在n*n的棋盘中,放置n个皇后(同一行.同一列.同一斜线,只有一个皇后) 这道题是一道非常经典的dfs模板题,同一行.同一列的判断不是很难,但同一斜线有一定的难度,下面给出关于斜线编号的解决 ...

  5. noip单词接龙

    看了许多题解都好长啊,自不量力的来贴一下代码 (震惊于这都能ac...) 这道题的思路是先从字符串中找有重部分然后直接比较剩下的部分,比较的数据也可以用来计算数值 其实满水的题 总之看注释啦(竟然能耐 ...

  6. Android项目开发第二天,关于GitHub

    一. 今天在网上学习了如何使用GitHub,了解了GitHub是干什么的. 作为开源代码库以及版本控制系统,Github拥有超过900万开发者用户.随着越来越多的应用程序转移到了云上,Github已经 ...

  7. Python自然语言处理笔记【二】文本分类之监督式分类的细节问题

    一.选择正确的特征 1.建立分类器的工作中如何选择相关特征,并且为其编码来表示这些特征是首要问题. 2.特征提取,要避免过拟合或者欠拟合 过拟合,是提供的特征太多,使得算法高度依赖训练数据的特性,而对 ...

  8. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 题目9 : Minimum

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You are given a list of integers a0, a1, …, a2^k-1. You need t ...

  9. 剑指offer(52)正则表达式的匹配

    题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...

  10. git分散式版本管理系统,从安装到基本使用

    首先,当然是安装git了,不用寻思,官网下载即可 https://git-scm.com/downloads 第二是设置账户,鼠标右键,选择git bush,在命令窗口中进行设置 git config ...