scrapy架构图与执行流程
概览
本文描述了Scrapy的架构图、数据流动、以及个组件的相互作用
架构图与数据流
上图中各个数字与箭头代表数据的流动方向和流动顺序,具体执行流程如下:
0. Scrapy将会实例化一个Crawler对象,在Crawler中:
创建spider对象----_create_spider
创建engine对象----_create_engine
通过engine对象打开spider并生成第一个request---- yield self.engine.open_spider(self.spider, start_requests)
实例化调度器对象----Scheduler
启动引擎---- yield defer.maybeDeferred(self.engine.start)
1. 引擎从Spider获取初始请求
----_next_request
----_next_request_from_scheduler
2. 引擎把初始请求给调度器,并向调度器询问下一次请求
----scheduler.next_request
3. 调度器会对url进行指纹去重,如果是未爬取过的url,就把它放到队列中等待,并把下一个request返回给引擎
把url放入到队列中----enqueue_request
返回下一个request----next_request
4. 引擎把从调度器返回的request途径下载中间件交给下载器
----download
5. 一旦页面完成下载,下载器将会生成一个响应,途径下载中间件,再把它交给引擎
----download
6. 引擎接收到响应,并把它途径爬虫中间件,再交给spider
----_handle_downloader_output
7. spdier接收到响应,并对它进行解析,解析出Items或者新的Request,再把它们途径爬虫中间件,提交给引擎
----parse
8. 引擎把接收到的items提交给Item Pipeline,把接收到的Request提交给调度器
9. 从步骤1开始重复该过程,直到不在有request
各组件介绍
ENGINE
引擎(engine)控制所有部件间的数据流,并在某些事件发生时触发事件
Scheduler
调度器(scheduler)接收来自引擎的request,并对它去重,放入到请队列中;并根据队列的取出规则,把请求按顺序返回给引擎
Downloader
下载器(Downloader)获取网页数据并返回给引擎
Spiders
爬虫(Spiders)用来解析response,提取出Items和新的Requests
Item Pipeline
对Items进行进一步的清洗,并持久化
Downloader middlewares
下载中间件可以勾住下载器和引擎之间的数据流,并对它们做一些处理,比如:
- 在request送到下载器之前对它做一些处理,可以添加User_Agent,修改IP等
- 对response做一些处理
Spider middlewares
爬虫中间件可以勾住爬虫和引擎之间的数据流,并对它们做一些处理
scrapy架构图与执行流程的更多相关文章
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...
- MySQL架构总览->查询执行流程->SQL解析顺序
Reference: https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...
- Spark架构与作业执行流程简介(scala版)
在讲spark之前,不得不详细介绍一下RDD(Resilient Distributed Dataset),打开RDD的源码,一开始的介绍如此: 字面意思就是弹性分布式数据集,是spark中最基本的数 ...
- MySQL架构与SQL执行流程
MySQL架构设计 下面是一张MySQL的架构图: 上方各个组件的含义如下: Connectors 指的是不同语言中与SQL的交互 Management Serveices & Utiliti ...
- 【Scrapy(一)】 Scrapy爬虫的基础执行流程
安装scrapy模块 : pip install scrapy 创建scrapy项目 1.scrapy startprojecty 项目名称 注意:如果创建失败,可以先卸载原有的scrapy模块, ...
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序(转)
文章转自 http://www.cnblogs.com/annsshadow/p/5037667.html https://www.cnblogs.com/cuisi/p/7685893.html
- Spark架构与作业执行流程简介
https://www.cnblogs.com/shenh062326/p/3658543.html
- 20181012关于mysql内部执行流程
转自:https://www.cnblogs.com/annsshadow/p/5037667.html 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序 前言: 一直是 ...
- 0807再整理SQL执行流程
转自http://www.cnblogs.com/annsshadow/p/5037667.html MySQL架构总览->查询执行流程->SQL解析顺序 前言: 一直是想知道一条SQ ...
随机推荐
- 浏览器使用小tip
谷歌浏览器截取长图 很多网页长图单个页面截不下来,那么需要如何解决? 首先,在谷歌浏览器chrome中打开需要截图的网页,等待需要截图的网页打开完毕,然后按F12 打开开发者工具,然后按组合键 Ctr ...
- JavaWeb_(Jar)使用fastjson解析json和序列化对象
菜鸟教程 传送门 JSON官网 传送门 fastjson插件下载 传送门 序列化[百度百科]:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对 ...
- python 随机数详细使用,推到以及字符串,双色球小程序
#随机数的使用import random #导入randomrandom.randint(0,9)#制定随机数0到9i=random.sample(range(1,34),6)#输出6个随机数,范围是 ...
- 记一次elastic-job使用
当当的elastic-job定时任务 业务场景是定时从微信取accesstoken和jsticket,因为都只有7200秒的有效时间,所以设置了定时任务,定时将得到的数据存到redis缓存中 问题1: ...
- springboot 集成 druid mybatis-plus
通过这篇配置成功: https://www.cnblogs.com/shine-rainbow/p/9618100.html 不过 mybatis 3.4.6 一直maven下载失败,于是直接在官方那 ...
- https的那些坑
1.时间 一些老手机不是系统自动对时,时间错误会报错. com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeExceptio ...
- 对《疯狂Spring Cloud微服务架构实战》作者的疑问
Cloud的程序都是用的内部Tomcat,即使把一个大App分成独立小块,能应付得了你们当年人力运维的大量请求涌入吗? 真不知道淘宝怎么做到的双11一直不垮?真实互联网生产环境是充斥图书市场中的所谓S ...
- 8.进行图片的裁剪,同时使用resize将图片的维度进行变化
1.img.crop((x1, y1, x2, y2)) 进行图片的裁剪 参数说明: x1, y1, x2, y2 表示图片的大小 2. img.resize((w, h)) # 进行图片的维度变化 ...
- 浏览器端-W3School-HTML:HTML DOM Select 对象
ylbtech-浏览器端-W3School-HTML:HTML DOM Select 对象 1.返回顶部 1. HTML DOM Select 对象 Select 对象 Select 对象代表 HTM ...
- no CUDA-capable device is detected,或者GPU is lost
出现以下问题,程序只能运行一次,而且每运行一次显卡就不见了,出现以下情况,只能重启才可以再次检测到: 最后解决: 我本来安装的是cuda9.0 但是(下面显示是10): 起初是因为说他表示最高可以到 ...