Scrapy爬虫框架

一、Scrapy爬虫框架介绍

Scrapy:功能强大快速的网络爬虫框架,非常优秀的python第三方库,也是基于python实现网络爬虫的重要的技术路线

Scrapy的安装

  pip3 install scrapy

安装后小测:执行scrapy -h

Scrapy爬虫框架

scrapy不是一个简单的函数功能库,而是一个爬虫框架

Scrapy爬虫框架结构

爬虫框架

  爬虫框架是实现爬虫功能的一个软件结构和功能组件集合

  爬虫框架是一个半成品,能够帮助用户实现专业网络爬虫

  Scrapy爬虫框架

在这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进行调度,从而为后期的数据处理以及再次请求网络爬虫提供了新的数据来源

Scrapy爬虫框架

在这个路径之中,ENGINE控制着各个模块的数据流,并且他不断的从SCHEDULER获得真实要爬取的请求,将这个请求发送给DOWNLOADER

整个框架的执行是从向ENGINE发送第一个请求开始,到获得所有链接的内容,并将内容处理后放到ITEM PIPELINES为止,框架的入口是SPIDERS,框架的出口是ITEM PIPELINES

ENGINE、SCHEDULER、DOWNLOADER都是已有的功能实现,用户不需要编写它,它们会按照既定的功能去完成他的任务,用户需要去编写(配置)的是SPIDERS模块和ITEM PIPELINES模块,其中SPIDERS模块用来向整个框架提供要访问的url链接,同时要解析从网络上获得的页面的内容,而ITEM PIPELINES模块负责对提取的信息进行后处理。

 二、Scrapy爬虫框架解析

“5+2”结构:5个主要模块以及两个中间件

ENGINE模块

  整个框架的核心,它控制所有模块之间的数据流,任何模块和模块之间的数据流动,都需要经过ENGINE模块的调度,同时,它根据各个模块提供的事件进行触发

  控制所有模块之间的数据流

  根据条件触发事件

  不需要用户修改

DOWNLOADER模块

  根据用户提供的请求下载网页,功能比较单一,只是获得一个请求,并且向网络中提交这个请求,最终获得返回的相关内容

       根据请求下载网页

  不需要用户修改

SCHEDULER模块

  对所有的爬取请求进行调度管理

  不需要用户修改

Downloader Middleware

  目的:实现对Engine、Scheduler和Downloader三个模块之间的数据流进行用户可配置的控制

  功能:用户可以通过这个中间件的编写来修改、丢弃、新增向网络访问的请求或网络返回的响应

  用户可以编写配置代码

SPIDERS模块

  它向整个框架提供了最初始的访问链接,同时对每次爬取回来的内容进行解析,再次产生新的爬取请求,并且从内容中分析出提取出相关的数据

  解析Downloader返回的用户响应(Response)

  产生爬取项(scraped item)

  产生额外的爬取请求(Request)

  需要用户编写配置代码   

ITEM PIPELINES模块

  以流水线方式处理Spider产生的爬取项

  由一组操作顺序组成,类似流水线,每组操作对item进行一个处理,每个操作是一个Item Pipeline类型

  可能操作包括:对item的内容进行清理、检验和查重爬取项中的HTML数据、将数据存储到数据库,甚至在流水钱前面的功能模块,可以去掉item的后续操作。

  需要用户编写配置代码

Spider Middleware

  目的:对spider产生的请求以及爬取项进行再处理的一个操作

  功能:修改、丢弃、新增请求或爬取项

  用户可以编写配置代码

框架中的5个模块形成了既定的功能,重点编写的是SPIDERS模块和ITEM PIPELINES模块,为了操作其中的数据流,对数据流进行一定的控制,可以通过两个中间件对其中的request、response和item做一定的操作

三、requests库和Scrapy爬虫的比较

相同点:

  两者都可以进行页面请求和爬取,他们形成了Python爬虫的两个重要技术路线。

  两者可用性都好,文档丰富,入门简单

  两者都没有处理js、提交表单、应对验证码等功能(可扩展)

不同点:

  Scrapy爬虫框架

选用哪个技术路线开发爬虫

  非常小的需求,requests库

  不太小的需求,Scrapy框架,例如:持续的或者不间断的或者周期性的爬取一个网站的信息,并且对数据的信息,希望积累,形成自己的爬取库,这种情况建议使用Scrapy框架

  定制程度很高的需求(不考虑规模),自搭框架,requests>Scrapy

四、Scrapy爬虫的常用命令

Scrapy命令行

  Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行。

Scrapy命令行格式

  >scrapy<command>[options][args]   注:Scrapy命令在<command>这个区域来体现

Scrapy常用命令

  Scrapy爬虫框架

Scrapy爬虫的命令行逻辑

为什么Scrapy采用命令行创建和运行爬虫?

  命令行(不是图形界面)更容易自动化,适合脚本控制。