Scrapy 源码分析 1 架构概览

1 Scrapy 简介

使用Scrapy的版本为 2.5.0

使用 Scrapy 开发一个爬虫非常简单,这里使用 Scrapy 的例子来说明如何编写一个简单爬虫:

import scrapy

class IfengSpider(scrapy.Spider):
    name = 'ifeng'
    allowed_domains = ['ifeng.com']
    start_urls = ['https://ifeng.com/']

    def parse(self, response, **kwargs):
        requests = response.follow_all(xpath='//ul[@id="nav"]/li/a/@href')
        print(list(requests))
        for row in response.xpath('//ul[@id="nav"]/li/a/@href').extract():
            yield {
                "url": row,
            }
        pass

简单来讲,编写和运行一个爬虫只需以下几步:

  1. 使用 scrapy startproject 命令创建一个爬虫模板,或自己按模板编写爬虫代码
  2. 定义一个爬虫类,并继承 scrapy.Spider,然后重写 parse 方法
  3. parse 方法里编写网页解析逻辑,以及抓取路径
  4. 使用 scrapy runspider <spider_file.py></spider_file.py> 运行这个爬虫

可见,使用 Scrapy 编写简单的几行代码,就能采集到一个网站页面的数据,非常方便。

但是在这背后到底发生了什么?Scrapy 到底是如何帮助我们工作的呢?

2 架构

要想知道 Scrapy 是如何工作的,首先我们来看一下 Scrapy 的架构图,从宏观角度来了解一下它是如何运行的:

Scrapy 源码分析 1 架构概览

从架构图可以看到,Scrapy 主要包含以下五大模块:

  • Scrapy Engine:核心引擎,负责控制和调度各个组件,保证数据流转;
  • Scheduler:负责管理任务、过滤任务、输出任务的调度器,存储、去重任务都在此控制;
  • Downloader:下载器,负责在网络上下载数据,输入待下载的 URL,输出下载结果;
  • Spiders:我们自己编写的爬虫逻辑,定义抓取意图;
  • Item Pipeline:负责输出结构化数据,可自定义格式和输出的位置;

如果你观察地比较仔细的话,可以看到还有两个模块:

  • Downloader middlewares:介于引擎和下载器之间,可以在网页在下载前、后进行逻辑处理;
  • Spider middlewares:介于引擎和爬虫之间,在向爬虫输入下载结果前,和爬虫输出请求 / 数据后进行逻辑处理;
  • Extensions : 处于整个流程当中,主要提供一些辅助和状态统计;

了解了这些核心模块,我们再来看使用 Scrapy 时,它内部的采集流程是如何流转的,也就是说各个模块是如何交互协作,来完成整个抓取任务的。

3 核心模块的协作

可见,Scrapy 的架构图还是比较清晰的,各个模块之间互相协作,完成抓取任务。

我在读完它的源码后,整理出了一个更详细的核心模块交互图,其中展示了更多模块的相关细节,你可以参考一下:

Scrapy 源码分析 1 架构概览

4 核心类图

Scrapy 源码分析 1 架构概览

对于这个核心类图简单解释一下:

  • 没有样式的黑色文字是类的核心属性;
  • 标有黄色样式的高亮文字是类的核心方法;

你在读源码的过程中,可以针对这些核心属性和方法重点关注。

结合官方架构图以及我总结的核心模块交互图、核心类图,我们可以看到,Scrapy 涉及到的组件主要包括以下这些。

  • 五大核心类: Scrapy EngineSchedulerDownloaderSpiders&#x3001;Item Pipeline
  • 四个中间件管理器类: DownloaderMiddlewareManagerSpiderMiddlewareManagerItemPipelineMiddlewareManagerExtensionManager
  • 其他辅助类: RequestResponseSelector

我们先对 Scrapy 整个架构有一个初步认识,在接下来的文章里,我会针对上述的这些类和方法进行更加详细的源码讲解。

Original: https://blog.csdn.net/u010154424/article/details/123652034
Author: ?????
Title: Scrapy 源码分析 1 架构概览

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/792898/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球