首页 > 编程语言 >《Python从入门到实战》-源码篇-Scrapy

《Python从入门到实战》-源码篇-Scrapy

时间:2023-09-15 17:24:45浏览次数:53  
标签:Python 爬虫 Scrapy 引擎 模块 源码 下载 scrapy

什么是 Scrapy?
Python 写的开源爬虫框架,快速、简单的方式构建爬虫,从网站上提取你所需要的数据。

  1. 优点:
    功能非常强大的爬虫框架,不仅能便捷地构建request,还有强大的selector能够方便地解析response,最受欢迎的还是它的性能,既抓取和解析的速度,它的downloader是多线程的,request是异步调度和处理的。这两点使它的爬取速度非常之快。另外还有内置的logging,exception,shell等模块,为爬取工作带来了很多便利。

  2. 缺点:
    scrapy是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程, twisted的方式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取100个网站,并发及分布式处理方面,不够灵活,不便调整与括展。

如何安装和使用的问题,请参考 官方网站https://scrapy.org/ 学习,源码地址:https://github.com/scrapy/scrapy

Scrapy有什么作用?
用于数据挖掘、监测和自动化测试。

资料:https://xie.infoq.cn/article/f3505fba11fe9f9615cacc6f6

为什么有这篇文章?业界很多开源的爬虫框架都是模仿和参考 Scrapy 的思想和架构实现的,如果想深入学习爬虫,研读 Scrapy 的源码还是很有必要的。

架构概览

介绍一下 Scrapy 的整体架构,从宏观层面上学习一下 Scrapy 运行的流程。

使用 Scrapy 开发一个爬虫非常简单,只需以下几步:

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

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

Scrapy 到底是如何帮助我们工作的呢?

架构

image

Scrapy 主要包含以下五大核心模块:

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

观察仔细还可以看到还有2个模块:

  1. Downloader middlewares:介于引擎和下载器之间,可以在网页在下载前、后进行逻辑处理;
  2. Spider middlewares:介于引擎和爬虫之间,在向爬虫输入下载结果前,和爬虫输出请求 / 数据后进行逻辑处理;

运行流程

Scrapy 内部采集流程是如何流转的?各个模块是如何交互协作,来完成整个抓取任务?

Scrapy 运行时的数据流转大概是这样的:

  1. 引擎从自定义爬虫中获取初始化请求(也叫种子 URL);
  2. 引擎把该请求放入调度器中,同时调度器向引擎获取待下载的请求;
  3. 调度器把待下载的请求发给引擎;
  4. 引擎发送请求给下载器,中间会经过一系列下载器中间件;
  5. 这个请求通过下载器下载完成后,生成一个响应对象,返回给引擎,这中间会再次经过一系列下载器中间件;
  6. 引擎接收到下载器返回的响应后,发送给爬虫,中间会经过一系列爬虫中间件,最后执行爬虫自定义的解析逻辑;
  7. 爬虫执行完自定义的解析逻辑后,生成结果对象或新的请求对象给引擎,再次经过一系列爬虫中间件;
  8. 引擎把爬虫返回的结果对象交由结果处理器处理,把新的请求通过引擎再交给调度器;
  9. 重复执行 1-8,直到调度器中没有新的请求处理,任务结束;

核心模块交互图:

(图中 Scrapyer 模块,也是 Scrapy 的一个核心模块,但官方的架构图没有展示出来。这个模块其实是处于 Engine、Spiders、Pipeline 之间,是连接这 3 个模块的桥梁)

核心类图

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

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

Scrapy 涉及到的组件主要包括以下这些:
五大核心类: Scrapy Engine、Scheduler、Downloader、Spiders、Item Pipeline;
四个中间件管理器类:DownloaderMiddlewareManager、SpiderMiddlewareManager、ItemPipelineMiddlewareManager、ExtensionManager;
其他辅助类:Request、Response、Selector;

标签:Python,爬虫,Scrapy,引擎,模块,源码,下载,scrapy
From: https://www.cnblogs.com/yuanbaobao/p/17705519.html

相关文章

  • Qemu源码分析(2)—Apple的学习笔记
    一,前言最近从main开始看了opt参数相关的解析,这个比较简单我就不写了,然后当时我搞不清楚的是MachineClass和TypeImpl类的关系。本节主要分析的其实就是分析machine_class怎么来的,其实也就是machine_class=select_machine();二,源码分析关于mc的来历type_initialize中ti->class->ty......
  • 用源码创建虚拟资源加密平台,扫码支付获取资源
    大家都知道,八图片是一个可以对图片或网址进行二维码加密的网络平台,很多人利用这个平台的加密功能,自动化的出售虚拟产品。你可以将任何资源或产品隐藏在加密地址的后面,让用户扫码支付后获取。这个网站不仅提供了加密的功能,还提供了一套简化版的源码,可以利用这个源码,搭建一个一模一......
  • windows系统安装Python环境
    Python在此次AI浪潮中,被广泛使用,所以我们搭建一下Python的运行环境现在我安装的是Python1.10版本,没有使用最新版,是因为某些Python库不支持高版本Windows系统前往Python官网,直接下载安装程序https://www.python.org/downloads/windows/安装过程就是直接下一步,就能成功,记得勾选添......
  • Python爬虫如何使用代理IP进行抓取
    前言Python爬虫是一种非常强大的工具,可以用于抓取各种网站的数据。但是,在一些情况下,我们需要使用代理IP来完成数据抓取,如绕过IP限制或保护隐私信息等。本文将介绍如何使用Python爬虫抓取数据时使用代理IP,并提供示例代码和注意事项。一、什么是代理IP代理IP是一种充当客户端和服务器......
  • python中'\n'与'r'的区别和使用习惯
    在Python中,'\n'和'\r'是两个特殊的转义字符,它们用于控制字符串中的换行和回车行为。它们有不同的含义和用途:'\n'(换行符):'\n'表示换行,在字符串中使用它会将光标移动到下一行的行首。通常用于在文本中创建新的行或在输出中添加换行符,以使文本更易于阅读。示例:print("这是第一行\n这是......
  • DBeaver连接国产数据库OceanBase,以及Python连接,解决ModuleNotFoundError: No module n
    DBeaver连接OceanBase参考:https://www.modb.pro/db/365929用户名的格式为:数据库用户名@租户名#集群名 Python连接OceanBase参考:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000033288pip3installJayDeBeApi会自动下载JayDeBeApi和JPype1两个......
  • 基于python+selenium的自动批量添加
    场景点击添加”新增“按钮,弹出”新增对话框“,输入各种数据,然后点击”确定“按钮,如此循环。数量多,这样操作累人。seleniumSelenium是一个用于自动化Web浏览器操作的库,可以实现模拟点击、输入文本等操作。代码实现#!/usr/bin/envpython3#-*-coding:utf-8-*-fromsel......
  • pip国内镜像源-Python安装第三方库
    众所周知,在没有配置第三方库的时候,使用pip或者conda安装包的时候,会直接指向Python官网,由于服务器在国外,下载速度会很慢,因此,大多数情况下会选择国内的镜像源网址来提升安装第三方库的速度。1.8个国内镜像源以下是中国常见的pip镜像源,按照完全度和下载速度排序,需要注意的是,镜像源......
  • 【Python&GIS】解决GIS属性表、矢量字段乱码,中文乱码
    ​    我们平时在使用代码处理矢量数据时,可能会出现矢量字段出现乱码的情况。同样有什么打开别人发的矢量文件有可能也会出现这种情况。那么我们该如何解决这个问题,让我们属性表中的中文字符正常显示呢?今天就和大家一起分享一下。1.原因        ArcGIS10.2之......
  • 每日一练:无感刷新页面(附可运行的前后端源码,前端vue,后端node)
    1、前言想象下,你正常在网页上浏览页面。突然弹出一个窗口,告诉你登录失效,跳回了登录页面,让你重新登录。你是不是很恼火。这时候无感刷新的作用就体现出来了。2、方案2.1redis设置过期时间在最新的技术当中,token一般都是在Redis服务器存着,设置过期时间。只要在有效时间内,重新发......