1.Scrapy爬虫框架介绍
Scrapy:功能强大快速的网络爬虫框架,非常优秀的python第三方库,也是基于python实现网络爬虫的重要的技术路线
scrapy不是一个简单的函数功能库,而是一个爬虫框架
Scrapy爬虫框架结构
- 爬虫框架
- 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合
- 爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫
scheduler-调度程序
spiders-蜘蛛
item pipeline-项目管道
engine-引擎
downloader-下载
internet-网络
middleware-中间件
在这5个模块之间,数据包括用户提交的网络爬虫请求、以及从网络上获取的相关内容,在这些结构之间进行流动,形成了数据流。
- Scrapy框架包含三条主要的数据流路径:
- 第一条路径:从SPIDERS模块经过ENGINE到达SCHEDULER,其中ENGINE从SPIDERS的地方获取了爬取用户的请求,请求通过SPIDERS到达ENGINE之后,ENGINE将这个爬取请求转发给了SCHEDULER模块,SCHEDULER模块负责对爬取请求进行调度
- 第二条路径:是从SCHEDULER模块通过ENGINE模块到达DOWNLOADER模块,并且最终数据返回到SPIDERS模块。
ENGINE模块从SCHEDULER获得下一个要爬取的网络请求,这个时候的网络请求是真实的,要去网络上爬取的网络请求,ENGINE获得这样的请求之后,通过中间件发送给DOWNLOADER模块,DOWNLOADER模块拿到这样的请求之后,真实的连接互联网,并且爬取相关的网页,爬取到网页之后,DOWNLOADER模块将爬取的内容形成一个对象,这个对象叫响应,叫response,将所有的内容封装成一个response之后,将这个响应再通过中间件、ENGINE,最终发送给SPIDERS,应该说,在这条路径中,一个真实的,爬取url的请求,经过SCHEDULER、DOWNLOADER,最终返回了相关内容到达了SPIDERS - 第三条路径:是从SPIDERS模块,经过ENGINE模块,到达ITEM PIPELINES模块以及SCHEDULER模块
首先SPIDERS处理从DOWNLOADER获得的响应,也就是从网络中爬取的相关内容,处理之后产生了两个数据类型,一个数据类型叫做爬取项(scraped item),我们也叫他item,另外的一个数据类型,是新的爬取请求,也就是说我们从网络上获得一个网页之后,如果这个网页中有其他链接,也是我们十分感兴趣的,可以在SPIDERS中增加相关的功能,对新的链接发起再次的爬取,SPIDERS生成这两个数据类型之后,将他们发送给ENGINE模块,ENGINE模块收到了两类数据之后,将其中的item发送给ITEM PIPELINES,将其中的requests发送给SCHEDULER进行调度,从而为后期的数据处理以及再次请求网络爬虫提供了新的数据来源
在这个路径之中,ENGINE控制着各个模块的数据流,并且他不断的从SCHEDULER获得真实要爬取的请求,将这个请求发送给DOWNLOADER
整个框架的执行是从向ENGINE发送第一个请求开始,到获得所有链接的内容,并将内容处理后放到ITEM PIPELINES为止,框架的入口是SPIDERS,框架的出口是ITEM PIPELINES
ENGINE、SCHEDULER、DOWNLOADER都是已有的功能实现,用户不需要编写它,它们会按照既定的功能去完成他的任务,用户需要去编写(配置)的是SPIDERS模块和ITEM PIPELINES模块,其中SPIDERS模块用来向整个框架提供要访问的url链接,同时要解析从网络上获得的页面的内容,而ITEM PIPELINES模块负责对提取的信息进行后处理。
2.Scrapy爬虫框架解析
Engine
整个框架的核心,它控制所有模块之间的数据流,任何模块和模块之间的数据流动,都需要经过ENGINE模块的调度,同时,它根据各个模块提供的事件进行触发
- 控制所有模块之间的数据流
- 根据条件触发事件
- 不需要用户修改
Downloader
根据用户提供的请求下载网页,功能比较单一,只是获得一个请求,并且向网络中提交这个请求,最终获得返回的相关内容
- 根据请求下载网页
- 不需要用户修改
Schedular
- 对所有的爬取请求进行调度管理,请求的先后访问由Schedular调度
- 不需要用户修改
Downloader Middleware
- 目的:实现对Engine、Scheduler和Downloader三个模块之间的数据流进行用户可配置的控制
- 功能:用户可以通过这个中间件的编写来修改、丢弃、新增向网络访问的请求或网络返回的响应
- 用户可以编写配置代码
例如:编写代码在Downloader Middleware中,将访问百度的请求拦截下来更改为访问雅虎的请求
一般的使用不需要对requests或response进行修改时,可以不更改
Spiders
它向整个框架提供了最初始的访问链接,同时对每次爬取回来的内容进行解析,再次产生新的爬取请求,并且从内容中分析出提取出相关的数据
- 解析Downloader返回的用户响应(Response)
- 产生爬取项(scraped item)
- 产生额外的爬取请求(Request)
- 需要用户编写配置代码
Item Pipelines
以流水线方式处理Spider产生的爬取项,由一组操作顺序组成,类似流水线,每组操作对item进行一个处理,每个操作是一个Item Pipeline类型。
用户需要关心的是,对于从网页中提取出来的信息这些以ITEM封装的信息,用户需要怎么做。尤其是希望将数据储存到数据库里还是希望经过简单的清洗运用到什么地方,就要在 Item Pipelines模块中实现
-
可能操作包括:
-
对item的内容进行清理
-
检验和查重爬取项中的HTML数据
-
将数据存储到数据库
-
甚至在流水线前面的功能模块,可以去掉item的后续操作。
Spider Middleware
在Spider和Engine之间
- 目的:对spider产生的请求以及爬取项进行再处理的一个操作
- 功能:修改、丢弃、新增请求或爬取项
- 用户可以编写配置代码
框架中的5个模块形成了既定的功能,重点编写的是SPIDERS模块和ITEM PIPELINES模块,为了操作其中的数据流,对数据流进行一定的控制,可以通过两个中间件对其中的request、response和item做一定的操作
3.requests库和Scrapy爬虫的比较
- 相同点:
- 两者都可以进行页面请求和爬取,他们形成了Python爬虫的两个重要技术路线。
- 两者可用性都好,文档丰富,入门简单
- 两者都没有处理js、提交表单、应对验证码等功能(可扩展)
- 不同点:
选用哪个技术路线开发爬虫
- 非常小的需求,requests库
- 不太小的需求,Scrapy框架,例如:持续的或者不间断的或者周期性的爬取一个网站的信息,并且对数据的信息,希望积累,形成自己的爬取库,这种情况建议使用Scrapy框架
- 定制程度很高的需求(不考虑规模),自搭框架,requests>Scrapy
4.Scrapy爬虫的常用命令
Scrapy命令行
Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行。Scrapy建立运行爬虫都是通过命令行实现的。
Scrapy常用命令
最常用的是:
- startproject
- genspider
- crawl
为什么Scrapy采用命令行创建和运行爬虫?
- 命令行(不是图形界面)更容易自动化,适合脚本控制。
- 本质上,Scrapy是给程序员用的,功能(而不是界面)更重要
对爬虫的控制与访问和对数据的操作变得更加的灵活