概览

本文描述了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架构图与执行流程的更多相关文章

  1. 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...

  2. MySQL架构总览->查询执行流程->SQL解析顺序

    Reference:  https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...

  3. Spark架构与作业执行流程简介(scala版)

    在讲spark之前,不得不详细介绍一下RDD(Resilient Distributed Dataset),打开RDD的源码,一开始的介绍如此: 字面意思就是弹性分布式数据集,是spark中最基本的数 ...

  4. MySQL架构与SQL执行流程

    MySQL架构设计 下面是一张MySQL的架构图: 上方各个组件的含义如下: Connectors 指的是不同语言中与SQL的交互 Management Serveices & Utiliti ...

  5. 【Scrapy(一)】 Scrapy爬虫的基础执行流程

    安装scrapy模块 : pip install scrapy  创建scrapy项目 1.scrapy startprojecty 项目名称  注意:如果创建失败,可以先卸载原有的scrapy模块, ...

  6. 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序(转)

    文章转自   http://www.cnblogs.com/annsshadow/p/5037667.html https://www.cnblogs.com/cuisi/p/7685893.html

  7. Spark架构与作业执行流程简介

    https://www.cnblogs.com/shenh062326/p/3658543.html

  8. 20181012关于mysql内部执行流程

    转自:https://www.cnblogs.com/annsshadow/p/5037667.html 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序   前言: 一直是 ...

  9. 0807再整理SQL执行流程

    转自http://www.cnblogs.com/annsshadow/p/5037667.html MySQL架构总览->查询执行流程->SQL解析顺序   前言: 一直是想知道一条SQ ...

随机推荐

  1. 2018 计蒜之道 初赛 第五场 A 贝壳找房搬家

    贝壳找房换了一个全新的办公室,每位员工的物品都已经通过搬家公司打包成了箱子,搬进了新的办公室了,所有的箱子堆放在一间屋子里(这里所有的箱子都是相同的正方体),我们可以把这堆箱子看成一个 x*y*z 的 ...

  2. MCMC & 贝叶斯

    用MCMC做参数估计

  3. java和python实现一个加权SlopeOne推荐算法

    一.加权SlopeOne算法公式: (1).求得所有item之间的评分偏差 上式中分子部分为项目j与项目i的偏差和,分母部分为所有同时对项目j与项目i评分的用户数 (2).加权预测评分 项目j与项目i ...

  4. 隐藏表单域、URL重写、cookie、session

    隐藏表单域: 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式:<input t ...

  5. char和vachar的字段长度怎么影响数据库的性能的

    1.限制规则 字段的限制在字段定义的时候有以下规则: a)                  存储限制 varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度 ...

  6. EL表达式里面不能直接使用list.size()得到长度,

    在jsp页面中不能通过${list.size}取列表长度, 而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pre ...

  7. request.getAttribute()和request.getParameter()两个方法的区别

    request.getAttribute()获得的数据必须曾经有过setAttibute()过: 而request.getParameter()获得是客户端POST或者GET请求时所携带的参数的值 g ...

  8. docker-compose常用命令(持续更新...)

    build 构建或重建服务 help 命令帮助 kill 杀掉容器 logs 显示容器的输出内容 port 打印绑定的开放端口 ps 显示容器 pull 拉取服务镜像 restart 重启服务 rm ...

  9. extentsreport testng美化报告生成

    一:主要内容 优化testng测试报告,使用extentsreport 解决extentsreport打开后加载不出来样式的问题 二:报告效果 先上图,看下testng extentsreport报告 ...

  10. 20191010-8 alpha week 1/2 Scrum立会报告+燃尽图 06

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8751 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 杨萍队名:胜 ...