Scrapy与分布式开发(3):Scrapy核心组件与运行机制

Scrapy核心组件与运行机制

引言

这一章开始讲解Scrapy核心组件的功能与作用,通过流程图了解整体的运行机制,然后了解它的安装与项目创建,为后续实战做好准备。

Scrapy定义

Scrapy是一个为了爬取网站数据、提取结构性数据而编写的应用框架。它使用Python语言编写,并基于异步网络框架Twisted来实现高性能的爬虫。Scrapy最初是为了页面抓取(更确切地说是网络抓取)而设计的,但它也可以用于获取API返回的数据或通用的网络爬虫。

体系结构图

在这里插入图片描述

Scrapy核心组件

Scrapy框架主要由以下几个核心组件构成:

  • 引擎(Engine):Scrapy的引擎负责控制数据流在系统中所有组件之间的流动。它接收请求并将其分派给调度器,同时也接收来自下载器的响应并将其分派给相应的Spider进行处理。
  • 调度器(Scheduler):调度器负责接收请求并将其加入队列中,以便在引擎空闲时按一定的顺序分派给下载器。Scrapy默认使用优先级队列来实现调度器。
  • 下载器(Downloader):下载器负责获取网页内容。当引擎将请求分派给下载器时,下载器会向目标网站发起请求,并将获取到的响应返回给引擎。
  • Spider:Spider是Scrapy框架中的核心组件之一,负责处理网页内容并提取结构化数据。每个Spider都需要定义一个或多个解析方法,用于从响应中提取数据。
  • 项目管道(Item Pipeline):项目管道负责处理Spider提取的数据。你可以在管道中定义一系列的数据处理步骤,如数据清洗、数据验证和数据持久化等。
  • 中间件(Middlewares):中间件是Scrapy框架中的一个重要概念,它允许你在请求和响应的处理过程中插入自定义的逻辑。Scrapy提供了下载器中间件和Spider中间件,分别用于处理下载过程中的请求和响应,以及Spider处理过程中的请求和响应。

Scrapy组件之间的交互过程深度解析

Scrapy的各个组件之间的交互过程就像是一个协同工作的流水线,每个组件都有自己特定的任务,并且它们通过消息传递进行交互,确保数据的流畅传递和处理。

  1. 起始阶段:Spider与引擎的交互

    • Spider:首先,Spider会将自己感兴趣的URL或URL模式告知引擎。这是整个流程的起点。
    • 引擎:引擎接收到Spider提供的URL后,将其封装成一个请求(Request)对象。
  2. 调度阶段:引擎与调度器的交互

    • 引擎:引擎将封装好的请求对象传递给调度器。
    • 调度器:调度器会检查这个请求是否已经被处理过(去重),如果没有,则将其放入待处理队列中。
  3. 下载阶段:引擎与下载器的交互

    • 引擎:引擎从调度器队列中取出一个请求,并交给下载器。
    • 下载器:下载器根据请求中的URL,发送HTTP请求到目标网站,并下载网页内容。
  4. 解析阶段:引擎与爬虫的交互

    • 下载器:下载完成后,下载器将下载的网页内容(即响应对象,Response)返回给引擎。
    • 引擎:引擎将响应对象交给爬虫进行解析。
    • 爬虫:爬虫根据预设的规则,解析响应对象,提取出需要的数据,并可能生成新的请求(比如点击链接、进行分页等)。
  5. 数据处理阶段:引擎与项目管道的交互

    • 爬虫:爬虫将解析得到的数据和新的请求返回给引擎。
    • 引擎:引擎将解析得到的数据交给项目管道进行进一步的处理,如清洗、验证和存储。
    • 项目管道:项目管道处理完数据后,可以选择将其存储到数据库、文件或其他存储介质中。
  6. 循环与结束

    • 引擎:对于爬虫生成的新请求,引擎会重复上述流程(从调度阶段开始),直到调度器中没有更多的请求,或者达到了某种终止条件(如达到设定的爬取数量、时间等)。
    • 结束:当所有请求都处理完毕,且没有新的请求生成时,整个Scrapy流程结束。

在这个过程中,每个组件都扮演着特定的角色,并通过消息传递进行交互。这种协同工作的模式使得Scrapy能够高效地爬取和处理网页数据。同时,Scrapy还提供了丰富的中间件机制,允许用户自定义和扩展各个组件之间的交互过程,以满足更复杂的爬取需求。

Scrapy安装与项目创建

Scrapy的安装

首先,确保你的Python版本是3.6或以上,因为Scrapy需要Python 3.6+。你可以使用以下命令来安装Scrapy:

pip install scrapy

如果你想卸载Scrapy,可以使用以下命令:

pip uninstall scrapy

如果你需要安装特定版本的Scrapy(例如2.6.1版本),可以使用以下命令:

pip install scrapy==2.6.1

安装完成后,你可以通过以下命令来检查Scrapy是否成功安装:

pip list

在列表中,你应该能看到Scrapy及其版本号。

创建Scrapy项目

安装完Scrapy后,你可以开始创建一个新的Scrapy项目。打开终端或命令行,然后导航到你想要创建项目的目录,并使用以下命令来创建一个新的Scrapy项目:

scrapy startproject myproject

这里的myproject是你的项目名称,你可以根据自己的需要来命名。执行上述命令后,Scrapy会在当前目录下创建一个名为myproject的新文件夹,其中包含了一些基本的文件和目录结构。

接下来,你可以在myproject目录下创建一个新的爬虫。使用以下命令来生成一个新的爬虫文件:

cd myproject
scrapy genspider myspider example.com

这里的myspider是你的爬虫名称,example.com是你要爬取的网站域名。执行上述命令后,Scrapy会在myproject/spiders目录下创建一个名为myspider.py的新文件,其中包含了一个基本的爬虫框架。

演示流程图

注意,安装scrapy需要进入python环境,如果大家是使用Anaconda安装的python环境,需要进去指定的环境才能进行下面操作,实际上我们直接在pycharm中进行即可

进入指定环境和目录,输入scrapy验证已安装scrapy
在这里插入图片描述

创建项目coreSpider,命令是scrapy startproject coreSpider
在这里插入图片描述

进入新创建好的coreSpider目录,先拿百度为例创建爬虫脚本
在这里插入图片描述

再使用pycharm打开新创建好的项目即可
在这里插入图片描述

项目构成

在这里插入图片描述

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

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

相关文章

【C++精简版回顾】20.模板的使用

1.模板起源 1.模板的定义 1.针对函数属性模板 //针对函数属性 template <class VOID > VOID print1(int a) {cout << a << endl; } 2.针对数据属性模板 //针对数据属性 template <typename INT,typename FLOAT> void print2(INT a,FLOAT b) {cout <…

win11配置Mask DINO小白踩坑记录

win11配置Mask DINO踩坑记录 1 准备工作2 创建python环境和安装detectron22.1 安装前提2.2 安装流程2.2.1 cl.exe的错误2.2.2 SetuptoolsDeprecationWarning的错误 3 MaskDINO运行3.1 运行demo 前情提要&#xff1a;需要复现Mask DINO&#xff0c;但是实验室没有Linux的电脑&am…

Tomcat基础与Nginx的动静分离

一、TOMCAT基础功能 &#xff08;一&#xff09;自动解压war包 在配置文件中讲到&#xff0c;当接受到请求后&#xff0c;会匹配符合要求的Host&#xff0c;在配置文件中的Host只有一个&#xff0c;且规定了自动解压war包 自动解压war包 .war&#xff1a;WebApp打包,类zip格…

领腾讯云红包,可抵扣云服务器订单金额

在2024年腾讯云新春采购节优惠活动上&#xff0c;可以领取新年惊喜红包&#xff0c;打开活动链接 https://curl.qcloud.com/oRMoSucP 会自动弹出红包领取窗口&#xff0c;如下图&#xff1a; 腾讯云2024新春采购节红包领取 如上图所示&#xff0c;点击“领”红包&#xff0c;每…

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

SPI 接口

SPI 接口 SPI 简介寻址方式通信过程极性和相位IIC 和 SPI 的异同相同点不同点 SPI 简介 SPI&#xff08;Serial Peripheral Interface&#xff09;是串行外设接口的缩写&#xff0c;SPI是一种高速的、全双工、同步的串行通信总线&#xff1b;SPI采用主从方式工作&#xff0c;一…

一篇了解电容的使用

目录 一、电容理论基础 1.电容的本质 2.电容量的大小 &#xff08;1&#xff09;电容的单位 &#xff08;2&#xff09;电容量的决定式 3.电容的特点 4.电容的串并联 5.电容器的类型 6.电容实际的电路模型 二、电容器的选型 1.安装方式 2.电容值 3.电容的类型 4…

【opencv】1基础知识

1.模块 2.应用 3.图像 注释&#xff1a;鲁棒性&#xff0c;也称健壮性、稳健性或强壮性&#xff0c;是指系统在异常和危险情况下生存的关键特性。 3.1 数字图像的定义&#xff1a; 数字图像作为2D图像&#xff0c;可以使用称为像素的有限数字集进行表示。 3.2 RGB模型&#…

AI学习集合-前瞻

AI学习前瞻 工作岗位 算法工程师机器学习工程师图像算法工程师ai工程师NLP高级算法工程师 学习路线 应用场景 计算机视觉技术应用场景 自然语言应用 AI流程 AI拟人流程 机器人历史数据经验模型规律依据模型预测未来依据规律做出判断 AI基本流程 术语所用到的技术手段数据数…

第五节 JDBC驱动程序类型

JDBC驱动程序是什么&#xff1f; JDBC驱动程序在JDBC API中实现定义的接口&#xff0c;用于与数据库服务器进行交互。 例如&#xff0c;使用JDBC驱动程序&#xff0c;可以通过发送SQL或数据库命令&#xff0c;然后使用Java接收结果来打开数据库连接并与数据库进行交互。 JDK…

最强模型Claude 3 Haiku速通指南在此!保姆级教学拿脚都能学会!

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

3月每日一题笔记

感谢我的好朋友的鼓励 3月4日 两种等价方式?都是错误的 ->加减中不能使用等价无穷小? ->不全面。 两项无穷小相减, 那么两项无穷小比值的极限不等于 1 时, 或者两项无穷小相加时, 其比值极限不等于 −1 时, 代数和差各项可以用等价无穷小替换 等价无穷小不精确

SSD LDPC纠错算法的重要性

固态硬盘&#xff08;Solid State Drives, SSD&#xff09;作为计算机行业中最具革命性的技术之一&#xff0c;凭借其更快的读写速度、增强的耐用性和能效&#xff0c;已经成为大多数用户的首选存储方案。然而&#xff0c;如同任何其他技术一样&#xff0c;SSD也面临自身的挑战…

C++——string类

前言&#xff1a;哈喽小伙伴们&#xff0c;从这篇文章开始我们将进行若干个C中的重要的类容器的学习。本篇文章将讲解第一个类容器——string。 目录 一.什么是string类 二.string类常见接口 1.string类对象的常见构造 2.string类对象的容量操作 3. string类对象的访问及遍…

大唐杯学习笔记:Day6

1.1小区选择 一、概述 1.UE在RRC_IDLE和RRC——INACTIVATE状态下进行的过程&#xff1b; 2.UE首先需要完成PLMN的选择,在已选择的PLMN上寻找合适的小区,获取合适的服务,监听控制信道,这个过程即小区选择过程&#xff1b; 3.根据小区重选准则,UE寻找其他更适合的小区进行小区…

德国Sentech自动扫描薄膜测量仪器SenSolH系列全套资源没有软件

德国Sentech自动扫描薄膜测量仪器SenSolH系列全套资源没有软件

JavaScript实现点击鼠标弹钢琴的效果

思路&#xff1a; 图片设置宽900px&#xff0c;找到鼠标按下时的x坐标和img距离body的x坐标&#xff0c;两个值相减&#xff0c;然后除100取整&#xff0c;赋值给a&#xff0c;通过判断a的值来确定放出那个音乐。 完整代码&#xff1a; <!DOCTYPE html> <html lan…

这些程序员交流学习的宝藏网站,无论你是大佬还是小白,都值得收藏!!!

正所谓&#xff0c;活到老学到老&#xff0c;无论我们身处何时何地&#xff0c;学习交流都可以让我们受益匪浅&#xff0c;掌握更多的知识技能&#xff0c;可以让我们在面对问题时多一份从容&#xff0c;可以让我们在关键时刻脱颖而出&#xff0c;那么&#xff0c;作为一个程序…

软考65-上午题-【面向对象技术】-面向对象分析、设计、测试

一、面向对象分析OOA 1-1、面向对象分析的定义 面向对象分析的目的&#xff1a;为了获得对应用问题的理解。理解的目的是确定系统的功能、性能要求。 面向对象分析包含5个活动&#xff1a;&#xff08;背&#xff01;&#xff09; 认定对象&#xff1b;&#xff08;重要一点…

springcloud:3.6测试信号量隔离

服务提供者【test-provider8001】 Openfeign远程调用服务提供者搭建 文章地址http://t.csdnimg.cn/06iz8 相关接口 测试远程调用&#xff1a;http://localhost:8001/payment/index 服务消费者【test-consumer-resilience4j8004】 Openfeign远程调用消费者搭建 文章地址http://t…