Scrapy框架中间件(一篇文章齐全)

news2024/11/16 16:01:50

1、Scrapy框架初识(点击前往查阅)

2、Scrapy框架持久化存储(点击前往查阅)

3、Scrapy框架内置管道(点击前往查阅)

4、Scrapy框架中间件

Scrapy 是一个开源的、基于Python的爬虫框架,它提供了强大而灵活的工具,用于快速、高效地提取信息。Scrapy包含了自动处理请求、处理Cookies、自动跟踪链接、下载中间件等功能 

Scrapy框架的架构图(今天的中间件看完,回头来看下) 

  • 引擎(Scrapy)

        用来处理整个系统的数据流处理, 触发事务(框架核心)

  • 调度器(Scheduler)

        用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址

    

  • 下载器(Downloader)

        用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)

    

  • 爬虫(Spiders)

        爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面

    

  • 项目管道(Pipeline)

        负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

 什么是中间件?

  • Scrapy的中间件有两个:

    • 爬虫中间件(一般不会去用,就不多赘述了

    • 下载中间件

  • 中间件在五大核心组件的什么位置:

    • 下载中间件位于引擎和下载器之间。

    • 引擎会给下载器传递请求对象,下载器会给引擎返回响应对象。

  • 根据位置了解中间件的作用:

    • 可以拦截到scrapy框架中所有的请求和响应

      • 拦截请求干什么?

        • 修改请求的ip,修改请求的头信息,设置请求的cookie。

      • 拦截响应干什么?

        • 可以修改响应数据。

一、中间件的应用

前置 settings 设置:(需要开启中间件)

1:中间件的介绍

  • 这就是2个中间件,其中 爬虫中间件 很少用到,为了简介明了,我们给他删除或者注释掉就行了。

  •  下载中间件图片中的2个也用不到啥,就删除即可了

  • 精简完的代码,也就是我们需要改写的与操作的(主要参数作用介绍)。 

 1.1:中间件的运行顺序

下图可知:

  • 先执行 process_request :发起的请求先经过该函数。
  • 然后执行 process_respons :返回的数据先经过该函数。
  • 最后才会获取到:返回的响应数据。

process_exception 函数,为啥没执行???

答:因为没报错,process_exception函数 只有在报错才会触发(图二)。

 

So :当我们知道了这个,那可操作的空间就很大了。

例如:

  • 在 process_request 函数中:我们可以设置 UA请求头、Cookie、代理等其他请求头。
  • 在 process_response 函数中:我们可以修改响应回来的数据。
  • 在 process_exception 函数中:我们可以获取错误,并修改错误,重新发起请求(修改错误这个难度太大了,知道有这个功能就行了。)

 

2:process_request 拦截修改请求

在该函数中,我们做哪些设置和操作呢?

1:开发代理中间件

  • request.meta['proxy'] = proxy

 

2:开发UA中间件

  • request.headers['User-Agent'] = ua

 

3:开发Cookie中间件

  • request.cookies = cookies

 

Cookie补充:(具有session的功能)

补充:return返回值

return None  # 这个地方就返回 None 就是正确的。

# return request # 如果返回的是 request 代表重新发起请求,这就死循环了。

 

3:process_response 拦截修改响应

1:修改响应数据

数据的修改需要用到新的模块,需要导入一下:

from scrapy.http import HtmlResponse

参数:

  • request:接收传入的响应对象
  • body:修改后的数据
  • url:就是当前拦截到的请求url
  • encoding:定义编码格式 

补充:return返回值

4、process_exception 拦截错误

  • 拦截和处理发生异常的请求对象。
  • 参数:reqeust就是拦截到的发生异常的请求对象,exception就是异常信息。
  • 方法存在的意义:将发生异常的请求拦截到,然后对其进行修正

 

5、spider的作用 (数据交互)

在中间件的3个函数中,都有 spider 这个参数,那这个参数是做啥的?

 

答:数据交互!

那如何数据交互呢?接着往下看⬇️⬇️⬇️

例如:

图一中:我们在爬虫文件中,设置了一个变量 msg

图二中:我们利用 spider.msg 就可以调用变量 msg

总结:由此我们可以得出,在中间件中只要有参数 spider 就可以调用 爬虫文件中的数据,进行数据交互(spider 就相当于 爬虫文件中类的实例化对象)。

图一: ⬇️

 图二:⬇️

 

补充:管道中 spider 作用

如下图:

  • 管道中的 spider 功能都是一样的,也是用于数据交互的。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分支和循环

通常来说,C语言是结构化的程序设计语言,这里的结构包括顺序结构、选择结构、循环结构,C语言能够实现这三种结构,如果我们仔细分析,我们日常生活中所见的事情都可以拆分为这三种结构或者它们的组合。 下面我会仔细讲解我…

4.7-容器网络之host和none

这一节我们来看一下docker中的另外两种网络,host和none。 docker network inspect none 于是就看到Containers, 里面包含了一个test1 表示这个容器连接到了none。

【【FPGA的 MicroBlaze 的 介绍与使用 】】

FPGA的 MicroBlaze 的 介绍与使用 可编程片上系统(SOPC)的设计 在进行系统设计时,倘若系统非常复杂,采用传统 FPGA 单独用 Verilog/VHDL 语言进行开发的方式,工作量无疑是巨大的,这时调用 MicroBlaze 软核…

tornado模版注入 [护网杯 2018]easy_tornado 1

打开题目 打开flag.txt 告诉我们flag在 /fllllllllllllag下 打开welcome.txt 我们看到了render渲染函数,联想到ssti 打开hints.txt 然后我们留意到每个打开url上面都有filehash 告诉我们如果想要访问/fllllllllllllag下的flag文件,是需要filehash这个GE…

回文链表,剑指offer 27,力扣 61

目录 题目: 我们直接看题解吧: 解题方法: 难度分析: 审题目事例提示: 解题分析: 解题思路(数组列表双指针): 代码说明补充: 代码实现: 代码实现&a…

Selenium——isDisplayed()、isEnabled()、isSelected()

判断页面是否存在某元素 Selenium没有直接提供判断是否存在的方法,可以使用findElements返回的数量判断;或者判断findElement是否抛出异常 webDriver.findElements(By.xpath("(//div[classel-button-group]//button)[1]")).size()isDisplaye…

2023.11.28 使用tensorflow进行“三好“权重分析

2023.11.28 使用tensorflow进行"三好"权重分析 这是最基础的一个神经网络问题。许久没有再使用,用来做恢复训练比较好。 x1w1 x2w2 x3*w3 y,已知x1,x2,x3和y,求w1,w2,w3 这是一个三元一次方程,正常需要三组数据就能…

使用 kubeadm 部署 Kubernetes 集群(一)linux环境准备

一、 初始化集群环境 准备三台 rocky8.8 操作系统的 linux 机器。每台机器配置:4VCPU/4G 内存/60G 硬盘 环境说明: IP 主机名 角色 内存 cpu 192.168.1.63 xuegod63 master 4G 4vCPU 192.168.1.64 xuegod64 worker 4G 4vCPU 192.168.1.62 xuegod62 work…

phpoffice在tp框架中如何实现导入导出功能

安装 phpoffice/phpspreadsheet 库 composer require phpoffice/phpspreadsheet 导入功能 创建一个用于上传文件的视图&#xff0c;可以使用元素来实现文件上传。 <!-- application/view/your/import.html --><form action"{:url(your/import)}" method&q…

提升团队协同效率:2023年值得尝试的6大团队任务管理软件

更好地协作、提高工作效率、追踪任务进度并确保任务按时完成。在市面上有很多团队任务管理工具可供选择&#xff0c;本文将为您推荐6款高效实用的团队任务管理工具。 1、飞项 飞项是一款集任务管理、项目协作、团队沟通于一体的协同办公软件。它提供了任务清单、日程安排、文…

Linux命令--根据端口号查看进程号(PID)

Linux命令–根据端口号查看进程号&#xff08;PID&#xff09; 查找8080端口对应的进程号: netstat -nlp|grep :8297对应的进程号1061,如果想杀掉此进程&#xff0c;可以用一下命令&#xff1a; kill -9 1061

XXL-Job详解(二):安装部署

目录 前言环境下载项目调度中心部署执行器部署 前言 看该文章之前&#xff0c;最好看一下之前的文章&#xff0c;比较方便我们理解 XXL-Job详解&#xff08;一&#xff09;&#xff1a;组件架构 环境 Maven3 Jdk1.8 Mysql5.7 下载项目 源码仓库地址链接: https://github.…

网络基础『发展 ‖ 协议 ‖ 传输 ‖ 地址』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; 神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文1.网络发展1.1.背景1.2.类型 2.网络协议2.1.什么是协议2.2.协议…

OSEK OS任务调度的底层逻辑

先参考 FreeRTOS的任务触发底层逻辑 简述RTOS任务调度底层逻辑 AUTOSAR-OS的调度机制-调度表&#xff08;没理解透&#xff0c;继续更新&#xff09; OSEK与FreeRTOS在任务调度上最大的区别在于&#xff0c;FreeRTOS是基于全抢占任务调度和时间片轮转调度机制&#xff0c;具有…

Pyqt5实现多线程程序

主从架构 Pyqt常常使用**主从架构&#xff08;Master-Workers 架构&#xff09;**来避免界面卡死的情况。 Master-Workers 架构就像它的名字&#xff0c;一个master统领着几个workers一起干活。其中某个worker倒下了不会导致整体任务失败。matser不用干活&#xff0c;因此可以…

2021年9月15日 Go生态洞察:TLS加密套件的自动排序机制

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

4年功能测试裸辞找不到工作,一周我就后悔了····

我们可以从以下几个方面来具体分析下&#xff0c;想通了&#xff0c;理解透了&#xff0c;才能更好的利用资源提升自己。 一、我会什么&#xff1f; 先说第一个我会什么&#xff1f;第一反应&#xff1a;我只会功能测试&#xff0c;在之前的4年的中我只做了功能测试。内心存在…

autogen的理解和实践

什么是autogen? AutoGen 是一个框架&#xff0c;支持使用多个代理来开发 LLM 应用程序&#xff0c;这些代理可以相互对话来解决任务。AutoGen 代理是可定制的、可对话的&#xff0c;并且无缝地允许人类参与。他们可以采用法学硕士、人力投入和工具组合的各种模式运作。简单来说…

高级IO select 多路转接实现思路

文章目录 select 函数fd_set 类型timeval 结构体select 函数的基本使用流程文件描述符就绪条件以select函数为中心实现多路转接的思路select 缺陷 select 函数 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); selec…

3款厉害的小工具,小黑子都在用!

大家好&#xff0c;我是 Javapub。 程序员与普通人最大的区别是什么&#xff0c;当然是会使用工具。基于一些同学经常问我的问题&#xff0c;接下来给大家分享几款我经常使用的工具&#xff0c;主打一个提升效率。 第一款 Everything 用 windwos 的同学都体会过&#xff0c;…