爬虫的步骤:发送请求获得响应→解析并提取数据→保存数据

我们沿用这个朴素的逻辑去理解scrapy

一、发送请求获得响应

1、爬虫发送请求request到引擎

2、引擎将请求request传递给调度器scheduler队列

3、调度器scheduler从请求队列中向引擎输送request

4、引擎将request 经过下载中间件Middleware传给下载器

Middleware下载器中间件是引擎和下载器之间通信的中间件。在这个中间件中我们可以设置代理、更换请求头等来达到反反爬虫的目的。要写下载器中间件,可以在下载器中实现两个方法。一个是process_request(),这个方法在将request交给下载器之前执行,一个是process_response()是当下载器完成http请求,返回响应给引擎的时候调用

process_request(self, request, spider) 必须返回以下之一:

  • 返回None:则继续执行其他下载中间件的process_request方法送往下载器,直到合适的下载器函数被调用,该request被执行,返回response
  • 返回Response:则终止当前流程,也终止继续调用其他process_request方法,将该response通过引擎返回给爬虫
  • 返回Request:则终止当前流程,也终止继续调用其他process_request方法,将request返回给调度器,大多数情况是更换新的request请求
  • IgnoreRequest:该异常就会交个process_exception方法进行处理; 如果没有任何一个方法处理该异常,那么该请求就直接被忽略不会记录错误日志

5、下载器完成HTTP请求,返回响应给下载中间件Middleware,将response传递给引擎

process_request(self, request, spider) 必须返回以下之一:

  • 返回response:则继续执行,其他下载中间件也会处理该response,直至交给引擎再交给爬虫
  • 返回request:则中间件终止,该request返回引擎再给调度器
  • 抛出 IgnoreRequest 异常:该请求就被忽略了且不做记录

6、引擎将response传递给爬虫

二、解析并提取数据

7、爬虫解析Response,提取数据items或继续向解析出来的url发送请求给引擎

三、保存数据

8、引擎将items传递给Item Pipeline,将请求传递给Scheduler,继续进行之前的步骤。

scrapy 运行逻辑的更多相关文章

  1. scrapy运行机制

    Scrapy主要包括了以下组件: 引擎(Scrapy)用来处理整个系统的数据流, 触发事务(框架核心) 调度器(Scheduler)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回 ...

  2. 测试.NET core MiddleWare 运行逻辑

    话不多说,直接开整. 首先创建一个.NET CORE web 工程,创建完成之后,会自动创建相关文件如图(本示例基于.NET CORE 3.0): 打开Startup.cs可以看到在Configure ...

  3. kubebuilder operator的运行逻辑

    kubebuilder 的运行逻辑 概述 下面是kubebuilder 的架构图.可以看到最外层是通过名为Manager的组件驱动的,Manager中包含了多个组件,其中Cache中保存了gvk和in ...

  4. beego框架开发投票网站(1) beego基础之运行逻辑

    本文档需结合beego官方文档食用 博主也仅仅是边学边记录,不保证内容的正确性,请当做通俗读物来看待 首先 beego是一个基于go语言的框架 其次 beego是一个mvc框架 框架可以理解为对底层又 ...

  5. Scrapy运行报错:ModuleNotFoundError: No module named 'douban.douban'

    运行scrapy爬虫报错: from douban.douban.items import DoubanItem ModuleNotFoundError: No module named 'douba ...

  6. Scrapy 运行多个爬虫

    本文所使用的 Scrapy 版本:Scrapy==1.8.0 一个 Scrapy 项目下可能会有多个爬虫,本文陈述两种情况: 多个爬虫 所有爬虫 显然,这两种情况并不一定是等同的.假设当前项目下有 3 ...

  7. scrapy 运行时报错 No module named _sqlite3

    新服务器上运行scrapy时报错 exceptions.ImportError: No module named _sqlite3 原因 由于新的环境缺少sqlite的依赖,编译python3是虽然不 ...

  8. 【scrapy运行姿势】scrapy.cmdline.execute

    scrapy.cmdline.execute scrapy的cmdline命令 1.启动爬虫的命令为:scrapy crawl (爬虫名) 2.还可以通过以下方式来启动爬虫 方法一:创建一个.py文件 ...

  9. Scrapy运行报错解决方案

    最近在学习Scrapy框架,用博客记录一下遇到的错误的解决方案 时间: 2016-9-20 错误:ImportError: No module named items 原因:spiders下的.py文 ...

随机推荐

  1. Java面试(解答题一)

    1.简述下列问题 List,set,map的区别 解答:List,Set都是继承自Collection接口,Map则不是: List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素 ...

  2. Phoenix的shell操作

    Phoenix的shell操作 一.Phoenix的Shell操作 1.进入(hbase01是主机名,2181是zookeeper的端口) 2.退出(注意结尾不加分号) 3.查询所有表(注意结尾不加分 ...

  3. hadoop知识点总结(一)hadoop架构以及mapreduce工作机制

    1,为什么需要hadoop 数据分析者面临的问题 数据日趋庞大,读写都出现性能瓶颈: 用户的应用和分析结果,对实时性和响应时间要求越来越高: 使用的模型越来越复杂,计算量指数级上升. 期待的解决方案 ...

  4. java开发工具一个很好的注释模板

    <?xml version="1.0" encoding="UTF-8" standalone="no"?><templa ...

  5. UI和3D物体的堆叠响应

    一.问题:当3D物体和UI元素重叠显示时一般UI元素会遮挡物体,这时点击UI元素响应时UI后方的物体也会响应. private void OnMouseDown() { ChangeColor(); ...

  6. 从零开始教你安装Oracle数据库

    1.数据库安装 1.1下载 根据自己的操作系统位数,到oracle官网下载(以oracle 11g 为例) 之后把两个压缩包解压到同一个文件夹内(需要注意的是,这个文件夹路径名称中最好不要出现中文.空 ...

  7. Codeforces Round #653 (Div. 3) B. Multiply by 2, divide by 6 (数学)

    题意:有一个数\(n\),每次操作可以使\(n*=2\)或\(n/=6\)(如果能被整除),求最少操作次数使得\(n=1\),如果不满足,输出\(-1\). 题解:我们只要看\(n\)的质因子即可,如 ...

  8. python 引用(import)文件夹下的py文件

    importlib.import_module动态导入模块: python中schedule模块的简单使用 || importlib.import_module动态导入模块 先看一下文件目录 1.同级 ...

  9. log4net GetLogger(source).IsInfoEnabled = false

    GetLogger(source).IsInfoEnabled = false解决办法 在.net core中需要把log4net.config放到 ITCP.Web\ITCP.Web\obj\Rel ...

  10. Python 分析热卖年货,今年春节大家都在送啥?

    今年不知道有多少小伙伴留在原地过年,虽然今年过年不能回老家,但这个年也得过,也得买年货,给家人长辈送礼.于是我出于好奇心的想法利用爬虫获取某宝数据,并结合 Python 数据分析和第三方可视化平台来分 ...