爬虫工作量由小到大的思维转变---<第二十八章 Scrapy中间件说明书>

爬虫工作量由小到大的思维转变---<第二十六章 Scrapy通一通中间件的问题>-CSDN博客

前言:

(书接上面链接)自定义中间件玩不明白? 好吧,写个翻译的文档+点笔记,让中间件更通俗一点!!!

正文:

全局图:

爬虫中间件--->翻译+笔记:

from scrapy import signals

# useful for handling different item types with a single interface
from itemadapter import is_item, ItemAdapter


class XXXSpiderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.

    #--翻译-># 并非所有方法都需要被定义。如果某个方法没有被定义,
    # Scrapy 将会假设蜘蛛中间件不会修改传递的对象。

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        #这个方法被用于创建你的Scrapy蜘蛛。
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        # Called for each response that goes through the spider
        # middleware and into the spider.

        # Should return None or raise an exception.

        # --翻译--># 这个方法由Scrapy用于创建你的蜘蛛。
        # 对于每个通过蜘蛛中间件到达蜘蛛的响应,会被调用。
        # 应该返回None或引发异常。

        # --->笔记:可以用它
        # 预处理响应数据,例如解析、提取信息、清洗数据等;
        # 对响应进行过滤或过程控制;
        # 处理错误或异常情况;
        # 添加自定义的功能或逻辑。
        # 如果你不希望对响应进行任何修改或处理,你可以简单地返回None。
        return None

    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.

        # Must return an iterable of Request, or item objects.

        #---翻译-->该方法在蜘蛛处理响应并返回结果后被调用。
        # 必须返回一个可迭代的Request对象或item对象。

        '''
        笔记:
        这个方法允许你从蜘蛛处理的结果中进一步操作和处理数据。你可以修改结果,添加、
        删除或筛选特定的数据,或者在结果中创建新的Request对象来进行进一步的爬取。你
        可以通过yield语句将处理后的结果返回。
        总之,process_spider_output方法提供了一个在蜘蛛处理响应结果后对结果进行额外处理的机会,用于进一步定制和控制爬取过程。
        '''
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):
        # Called when a spider or process_spider_input() method
        # (from other spider middleware) raises an exception.

        # Should return either None or an iterable of Request or item objects.
        '''
        翻译:当蜘蛛或 process_spider_input() 方法(来自其他爬虫中间件)引发异常时调用。
        应该返回 None 或者一个可迭代的 Request 或 item 对象。

        笔记:
        1.用于处理当蜘蛛或其他爬虫中间件的 process_spider_input() 方法引发异常时的情况
        2.你可以针对异常情况进行任何处理。可以根据具体需求进行错误处理、记录日志、重新发送请求等操作。
        -->通俗地说,这个方法允许你在蜘蛛或其他爬虫中间件的输入方法引发异常时进行自定义处理。
        你可以根据具体的异常情况进行相应的处理操作,如重新发送请求、记录日志等。

        '''
        pass

    def process_start_requests(self, start_requests, spider):
        # Called with the start requests of the spider, and works
        # similarly to the process_spider_output() method, except
        # that it doesn’t have a response associated.

        # Must return only requests (not items).
        '''
        翻译: 在蜘蛛开始请求时被调用,与 process_spider_output() 方法相似,
             不同之处在于它没有与之关联的响应。

        笔记:
        这个方法允许你在蜘蛛开始请求之前对初始请求进行自定义处理。你可以修改请求对象的属性,
        添加额外的请求,或者根据需求生成新的请求对象
        --->在爬虫开始请求之前提供了一个自定义处理初始请求的机会,用于修改请求参数或生成新的请求对象。
        '''

        for r in start_requests:
            yield r

    def spider_opened(self, spider):
        '''
        翻译:在爬虫开始运行时被调用;

        笔记:你可以用它
        1.初始化一些资源或状态;
        2.打开数据库连接或文件;
        3.设置爬虫的日志输出。..等
        --->可以在这里进行一些准备工作,以确保爬虫在运行时具备必要的环境和配置


        '''
        spider.logger.info("Spider opened: %s" % spider.name)

下载中间件--->翻译+笔记:

class JihaiEndDownloaderMiddleware:
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.
    # -->翻译:# 并非所有方法都需要被定义。如果某个方法没有被定义,
    # # Scrapy 将会假设下载中间件不会修改传递的对象。

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        # 该方法由Scrapy用于创建你的爬虫。
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called

        '''

         # 对每个通过下载中间件的请求进行处理。

        # 必须返回以下之一:
        # - 返回 None:继续处理该请求
        # - 或返回一个 Response 对象
        # - 或返回一个 Request 对象
        # - 或引发 IgnoreRequest:将调用已安装的下载中间件的 process_exception() 方法
        '''
        return None

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        # print(f'中间件接收:{response.text}')

        '''
        # 对从下载器返回的响应进行处理。

        # 必须返回以下之一:
        # - 返回一个 Response 对象
        # - 或返回一个 Request 对象
        # - 或引发 IgnoreRequest
        # print(f'中间件接收:{response.text}')

        '''

        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain

        '''
         # 当下载处理程序或 process_request() 方法(来自其他下载中间件)引发异常时调用。

        # 必须返回以下之一:
        # - 返回 None:继续处理该异常
        # - 返回一个 Response 对象:停止 process_exception() 链
        # - 返回一个 Request 对象:停止 process_exception() 链
        '''
        pass

    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)

from_crawler(cls, crawler) 方法:

  • 该方法被 Scrapy 用于创建下载中间件实例。
  • 通常用于进行初始化操作和设置信号(Signal)。
  • 推荐用于在下载中间件创建时进行一些必要的准备工作或设置。

process_request(self, request, spider) 方法:

  • 对每个经过下载中间件的请求进行处理。
  • 必须返回以下之一:
  • 返回 None:继续处理该请求

-1.继续处理该请求,将会继续传递给后续的下载中间件处理,直到请求被发送到下载器。
-2.后续的下载中间件将有机会进一步处理请求或对请求进行修改。

  • 或返回一个 Response 对象

-1.将会终止后续的下载中间件的处理,并将该响应传递回爬虫进行处理(即交给响应处理函数)。
-2.后续的下载中间件的 process_request 和 process_response 方法不会再被调用。

  • 或返回一个 Request 对象

-1.将会终止后续的下载中间件的处理,并将该请求重新发送到引擎进行处理。
-2.该请求会经过中间件的处理流程,包括其他的下载中间件。
-3.可以用于对请求进行修改或生成新的请求来重新发起爬取。

  • 或引发 IgnoreRequest,将调用已安装的下载中间件的 process_exception() 方法。

-1.将会停止处理该请求,并调用已安装的其他下载中间件的 process_exception 方法。
-2.这是一个特殊情况,用于处理特定的异常情况或错误。
-3.通常用于处理某个请求无法继续处理的情况,可以选择忽略该请求,或者在 process_exception 方法中进行处理。

  • 用于自定义处理请求的行为,例如添加通用的请求信息、修改请求参数等。

--->补充:   (如果请求有问题)你想让一个request彻底从队列中消失,减少他接下来的生命周期;最直接的办法是引发异常; 如果返回了None他还是会传给spider的;关键取决于你怎么处理你的异常(要不要记录,在哪里记录); 最直接的还是给他引发异常~这样他就直接用日志记录了,不用再脱了裤子放屁跑spider里面去报异常!


process_response(self, request, response, spider) 方法:

  • 对从下载器返回的响应进行处理。
  • 必须返回以下之一:
  • 返回一个 Response 对象

-1.继续处理该响应,将其传递给后续的下载中间件进行处理。
-2.后续的下载中间件将有机会对响应进行进一步处理或对其进行修改。
-3.当没有其他中间件对响应进行进一步处理时,将会将响应传递给爬虫进行处理(即交给响应处理函数)。

  • 或返回一个 Request 对象

-1.将会将该请求重新发送到引擎进行处理,并再次经过下载中间件的处理流程。
-2.可以用于对响应进行处理后生成新的请求,或根据响应内容进行重定向等操作。

补充:重试用它;最好再+一个队列优先级,让这个重试的跑队列前面去,快点消掉关于他附带的(例如item)数据;然后还要注意别让这个请求被重复的url给筛掉了;

案例说明:(`+优先级`和`不去重属性`)

from scrapy import Request

class RetryMiddleware:
    def process_response(self, request, response, spider):
        # 如果返回的响应状态码不是200,则进行重试
        if response.status != 200:
            # 修改原始的请求,并设置新的优先级和去重属性
            retry_request = request.copy()
            retry_request.priority += 1
            retry_request.dont_filter = True  # 设置不进行去重
            return retry_request
        
        return response
  • 或引发 IgnoreRequest。
  • 用于自定义处理响应的行为,例如解析、提取数据等。


process_exception(self, request, exception, spider) 方法:

  • 当下载处理程序或其他下载中间件的 process_request() 方法引发异常时调用。
  • 必须返回以下之一:
  • 返回 None:继续处理该异常

-1.如果希望继续处理异常并将其传递给其他下载中间件来处理,可以在 process_exception 方法中返回 None,让异常继续传递给后续的处理程序。

补:能给出来异常,这时候最好给他加个记录;然后返回None完事了!

案例:

class CustomDownloaderMiddleware:
    def process_exception(self, request, exception, spider):
        # 其他处理代码...
        
        # 获取异常的URL
        url = request.url
        
        # 使用日志记录器记录异常的URL
        spider.logger.error(f"这个鬼url有问题,咱不要了;给他记一笔: {url}")
        
        return None

  • 返回一个 Response 对象:停止 process_exception() 链
  • 返回一个 Request 对象:停止 process_exception() 链

补:这俩在这方法里,我一般是不搁这处理的;你要自定义玩法,随你...就是用来重试和返回个别的给spider或者队列的

  • 用于自定义处理异常情况,例如处理超时、处理错误状态码等。

spider_opened(self, spider) 方法:

补:--->每次请求开一个spider?怕是有病吧.鸡肋的设计;直接去爬虫中间件里面整这玩意,这里直接给他过掉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/272209.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥小课堂-平方和【算法赛】

问题描述 蓝桥小课堂开课啦! 平方和公式是一种用于计算连续整数的平方和的数学公式。它可以帮助我们快速求解从 1 到 n 的整数的平方和,其中 n 是一个正整数。 平方和公式的表达式如下: 这个公式可以简化计算过程,避免逐个计算…

JRT支持人大金仓

之前对接了PostGreSql和iris和Cache库,表的主键列都是RowID,列同时区分大小写带引号。这次试试连人大金仓库,主键列不叫RowID了,改id,然后不使用大小写。 代码生成器生成的代码效果 测试表 生成实体 生成后台 生…

vue 脚手架文件结构及加载过程浅谈

1. 初始化脚手架 1.1 全局安装 vue/cli npm install -g vue/cli 1.2 切换到创建项目的目录,执行 vue create projectname 1.3 选择符合自己要求的项进行Y/N,最终生成项目文件 2. 脚手架文件结构 |-- node_modules: 存放下载依赖的文件夹 |-- public: …

【HTML5】第2章 HTML5标签和属性

学习目标 掌握文本控制标签的用法,能够使用文本控制标签设置文本样式。 掌握图像标签的用法,能够使用图像标签在网页中嵌入图片。 掌握超链接标签的用法,能够使用超链接实现页面的跳转。 掌握列表标签的用法,能够使用列表标签设…

【Java中序列化的原理是什么(解析)】

🍁序列化的原理是什么? 🍁典型-----解析🍁拓展知识仓🍁Serializable 和 Externalizable 接门有何不同? 🍁如果序列化后的文件或者原始类被篡改,还能被反序列化吗?🍁serialVersionU…

JSON在Java中的使用

目录 第一章、快速了解JSON1.1)JSON是什么1.2)json的语法格式①键值对、字符串、数字、布尔值、数组、对象②嵌套的格式 1.3)为什么使用JSON 第二章、发送和接收JSON格式数据2.1)postman发送JSON格式数据2.2)Java后端接…

C/C++图形化编程(1)

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 信念是一把无坚不摧的利刃&#xff01…

JavaOOP篇----第十九篇

系列文章目录 文章目录 系列文章目录前言一、数组有没有length()这个方法? String有没有length()这个方法二、用最有效率的方法算出2乘以8等于几三、float型float f=3.4是否正确?四、排序都有哪几种方法?请列举五、静态变量和实例变量的区别?前言 前些天发现了一个巨牛的人…

基础数论一:判定质数和求约数相关

1.试除法求质数 质数就是大于1的整数中除了1和自身没有其他因数的数 1.1暴力求解 暴力求解的思路就是从2遍历到自身判断是否有被整除的数&#xff0c;时间复杂度为O(n)的 bool is_prime(int x) {if(x<2)return false;for(int i2;i<x;i){if(x%i0){return false;}}return…

第十七章 多线程基础

一、线程相关概念 1. 程序 程序&#xff1a;是为完成特定任务、用某种语言编写的一组指令的集合。 简单说就是代码。 2. 进程 &#xff08;1&#xff09;进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统会为该进程分配内存空…

离职的赔偿算法n 、n+1、2n你还不懂嘛?

亲爱的小伙伴们&#xff0c;由于微信公众号改版&#xff0c;打乱了发布时间&#xff0c;为了保证大家可以及时收到文章的推送&#xff0c;可以点击上方蓝字关注测试工程师成长之路&#xff0c;并设为星标就可以第一时间收到推送哦&#xff01; 哪些情况需要支付经济补偿? 劳动…

看图了解ODF光纤配线架,详细熔接过程学习

弱电工程&#xff0c;远距离传输离不开光纤&#xff0c;只有光纤才能让网络传输的更远&#xff0c;今天了解光纤的配套产品&#xff0c;光纤配线架&#xff08;Optical Distribution Frame&#xff09;用于光纤通信系统中局端主干光缆的成端和分配&#xff0c;可方便地实现光纤…

【Python】requests库在CTFWeb题中的应用

目录 ①Bugku-GET ②Bugku-POST ③实验吧-天下武功唯快不破 ④Bugku-速度要快 ⑤Bugku-秋名山车神 ⑥Bugku-cookies ①Bugku-GET import requestsresprequests.get(urlhttp://114.67.175.224:12922/,params{what:flag}) print(resp.text)//或者 //resprequests.get(urlht…

使用Visual Studio调试VisionPro脚本

使用Visual Studio调试VisionPro脚本 方法一 &#xff1a; 修改项目文件 csproj步骤&#xff1a; 方法二 &#xff1a; Visual Studio附加功能步骤&#xff1a; 方法一 &#xff1a; 修改项目文件 csproj 步骤&#xff1a; 开启VisionPro脚本调试功能 创建一个VisionPro程序…

VBA技术资料MF99:在代码中使用VLookUp函数

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

华为数通方向HCIP-DataCom H12-831题库(多选题:221-240)

第221题 在割接项目的项目调研阶段需要对现网硬件环境进行观察,主要包括以下哪些内容? A、设备的位置 B、ODF位置 C、接口标识 D、光纤接口对应关系 答案:ABCD 解析: 在项目割接前提的项目调研阶段,需要记录下尽可能详细的信息。 第222题 以下哪些项能被正则表达式10*成…

每日一题——LeetCode206.反转链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1示例2示例3提示 2. 思路3.代码 1. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例1 输入&#xff1a;head [1…

<JavaEE> TCP 的通信机制 -- 确认应答 和 超时重传

目录 TCP的通信机制的核心特性 一、确认应答 1&#xff09;什么是确认应答&#xff1f; 2&#xff09;如何“确认”&#xff1f; 3&#xff09;如何“应答”&#xff1f; 二、超时重传 1&#xff09;丢包的概念 2&#xff09;什么是超时重传&#xff1f; 3&#xff09…

算法leetcode|94. 二叉树的中序遍历(多语言实现)

文章目录 94. 二叉树的中序遍历&#xff1a;样例 1&#xff1a;样例 2&#xff1a;样例 3&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 94. 二叉树的中序遍历&#xff1a; …

什么样的产品适合建设私域流量池?

私域流量是什么&#xff1f;公域流量和私域流量是相对概念&#xff0c;触达和运营更加自由的流量称为私域流 量。私域流量的形态&#xff0c;我们称为私域流量池。私域流量池本质是便捷和低成本的运营方式&#xff0c; 运营用户&#xff0c;追求更便宜的流量来源、更高的售卖转…