Scrapy框架的使用之Spider Middleware的用法
Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架。我们首先来看看它的架构,如下图所示。
当Downloader生成Response之后,Response会被发送给Spider,在发送给Spider之前,Response会首先经过Spider Middleware处理,当Spider处理生成Item和Request之后,Item和Request还会经过Spider Middleware的处理。
Spider Middleware有如下三个作用。
我们可以在Downloader生成的Response发送给Spider之前,也就是在Response发送给Spider之前对Response进行处理。
我们可以在Spider生成的Request发送给Scheduler之前,也就是在Request发送给Scheduler之前对Request进行处理。
我们可以在Spider生成的Item发送给Item Pipeline之前,也就是在Item发送给Item Pipeline之前对Item进行处理。
一、使用说明
需要说明的是,Scrapy其实已经提供了许多Spider Middleware,它们被SPIDER_MIDDLEWARES_BASE
这个变量所定义。
SPIDER_MIDDLEWARES_BASE
变量的内容如下:
{'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50,'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500,'scrapy.spidermiddlewares.referer.RefererMiddleware': 700,'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800,'scrapy.spidermiddlewares.depth.DepthMiddleware': 900,
}复制代码
和Downloader Middleware一样,Spider Middleware首先加入到SPIDER_MIDDLEWARES
设置中,该设置会和Scrapy中SPIDER_MIDDLEWARES_BASE
定义的Spider Middleware合并。然后根据键值的数字优先级排序,得到一个有序列表。第一个Middleware是最靠近引擎的,最后一个Middleware是最靠近Spider的。
二、核心方法
Scrapy内置的Spider Middleware为Scrapy提供了基础的功能。如果我们想要扩展其功能,只需要实现某几个方法即可。
每个Spider Middleware都定义了以下一个或多个方法的类,核心方法有如下4个。
process_spider_input(response, spider)
。process_spider_output(response, result, spider)
。process_spider_exception(response, exception, spider)
。process_start_requests(start_requests, spider)
。
只需要实现其中一个方法就可以定义一个 Spider Middleware。下面我们来看看这4个方法的详细用法。
1. process_spider_input(response, spider)
当Response被Spider Middleware处理时,process_spider_input()
方法被调用。
process_spider_input()
方法的参数有如下两个。
response
,是Response对象,即被处理的Response。spider
,是Spider对象,即该Response对应的Spider。
process_spider_input()
应该返回None或者抛出一个异常。
如果它返回None,Scrapy将会继续处理该Response,调用所有其他的Spider Middleware,直到Spider处理该Response。
如果它抛出一个异常,Scrapy将不会调用任何其他Spider Middleware的
process_spider_input()
方法,而调用Request的errback()
方法。errback
的输出将会被重新输入到中间件中,使用process_spider_output()
方法来处理,当其抛出异常时则调用process_spider_exception()
来处理。
2. process_spider_output(response, result, spider)
当Spider处理Response返回结果时,process_spider_output()
方法被调用。
process_spider_output()
方法的参数有如下三个。
response
,是Response对象,即生成该输出的Response。result
,包含Request或Item对象的可迭代对象,即Spider返回的结果。spider
,是Spider对象,即其结果对应的Spider。
process_spider_output()
必须返回包含Request或Item对象的可迭代对象。
3. process_spider_exception(response, exception, spider)
当Spider或Spider Middleware的process_spider_input()
方法抛出异常时,process_spider_exception()
方法被调用。
process_spider_exception()
方法的参数有如下三个。
response
,是Response对象,即异常被抛出时被处理的Response。exception
,是Exception对象,即被抛出的异常。spider
,是Spider对象,即抛出该异常的Spider。
process_spider_exception()
必须要么返回None
,要么返回一个包含Response或Item对象的可迭代对象。
如果它返回
None
,Scrapy将继续处理该异常,调用其他Spider Middleware中的process_spider_exception()
方法,直到所有Spider Middleware都被调用。如果它返回一个可迭代对象,则其他Spider Middleware的
process_spider_output()
方法被调用,其他的process_spider_exception()
不会被调用。
4. process_start_requests(start_requests, spider)
process_start_requests()
方法以Spider启动的Request为参数被调用,执行的过程类似于process_spider_output()
,只不过它没有相关联的Response,并且必须返回Request。
process_start_requests()
方法的参数有如下两个。
start_requests
,是包含Request的可迭代对象,即Start Requests。spider
,是Spider对象,即Start Requests所属的Spider。
process_start_requests()
必须返回另一个包含Request对象的可迭代对象。
三、结语
本节介绍了Spider Middleware的基本原理和自定义Spider Middleware的方法。Spider Middleware使用的频率不如Downloader Middleware的高,在必要的情况下它可以用来方便数据的处理。
本资源首发于崔庆才的个人博客静觅: Python3网络爬虫开发实战教程 | 静觅
如想了解更多爬虫资讯,请关注我的个人微信公众号:进击的Coder
weixin.qq.com/r/5zsjOyvEZ… (二维码自动识别)
Scrapy框架的使用之Spider Middleware的用法相关推荐
- Scrapy框架(二)——Spider
这里我将spiders的意思理解为在项目Spiders目录下创建的各个py文件(除__init__).它们的作用是负责网页的抓取逻辑,以及数据的解析逻辑.所以Spider是Scrapy爬虫中相对核心的 ...
- python pipeline框架_爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 1. Spider Middleware Spider Middleware是介入到Scrapy的Spid ...
- Scrapy 框架 中间件,信号,定制命令
中间件 下载器中间件 写中间件 from scrapy.http import HtmlResponse from scrapy.http import Requestclass Md1(object ...
- python scrapy框架爬虫当当图书网
最近在复习scrapy框架,就随便找了个网站做了一下爬虫,当当网,说实话这种网站还是比较好做爬虫的,我没加代理,也没限速,没写多线程,就直接搞下来了,数据量还是比较可观的.接下来进入正题: 先看一下整 ...
- 爬虫----Scrapy框架
一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...
- scrapy 框架抓取艺龙酒店(热门城市酒店信息)
一.scrapy框架 Spiders文件- Yi_long.py import requests import re import time import jsonclass Yi_long():de ...
- NO.17——应用Scrapy框架实现美女图片的打包下载
一.基础知识 Scrapy是基于Twisted的异步处理框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates ...
- 网络爬虫学习(三)-scrapy框架
目录 一 Scrapy框架简介 二 scrapy框架的基本使用 1) 环境的安装 2)基础命令 3)项目组成: 4)创建爬虫文件: 5)scrapy架构组成 6) 五大核心组件 7)srapy工作 ...
- (Scrapy框架)爬虫获取百度新冠疫情数据 | 爬虫案例
目录 前言 环境部署 插件推荐 爬虫目标 项目创建 webdriver部署 项目代码 Item定义 中间件定义 定义爬虫 pipeline输出结果文本 配置文件改动 验证结果 总结 前言 闲来无聊,写 ...
- Python爬虫scrapy框架的源代码分析
scrapy框架流程图 推荐三个网址:官方1.5版本:https://doc.scrapy.org/en/latest/topics/architecture.html点击打开链接 官方0.24版本( ...
最新文章
- Python基础 模块
- 日历,日期类(copy)
- WCF学习之旅—请求与答复模式和单向模式(十九)
- WebRTC/Chromium在2020年的更新
- WPF 中的 Uri 地址的不同写法
- Yarn管理界面中各个参数和yarn-site.xml中参数的对应关系
- 面试字节跳动Android工程师该怎么准备?深度解析,值得收藏
- android按钮响应事件吗,Android 按钮响应事件的几种方式
- 天融信防火墙重置配置_天融信防火墙配置手册
- java23中设计模式——行为模式——Chain of Responsibility(职责链)
- Unreal Engine 4 —— Ghost Mesh Plugin的开发日志
- 老年人手里有多少积蓄,该不该告诉子女?
- android word编辑图片,Word转换成图片详细教程.doc
- 传奇怎么修改服务器,如何修改传奇服务端路径
- xp计算机用户名和密码忘记了怎么办,xp电脑开机密码忘记了怎么办,xp忘记开机密码的解决方法...
- Java 設計模式 - 適配器模式
- http 301 302 303 307 308 傻傻分不清
- ConvE,知识图谱嵌入(KGE) autodl 服务器运行
- 前端基础知识第四章---CSS
- js实现彩票机选效果