Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法
Spider有以下属性:
| name | 爬虫名称,定义Spider名字的字符串,必须是唯一的。常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字命名为baidu |
| allowed_domains | 允许爬取的域名,是可选配置,不在此范围的链接不会被跟进爬取。 |
| start_urls |
起始URL列表。如果没有实现start_requests()方法,默认会从这个列表开始爬取。 |
| custom_settings | 这是一个字典,是专属于Spider的配置。它会覆盖项目全局的设置。此设置必须在初始化前被更新,必须定义成类变量。 |
| crawler | 由from_crawler()方法设置的,代表的是本Spider类对应的Crawler对象。Crawler包含了很多项目组件,如Settings,利用它可以获取项目的一些配置信息。 |
| settings | 它是一个Settings对象,利用它我们可以直接获取项目的全局设置变量。 |
| start_requests() | 此方法用于生成初始请求,它必须返回一个可迭代对象。此方法会默认使用start_urls里面的URL来构造Request,而且Request是Get请求方式,如果我们想在启动时以POST方式访问某个站点,可以直接重写这个方法,发送POST请求使用FormRequest即可。 |
| parse() | 当Response没有指定回调函数时,该方法默认会被调用。它负责处理Response,处理返回结果,并从中提取出想要的数据和下一步的请求。然后返回。该方法需要返回一个包含Request或Item的可迭代对象。 |
| closed() | 当Spider关闭时,该方法会被调用,在这里一般会定义释放资源的一些操作或其他收尾操作。 |
Downloader Middleware即下载中间件,它是处于Scrapy的Request和Response之间的处理模块。Downloader的作用有两个:1.在Scheduler发送Request给Downloader之前修改Request。2。在Response发送给Spider之前对其进行修改。
Scrapy已经内置了许多Downloader Middleware,如果想要添加自己定义的Downloader Middleware,需要在Settings.py中将DOWNLOADER_MIDDLEWARES部分取消注释,修改为自己想要添加的Downloader Middleware,冒号后的数字即优先级,数字越小优先级越高。
Downloader Middleware有三个核心方法:
- process_request(request,spider)
- process_response(request,response,spider)
- process_exception(request,exception,spider)
至少需要实现其中的一个方法才可以定义自己的Downloader Middleware。接下来介绍这三个方法:
Request被Engine发送给Downloader之前,process_request()方法会被调用,返回值为None,Response对象、Request对象之一,或者抛出IgnoreRequest异常。
| 返回None | 调用优先级更低的Downloader Middleware的process_request()方法进行处理 |
| 返回Response | 依次调用所有的Downloader Middleware的process_response()方法进行处理 |
| 返回Request | 返回值进入Scheduler调度队列直到下一次被调度 |
| 抛出异常 | 依次调用所有的Downloader Middleware的process_exception()方法进行处理 |
Downloader 在执行下载之后,会得到对应的Response,Engine会把Response发送给Spider进行解析之前,process_response()方法会被调用,返回值为Request对象、Response对象之一,或者抛出IgnoreRequest异常。
| 返回Request | 返回值进入Scheduler调度队列直到下一次被调度 |
| 返回Response | 调用优先级更低的Downloader Middleware的process_response()方法进行处理 |
| 抛出异常 | Request的errorback()方法回调,若该异常仍未被处理,那么它会被忽略。 |
当Downloader或process_request()方法抛出异常时,process_exception()方法会被调用,返回值为None,Response对象、Request对象之一。
| 返回None | 调用优先级更低的Downloader Middleware的process_exception()方法进行处理 |
| 返回Response | 依次调用所有的Downloader Middleware的process_response()方法进行处理 |
| 返回Request | 返回值进入Scheduler调度队列直到下一次被调度 |
Spider Middleware是介入到Scrapy的Spider处理机制的钩子框架。Spider Middleware有以下3个作用:1.在Downloader发送Response给Spider之前对其进行处理。2.在Spider发送Request给Scheduler之前对其进行处理。3.在Spider发送Item给Item Pipeline之前对其进行处理。
跟Downloader Middleware一样,Scrapy已经内置了许多Spider Middleware,如果想要添加自己定义的Spider Middleware,需要在Settings.py中将SPIDER_MIDDLEWARES部分取消注释,修改为自己想要添加的Spider Middleware。
Spider Middleware有以下4个核心方法:
- process_spider_input(response,spider)
- process_spider_ouput(response,result,spider)
- process_spider_exception(response,exception,spider)
- process_start_requests(start_requests,spider)
至少需要实现其中的一个方法才可以定义自己的Spider Middleware。接下来介绍这四个方法:
当Downloader发送Response给Spider解析时,process_spider_input()方法被调用,返回值为None或者抛出一个异常。
| 返回None | 调用优先级更低的Spider Middleware的process_spider_input()方法进行处理 |
| 抛出异常 | 调用Request的errback()方法,errback()的输出将会重新输入到中间件中,使用process_spider_output()方法来处理,若抛出异常则调用process_spider_exception()处理 |
当Spider发送Item给Item Pipeline时,process_spider_ouput()方法被调用,返回值为Request或Item对象的可迭代对象。
当Spider或process_spider_input()方法抛出异常时,process_spider_exception()方法被调用,返回值为None或包含Response或Item对象的可迭代对象。
| 返回None | 调用优先级更低的Spider Middleware的process_spider_exception()方法进行处理 |
| 返回一个可迭代对象 | 依次调用所有的Spider Middleware的process_spider_ouput()方法进行处理 |
process_start_requesrs()方法以Spider启动的Request为参数被调用,返回一个包含Request对象的可迭代对象。
当Spider解析完Response后,会new一个Item对象发送到Item Pipeline。Item Pipeline的作用有:
- 清理HTML数据
- 验证爬取数据,检查爬取字段
- 查重并丢弃重复内容
- 将爬取结果保存到数据库
若要自定义Item Pipeline ,必须实现Item Pipeline的process_item(item,spider)方法。下面介绍Item Pipeline的常用方法:
process_item(item,spider)
process_item(item,spider)是必须实现的方法,Item Pipeline默认调用该方法对Item进行处理,返回值为Item对象或者抛出DropItem异常。
| 返回Item | 调用优先级更低的Item Pipeline的process_item(item,spider)方法进行处理 |
| 抛出异常 | 丢弃该Item,不进行处理 |
open_spider(self,spider)
open_spider(self,spider)在Spider开启时自动调用,可以在这里进行一些初始化操作。
close_spider(spider)
close_spider(spider)Spider关闭时自动调用,可以在这里进行收尾操作。
from_crawler(cls,crawler)
from_crawler(cls,crawler)是一个类方法,用@classmethod进行标识,它的参数是crawler,通过它可以拿到Scrapy的所有核心组件,然后创建一个Pipeline实例。参数cls就是Class,最后返回一个Class类型。
Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法的更多相关文章
- 自己的Scrapy框架学习之路
开始自己的Scrapy 框架学习之路. 一.Scrapy安装介绍 参考网上资料,先进行安装 使用pip来安装Scrapy 在开始菜单打开cmd命令行窗口执行如下命令即可 pip install Scr ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- scrapy框架学习之路
一.基础学习 - scrapy框架 介绍:大而全的爬虫组件. 安装: - Win: 下载:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip3 ...
- Scrapy框架学习笔记
1.Scrapy简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网 ...
- Scrapy框架学习(一)Scrapy框架介绍
Scrapy框架的架构图如上. Scrapy中的数据流由引擎控制,数据流的过程如下: 1.Engine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要爬取得URL. 2.En ...
- scrapy框架学习
一.初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网 ...
- Scrapy 框架 (学习笔记-1)
环境: 1.windows 10 2.Python 3.7 3.Scrapy 1.7.3 4.mysql 5.5.53 一.Scrapy 安装 1. Scrapy:是一套基于Twisted的一部处理框 ...
- Scrapy框架学习 - 使用内置的ImagesPipeline下载图片
需求分析需求:爬取斗鱼主播图片,并下载到本地 思路: 使用Fiddler抓包工具,抓取斗鱼手机APP中的接口使用Scrapy框架的ImagesPipeline实现图片下载ImagesPipeline实 ...
- Scrapy框架学习(四)爬取360摄影美图
我们要爬取的网站为http://image.so.com/z?ch=photography,打开开发者工具,页面往下拉,观察到出现了如图所示Ajax请求, 其中list就是图片的详细信息,接着观察到每 ...
随机推荐
- RobotFramework中查询数据库相关
先要安装:robotframework-databaselibrary,并导入RIDE 封装“连接数据库”关键字,内容如下: 断开数据库:Disconnect From Database,没有参数 一 ...
- json 登陆协议分析
登录方式有两种:1)用户名密码登陆,code 为 5401 (2) IMSI和TOKEN 登陆, code 为93 POST /tcpbus/mobile HTTP/1.1Host: clientac ...
- nginx uwsgi flask相关配置
一.安装Nginx 在 /home/download下下载压缩包 wget https://nginx.org/download/nginx-1.12.2.tar.gz 解压缩 tar zxvf ng ...
- c# webbrowser在xp下自动闪退的一个坑
接前面的做了个扫码登录的,但是使用中发现在win7下没有题,但是在xp中使用时在加载那个二维码时会导致直接闪退,还无法捕捉到错误,折腾了一下午无果. 今天早上来看贴子有人说可能是webbrowser中 ...
- hdu 1542/1255 Atlantis/覆盖的面积
1542 1255 两道扫描线+线段树的入门题. 基本没有什么区别,前者是模板,后者因为是求覆盖次数至少在两次以上的,这个同样是具有并集性质的,所以把cover的判断条件更改一下就可以了qwq. hd ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- “全栈2019”Java第五十六章:多态与字段详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第四十九章:重载与重写对比详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 洛谷P5264 【模板】多项式三角函数
题面 传送门 题解 据说有一个叫做欧拉公式的东西 \[e^{ix}=\cos(x)+i\sin(x)\] 别问我为啥我今天第一次看到它 那么显然也有 \[e^{-ix}=\cos(x)-i\sin(x ...
- linux下发邮件
一. ubuntu中使用第三方mail 用qq地址有安全问题,可能是我的qq设置了安全限制,使用163邮箱可以 1. 安装个软件 apt-get install heirloom-mailx 2. 改 ...