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打开新创建好的项目即可
在这里插入图片描述

项目构成

在这里插入图片描述

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

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

相关文章

Claude3荣登榜首,亚马逊云科技为您提供先行体验!

Claude3荣登榜首,亚马逊云科技为您提供先行体验! 个人简介前言抢先体验关于Amazon BedrockAmazon Bedrock 的功能 Claude3体验教程登录Amazon Bedrock试用体验管理权限详细操作步骤1.提交应用场景详细信息2.请求模型的访问权限3.请求成功,开始…

【LeetCode】674. 最长连续递增序列(简单)——代码随想录算法训练营Day52

题目链接&#xff1a; 题目描述 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c…

Mybatis实现分页查询数据(代码实操讲解)

在MyBatis中实现分页查询的常见方式有两种&#xff1a;使用MyBatis内置的分页插件如PageHelper&#xff0c;或者手动编写分页的SQL语句。下面我将为你提供两种方式的示例代码。 使用PageHelper分页插件 首先&#xff0c;确保你的项目中已经添加了PageHelper的依赖。在Maven项…

overleaf latex 笔记

overleaf: www.overleaf.com 导入.tex文件 1.代码空一行&#xff0c;代表文字另起一段 2. 1 2 3 排序 \begin{enumerate} \item \item \item \end{enumerate} 3.插入图片 上传图片并命名 \usepackage{float}导包\begin{figure}[H]&#xff1a;表示将图…

面试题--02

粘包问题 粘包问题是在TCP协议下&#xff0c;发送方发送的多个数据包在接收方接收时&#xff0c;数据之间没有明确的分界线&#xff0c;导致接收方无法正确区分每个数据包&#xff0c;从而无法正确读取数据。 解决办法&#xff1a; 1、服务器和客户端提前协商好每个消息的长度…

数据分析Pandas专栏---第十四章<Pandas训练题(中)>

前言: 继续上一篇: 数据分析Pandas专栏---第十三章&#xff1c;Pandas训练题(初)&#xff1e;-CSDN博客 正文: 题1: 如何将DataFrame的列按照指定的顺序进行排序&#xff1f; 题目&#xff1a; 给定一个DataFrame&#xff0c;包含订单编号、商品名称、商品数量等列&…

【网络安全】漏洞挖掘入门教程(非常详细),小白是如何挖漏洞(技巧篇)0基础入门到精通!

温馨提示&#xff1a; 初学者最好不要上手就去搞漏洞挖掘&#xff0c;因为漏洞挖掘需要很多的系统基础知识和一些理论知识做铺垫&#xff0c;而且难度较大…… 较合理的途径应该从漏洞利用入手&#xff0c;不妨分析一些公开的CVE漏洞。很多漏洞都有比较好的资料&#xff0c;分…

【四】【SQL Server】如何运用SQL Server中查询设计器通关数据库期末查询大题

数据库学生选择1122 数据库展示 course表展示 SC表展示 student表展示 数据库学生选课1122_3 第十一题 第十二题 第十三题 第十四题 第十五题 数据库学生选课1122_4 第十六题 第十七题 第十八题 第十九题 第二十题 数据库学生选课1122_5 第二十一题 第二十二题 结尾 最后&…

保留数据的重装系统教程!(win10系统)

上车警告&#xff01;&#xff01;&#xff01; 本教程无需思考&#xff0c;跟着操作一步一步来就能完成系统的重装。原理是将C盘系统重装&#xff0c;其他盘符数据保存。适用于系统盘重装数据或更改系统版本。 重要提示&#xff01;&#xff01;&#xff01; C盘有重要学习资…

Long-term Correlation Tracking LCT目标跟踪算法原理详解(个人学习笔记)

目录 1. 算法总览2. 算法详解2.1. 基础相关滤波跟踪2.2. 各模块详解2.2.1. 相关跟踪2.2.2. 在线检测器 3. 算法实现3.1. 算法步骤3.2. 实现细节 4. 相关讨论&总结 1. 算法总览 LCT的总体流程如上图所示&#xff0c;其思想为&#xff1a;将长时跟踪&#xff08;long-term tr…

第五节 JDBC驱动程序类型

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

18.四数之和

题目&#xff1a;给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#x…

(力扣题库)字符串相乘(C++)

题意如下&#xff1a; 给定两个以字符串形式表示的非负整数 num1 和 num2&#xff0c;返回 num1 和 num2 的乘积&#xff0c;它们的乘积也表示为字符串形式。 注意&#xff1a;不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2"…

每日一题 — 有效三角形的个数

611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 双指针思想&#xff0c;先将数据排序 然后先固定最大的数Max&#xff0c;也就是数组最后的数再定义一左一右两个下标 left 、 right&#xff0c;当这个值相加大于最大的数&#xff0c;那么他两…

Pytorch学习 day05(RandomCrop、Transforms工具使用总结)

RandomCrop 将PIL或Tensor格式的输入图片&#xff0c;随机裁剪指定尺寸的部分输入尺寸可以为序列或单个整形数字代码如下&#xff1a; from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriterimg Image.open("i…

token的无感刷新

Token的无感刷新通常通过以下步骤实现&#xff1a; 用户登录时&#xff0c;服务器生成一个访问令牌&#xff08;Access Token&#xff09;和一个刷新令牌&#xff08;Refresh Token&#xff09;&#xff0c;并将其返回给客户端。 客户端在每个请求中携带访问令牌&#xff0c;以…

百度换肤js

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>05 图片切换</title><style type"text/css">*{padding: 0;margin: 0;}#box{border: 1px solid #ccc;width: 430px;height: 70px…

python高级之元类

python高级之元类 一、Type创建类1、传统方式创建类2、非传统方式 二、元类三、总结 一、Type创建类 class A(object):def __init__(self, name):self.name namedef __new__(cls, *args, **kwargs):data object.__new__(cls)return data根据类创建对象 objA(‘kobe’) 1、执…

C++ 最短路 堆优化版的Dijkstra算法

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为非负值。 请你求出 1 号点到 n 号点的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;则输出 −1 。 输入格式 第一行包含整数 n 和 m 。 接下来 m 行每行包含三个…

外包干了2年,技术退步明显

先说一下自己的情况&#xff0c;研究生&#xff0c;19年进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…