对于下载中间件

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查看当前执行线程_关闭当前的某些线程 show processlist_kill

    每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. 如果您拥有SUPER权限,您 ...

  2. AIX更改用户组

    1:先 修改 user: smit chuser 把id 号给改了.成功! 2:在 修改group 的时候报警告: smit chgroup : can not update the /etc/pas ...

  3. 【Spark-core学习之二】 RDD和算子

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  4. 精练代码:一次Java函数式编程的重构之旅

    摘要:通过一次并发处理数据集的Java代码重构之旅,展示函数式编程如何使得代码更加精练. 难度:中级 基础知识 在开始之前,了解"高阶函数"和"泛型"这两个概念 ...

  5. 01:云计算三种服务模式SaaS、PaaS和IaaS

    1.1 云计算 1.什么是云计算 1. 云计算服务是指将大量用网络连接的计算资源统一管理和调度,构成一个计算资源池向用户按需服务. 2. 用户通过网络以按需.易扩展的方式获得所需资源和服务(资源包括网 ...

  6. [c/c++] programming之路(12)、循环结构

    一.求2n #include<stdio.h> void main(){ ; ; while(n--){ s*=; printf("%d,%d\n",s,n); } g ...

  7. 尚硅谷面试第一季-18ES与Solr的区别

    背景:它们都是基于Lucene搜索服务器基础之上开发,一款优秀的,高性能的企业级搜索服务器.[是因为他们都是基于分词技术构建的倒排索引的方式进行查询] 开发语言:Java语言开发 诞生时间:Solr ...

  8. ORM查询条件

    模板: from django.db import models class Article(models.Model): title = models.CharField(max_length=20 ...

  9. Qt获取选择的文件夹和文件路径

    获取文件夹路径 static QString getExistingDirectory(QWidget *parent = Q_NULLPTR, const QString &caption ...

  10. 三 drf 认证,权限,限流,过滤,排序,分页,异常处理,接口文档,集xadmin的使用

    因为接下来的功能中需要使用到登陆功能,所以我们使用django内置admin站点并创建一个管理员. python manage.py createsuperuser 创建管理员以后,访问admin站点 ...