爬虫课堂(十六)|Scrapy框架结构及工作原理

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services)或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

一、Scrapy框架组件介绍

在介绍Scrapy的工作原理之前,我们简单了解下Scrapy框架中的各个组件。如下图16-1所示。

图16-1

Scrapy框架主要由六大组件组成,它们分别是调试器(Scheduler)、下载器(Downloader)、爬虫(Spider)、中间件(Middleware)、实体管道(Item Pipeline)和Scrapy引擎(Scrapy Engine)。

1.1、调度器(Scheduler)

调度器,负责对Spider提交的下载请求进行调度。说白了可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是什么,同时去除重复的网址(不做无用功)。用户可以跟据自己的需求定制调度器。

1.2、下载器(Downloader)

下载器,负责下载页面(发送HTTP请求/接收HTTP响应)。是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。

1.3、爬虫(Spider)

爬虫,负责提取页面中数据,并产生对新页面的下载请求。是用户最关心的部份,也是由用户自己实现。用户定制自己的爬虫,用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。

1.4、中间件(Middleware)

中间件,负责对Request对象和Response对象进行处理。如上图16-1所示,Scrapy框架中有两种中间件:爬虫中间件(Spider Middleware)和下载器中间件(Downloader Middleware)。

爬虫中间件是介入到Scrapy的Spider处理机制的钩子框架,可以添加代码来处理发送给Spiders的Response及Spider产生的Item和Request。

下载器中间件是介于Scrapy的Request/Response处理的钩子框架,是用于全局修改Scrapy Request和Response的一个轻量、底层的系统。

1.5、实体管道(Item Pipeline)

实体管道,用于处理爬虫提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。

1.6、Scrapy引擎(Scrapy Engine)

Scrapy引擎是整个框架的核心。它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。

二、Scrapy运行流程

1)当爬虫(Spider)要爬取某URL地址的页面时,使用该URL初始化Request对象提交给引擎(Scrapy Engine),并设置回调函数。 

Spider中初始的Request是通过调用start_requests() 来获取的。start_requests() 读取start_urls 中的URL,并以parse为回调函数生成Request 。

2)Request对象进入调度器(Scheduler)按某种算法进行排队,之后的每个时刻调度器将其出列,送往下载器。

3)下载器(Downloader)根据Request对象中的URL地址发送一次HTTP请求到网络服务器把资源下载下来,并封装成应答包(Response)。

4)应答包Response对象最终会被递送给爬虫(Spider)的页面解析函数进行处理。

5)若是解析出实体(Item),则交给实体管道(Item Pipeline)进行进一步的处理。

由Spider返回的Item将被存到数据库(由某些Item Pipeline处理)或使用Feed exports存入到文件中。

6)若是解析出的是链接(URL),则把URL交给调度器(Scheduler)等待抓取。

以上就是Scrapy框架的运行流程,也就是它的工作原理。Request和Response对象是血液,Item是代谢产物。

三、Spiders

在所有的组件中,爬虫(Spider)组件对于用户来说是最核心的组件,完全由用户自己开发。Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取Item)。 换句话说,Spider就是我们定义爬取的动作及分析某个网页(或者是有些网页)的地方。

从Spider的角度来看,爬取的运行流程如下循环:

1)以初始的URL初始化Request,并设置回调函数。 当该Request下载完毕并返回时,将生成Response,并作为参数传给该回调函数。

2)在回调函数内分析返回的(网页)内容,返回 Item 对象或者 Request 或者一个包括二者的可迭代容器。返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。

3)在回调函数内,可以使用选择器(Selectors) 来分析网页内容,并根据分析的数据生成Item。

4)最后,由Spider返回的Item将被存到数据库或存入到文件中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云中间件团队的专栏

Raft 算法原理及其在 CMQ 中的应用(上)

Raft 算法是一种分布式一致性算法。与 paxos 相比,它更易理解和工程化。我们完整实现了该算法并将其应用在自研的高可靠消息中间件 CMQ 中,同时沉淀出对...

2K0
来自专栏Linyb极客之路

如何使zuul支持websocket

公司要把以前一个老的项目通过zuul来路由装发(ps:老项目作为微服务中的一个子服务),而这个老项目里面有用到websocket消息推送,然而不幸的是zuul1...

1.2K4
来自专栏小怪聊职场

爬虫课程(九)|豆瓣:Scrapy中items设计及如何把item传给Item Pipeline

3275
来自专栏Jack-Cui

Python3网络爬虫(五):Python3安装Scrapy

运行平台:Windows Python版本:Python3.x IDE:Sublime text3 一、Scrapy简介     Scrapy是一个为...

3070
来自专栏Python攻城狮

UDP-用户数据报协议1.介绍2.udp网络程序-发送数据udp网络程序-发送、接收数据echo服务器广播用代码给飞秋发信息收消息_没绑定端口号收消息_绑定端口多线程聊天

UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能...

1534
来自专栏OCR PHP 求助

PHP OCR 营业执照 识别

2727
来自专栏Java与Android技术栈

基于Vert.x和RxJava 2构建通用的爬虫框架

最近由于业务需要监控一些数据,虽然市面上有很多优秀的爬虫框架,但是我仍然打算从头开始实现一套完整的爬虫框架。

1273
来自专栏北京马哥教育

Python分布式爬虫详解(一)

当项目上升到一定境界时候,需要同时抓取几百个甚至上千个网站,这个时候,单个的爬虫已经满足不了需求。比如我们日常用的百度,它每天都会爬取大量的网站,一台服务器肯定...

1543
来自专栏程序员的碎碎念

适合存储大量爬虫数据的数据库,了解一下?

今天这个坑可能以后你也会遇到, 随着爬取数据量的增加, 以及爬取的网站数据字段的变化, 以往在爬虫入门时使用的方法局限性可能会骤增.

3503
来自专栏Coding01

推荐一个 PHP 管道插件 League\Pipeline

水管太长,只要有一处破了,就会漏水了,而且不利于复杂环境弯曲转折使用。所以我们都会把水管分成很短的一节一节管道,然后最大化的让管道大小作用不同,因地制宜,组装在...

893

扫码关注云+社区

领取腾讯云代金券