首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scrapy源码(1)——爬虫流程概览

前言

使用已经有一段时间了,觉得自己有必要对源码好好的学习下了,所以写下记录,希望能加深自己的理解。

Scrapy A Fast and Powerful Scraping and Web Crawling Framework

接下来说到的是最新版本: Scrapy 1.5,暂且把称为蜘蛛,而不是爬虫。

介绍

Scrapy是一个开源爬虫框架,用于抓取网站并提取有用的结构化数据,如数据挖掘,信息处理或历史档案。

尽管Scrapy最初是为网页抓取设计的,但它也可以用于使用API(如Amazon Associates Web Services)或作为通用网络抓取工具提取数据。

一个最简单的例子,相信大家都写过

一般来说,创建一个Scrapy项目需要如下流程:

使用创建爬虫模板

爬虫类继承,重写方法和逻辑

方法中或字典、、

自定义、、等

使用或新建文件运行(便于调试)

其它

架构概述

这是一张非常经典的图,基本上说到Scrapy都会用到它,来源于Architecture overview

核心组件(Components)

引擎,负责控制系统所有组件之间的数据流,并在发生某些操作时触发事件;

调度器,接收来自引擎的请求,并将它们排入队列,以便在引擎请求它们时将它们提供给它们(也提供给引擎);

下载器,负责从网络上获取网页并将它们返回到引擎,然后引擎将它们返回给蜘蛛/spiders;

蜘蛛,是用户编写的自定义类,用于解析响应并从中提取项目(也称为抓取的项目)或追加其他请求;

管道,负责输出结构化数据,可自定义输出位置,典型的任务包括清理,验证和持久性;

下载中间件,位于引擎和下载器之间的特定钩子/hooks,当它们从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应,常用于如下情况:

在将请求发送到下载器之前处理请求(即在Scrapy将请求发送到网站之前);

在将其传递给蜘蛛之前改变接收到的响应;

发送新的请求,而不是将接收到的响应传递给蜘蛛;

向蜘蛛传递响应而不需要获取网页;

默默地放下一些请求。

Spider中间件,特定的钩子,位于引擎和蜘蛛之间,能够处理蜘蛛输入(响应)和输出(项目和请求),常用于如下情况:

spider回调的后处理输出 更改/添加/删除请求或items;

后处理start_requests;

处理蜘蛛异常;

根据响应内容为一些请求调用errback而不是callback。

事件驱动的网络,Scrapy是用Twisted编写的,这是一个流行的事件驱动的Python网络框架。 因此,它使用非阻塞(又称异步)代码来实现并发。

Twisted is an event-driven networking engine written in Python and licensed under the open source MIT license.

数据流(Data flow)

Scrapy中的数据流由执行引擎控制,如下所示:

引擎获取最初的请求从蜘蛛抓取()。

引擎在调度程序中调度请求,并要求下一个请求进行采集。

调度器将下一个请求返回给引擎。

引擎将请求发送到下载器,通过下载器中间件。

一旦页面完成下载,会生成一个响应(包含该页面)并将其发送到引擎,并通过。

引擎从收到响应并将其发送给进行处理,并通过传递。

处理响应,并通过中间件将抓取的项目和新的请求(后续)返回给引擎。

引擎将处理后的项目发送到项目管道,然后将处理后的请求发送到调度程序,并要求可能的下一个请求进行采集。

该过程重复(从第1步开始),直到调度器没有更多请求。

找到一张图,便于理解:

第一期差不多就到这了,没有说很多代码,主要是宏观上来观察的架构,是如何运行。之后会更多的查看Scrapy的源代码,就近是如何采集数据的。

(内心有点小恐慌,不知道会写成什么样子。)

补充

关于如何阅读项目源代码,找到一篇不错的文章,共享:如何阅读开源项目

主要是这几部分:

看:静态对代码进行分析,看相关资料,代码逻辑。

跑:将项目在IDE里面跑起来,通过IDE调试参数,加Log等。

查:阅读过程中肯定会遇到不懂的,这时候需要通过搜索引擎来解决你的疑惑。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180224G176OV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券