【Python从入门到进阶】52、CrawlSpider链接提取器的使用

接上篇《51、电影天堂网站多页面下载实战》
上一篇我们采用Scrapy框架多页面下载的模式来实现电影天堂网站的电影标题及图片抓取。本篇我们来学习基于规则进行跟踪和自动爬取网页数据的“特殊爬虫”CrawlSpider。

一、什么是CrawlSpider?

1、CrawlSpider的概念


CrawlSpider是Scrapy框架中的一个特殊爬虫类型,它主要用于处理需要遵循特定规则和链接提取的网站。通俗地说,CrawlSpider就像一个智能的探险家,它按照我们设定的规则(Rule)在网页上“探险”,自动跟踪链接、提取信息,并将这些信息收集起来供我们使用。

使用CrawlSpider时,我们首先需要定义一组规则,这些规则告诉爬虫如何跟踪链接以及如何提取信息。这些规则可以包括允许跟踪的链接类型、如何跟踪这些链接以及如何从页面中提取所需的信息等。

一旦规则定义好,CrawlSpider就开始工作了。它会根据规则自动跟踪页面中的链接,并根据规则提取器提取的链接规则来决定哪些链接应该被跟踪和爬取。在爬取过程中,CrawlSpider还会自动处理页面中的相对链接和绝对链接,确保能够正确地访问和爬取目标网站的内容。

此外,CrawlSpider还支持增量式爬取,这意味着它可以检测已经爬取过的页面并避免重复爬取,从而提高爬取效率。

举个例子来说明CrawlSpider的工作原理:假设我们想要爬取一个电商网站的商品信息。我们可以使用CrawlSpider来定义一组规则,指定要跟踪的商品详情页链接,以及如何从这些页面中提取商品名称、价格、描述等信息。然后,CrawlSpider会自动跟踪这些链接,按照规则提取信息,并将收集到的商品信息存储起来供我们使用。

2、CrawlSpider的作用

通过CrawlSpider,我们可以轻松实现深度爬取和广度爬取,有效应对复杂网站结构的挑战。

(1)规则化爬取:CrawlSpider通过定义一系列规则(Rule),来指导爬虫如何跟随链接、提取数据。这使得爬虫能够自动化地根据预设规则进行爬取,减少了手动编写复杂逻辑的需求。
(2)深度爬取:通过设置合适的Rule,CrawlSpider可以深入爬取网站的各个层级,确保不遗漏重要信息。这对于需要获取网站完整数据的场景非常有用。
(3)灵活应对网站结构变化:当网站结构发生变化时,我们只需要调整Rule中的链接提取规则或回调函数,而无需对整个爬虫进行大量修改。这使得CrawlSpider具有很高的灵活性和可维护性。

二、CrawlSpider与其他Scrapy组件的关系

CrawlSpider继承自Scrapy中的Spider基类。Spider是所有爬虫的基类,它定义了爬虫的基本结构和行为。CrawlSpider作为Spider的派生类,继承了Spider的基本功能,并添加了一些特定的规则和功能来实现自动爬取。

其次,CrawlSpider与Scrapy中的其他组件协同工作,共同完成了爬虫的整个流程。例如,Scrapy中的Engine组件负责控制爬虫的整个运行过程,它会根据配置的规则调用相应的Spider(包括CrawlSpider)进行爬取。同时,Downloader组件负责发送网络请求并接收响应,将响应内容传递给CrawlSpider进行处理。

在数据提取和解析方面,CrawlSpider依赖于Scrapy中的Selectors组件。Selectors提供了一套强大的选择器,用于从HTML或XML响应中提取数据。CrawlSpider使用这些选择器来根据规则提取链接和数据,并进行后续的处理。

此外,CrawlSpider还与Scrapy的Item Pipeline组件进行交互。Item Pipeline负责处理由Spider提取的数据,包括清洗、验证和存储等操作。CrawlSpider提取的数据会传递给Item Pipeline进行进一步的处理和存储。

最后,Scrapy还提供了中间件(Middleware)机制,开发者可以在爬虫运行过程中插入自定义的中间件来修改请求、响应或执行其他操作。CrawlSpider可以与其他中间件进行集成,以实现更复杂的爬取逻辑和自定义功能。

三、CrawlSpider基础知识

1、LinkExtractors链接提取器

在Scrapy框架中,LinkExtractors(链接提取器)是一个非常重要的组件,专门用于从网页的HTML内容中提取出链接。这些链接可能是指向网站内部其他页面的,也可能是指向外部网站的。通过LinkExtractors,我们可以方便地获取到这些链接,从而进行后续的爬取操作。

(1)基本用法

使用LinkExtractors提取链接的基本步骤如下:
①导入必要的模块:首先,需要导入scrapy.linkextractors模块中的LinkExtractor类。

from scrapy.linkextractors import LinkExtractor

②创建链接提取器实例:接下来,创建一个LinkExtractor的实例。在创建时,可以传入一些参数来定制链接提取的行为。

le = LinkExtractor()

③从响应中提取链接:然后,使用链接提取器的extract_links方法从Scrapy的响应对象(Response)中提取链接。这个方法会返回一个包含提取到的链接的列表。

links = le.extract_links(response)

④处理提取到的链接:最后,可以遍历这个链接列表,对每个链接进行进一步的处理,比如发起新的请求进行爬取。

(2)过滤规则与限制条件

LinkExtractor提供了丰富的参数来定制链接提取的过滤规则和限制条件,确保只提取到我们感兴趣的链接。
①allow参数:这是一个正则表达式(或者一组正则表达式),用于匹配要提取的链接的URL。只有匹配成功的链接才会被提取出来。

le = LinkExtractor(allow=r'/category/\d+')

上面的例子中,只有URL中包含/category/后面跟着一串数字的链接会被提取。
②deny参数:与allow相反,deny参数用于指定要排除的链接。即使链接匹配了allow规则,但如果同时也匹配了deny规则,那么它也不会被提取出来。

le = LinkExtractor(allow=r'/', deny=r'/exclude/path/')

在这个例子中,虽然所有根路径下的链接都会被考虑,但是/exclude/path/下的链接会被排除。
③restrict_xpaths或restrict_css参数:这两个参数允许你基于HTML文档的特定部分来提取链接。你可以传入XPath或CSS选择器来指定要从哪个元素中提取链接。

le = LinkExtractor(restrict_xpaths='//div[@class="content"]')

上面的例子中,只有位于class为"content"的div元素内部的链接会被提取。
④其他参数:LinkExtractor还提供了其他一些参数,如tags(用于指定从哪些HTML标签中提取链接)、attrs(用于指定从HTML标签的哪些属性中提取链接)等,用于进一步定制链接提取的行为。

通过合理地设置这些参数,我们可以精确地控制LinkExtractor提取链接的行为,确保只获取到我们真正需要的链接,从而提高爬虫的效率和准确性。

2、Rule规则

在Scrapy框架中,Rule(规则)是一个核心概念,特别是在CrawlSpider类中,它扮演着至关重要的角色。Rule定义了爬虫如何跟随链接以及如何从这些链接中提取数据。下面,我们将详细讲解Rule的组成与含义,以及跟随链接与回调函数的关系。

(1)Rule的组成与含义

Rule主要由两部分组成:链接提取器(LinkExtractor)回调函数(callback)
●链接提取器(LinkExtractor):负责从爬取的页面中提取出符合特定条件的链接。这些条件可以是链接的文本内容、链接的URL格式等。通过设置LinkExtractor的参数,我们可以精确地控制哪些链接会被提取出来。
●回调函数(callback):是一个函数,当爬虫跟随链接到达新的页面时,这个函数会被调用。回调函数的作用是对新页面进行解析和数据处理。你可以在回调函数中编写自己的解析逻辑,提取页面中的信息,并将信息存储或进行后续操作。
综合来说,Rule就是Scrapy框架中的一个指令,它告诉爬虫:“当你遇到符合特定条件的链接时,使用指定的回调函数来处理这些链接”。

(2)跟随链接与回调函数

在Scrapy中,跟随链接和回调函数是Rule中紧密相关的两个部分。
●跟随链接:当爬虫遇到由LinkExtractor提取出来的链接时,它会跟随这些链接,即发送新的请求去获取这些链接指向的页面内容。这是爬虫进行深度爬取的关键步骤,使得爬虫能够遍历整个网站或网站的特定部分。
●回调函数:当爬虫成功获取到链接指向的页面内容后,它会调用与该链接关联的回调函数。回调函数负责解析页面内容,提取出所需的信息。这通常涉及到使用Scrapy的Selectors或其他解析库来从HTML或XML中抽取数据。
通过合理设置Rule中的链接提取器和回调函数,我们可以实现对特定网站或网站特定部分的精确爬取。例如,我们可以设置Rule只跟随符合特定URL模式的链接,并在回调函数中只提取页面中的特定信息。
总的来说,Rule是Scrapy框架中实现自动化、定制化爬取的关键工具。通过灵活配置Rule,我们可以构建出高效、准确的爬虫程序,满足各种复杂的爬取需求。

3、Rule规则与LinkExtractor结合实例

【使用Rule规则爬取一个新闻网站的特定类别文章】
假设我们有一个新闻网站,该网站有多个类别,并且每个类别下的文章都位于不同的URL路径下。我们的目标是爬取其中某个特定类别(比如“科技”类别)下的所有文章标题和链接。
首先,我们需要定义一个CrawlSpider,并为其设置相应的Rule规则。下面是一个简化的例子:

import scrapy  
from scrapy.linkextractors import LinkExtractor  
from scrapy.spiders import CrawlSpider, Rule  
from myproject.items import MyProjectItem  # 假设我们有一个自定义的Item类  
  
class NewsSpider(CrawlSpider):  
    name = 'news'  
    allowed_domains = ['example.com']  
    start_urls = ['http://www.example.com/tech']  # 假设这是“科技”类别的起始页面  
  
    rules = (  
        Rule(LinkExtractor(allow=r'/tech/article/\d+'), callback='parse_article', follow=True),  
    )  
  
    def parse_article(self, response):  
        item = MyProjectItem()  
        item['title'] = response.css('h1::text').get()  # 假设文章标题在h1标签中  
        item['link'] = response.url  
        return item

在这个例子中:

●NewsSpider继承自CrawlSpider。
●name属性定义了爬虫的名字,这里是'news'。
●allowed_domains指定了允许爬取的域名,这里是'example.com'。
●start_urls是爬虫开始爬取的URL列表,这里我们指定了“科技”类别的起始页面。

Rule规则设置:

●我们创建了一个Rule对象,并将其添加到rules元组中。
●LinkExtractor(allow=r'/tech/article/\d+')是一个链接提取器,它使用正则表达式来匹配以/tech/article/开头并且后面跟着一串数字的URL。这些URL很可能是“科技”类别下的文章页面。
●callback='parse_article'指定了当爬虫访问到符合规则的链接时,应该调用parse_article方法来处理响应内容。
●follow=True表示如果parse_article方法返回了更多的Request对象,爬虫会继续跟随这些链接。在本例中,我们假设每个文章页面没有其他需要跟进的链接,因此这个参数其实可以省略或者设置为False。

回调函数设置:

●parse_article方法是一个回调函数,它接收一个response对象作为参数。
●在这个方法中,我们使用Scrapy的CSS选择器来从响应的HTML中提取文章标题,并将其存储到MyProjectItem对象中。同时,我们也存储了当前页面的URL作为链接。
●最后,方法返回了填充好的item对象,Scrapy的Item Pipeline会负责后续的处理,比如存储到数据库或导出为文件。

通过运行这个爬虫,Scrapy将会从指定的起始页面开始,跟随匹配LinkExtractor规则的链接,并对每个链接使用parse_article方法进行解析和提取数据。这样,我们就能爬取到“科技”类别下的所有文章标题和链接了。

四、CrawlSpider的使用步骤

我们的测试目标,是“读书网”(www.dushu.com)下面的“世界名著”(https://www.dushu.com/book/1175.html)的书籍分类链接:


这里面的书籍列表,我们查看最下面的分页按钮,是看不到最终有多少页的:

但是我们通过F12查看分页按钮的Html代码:

是可以看到每一页的翻页逻辑的,其实就是“/book/1175_x.html”,其中的“x”就是页面数,是第1页就是1,第10页就是10。
我们下面就使用CrawlSpider按照规则爬取每一页数据。

1、创建Scrapy项目与Spider

我们打开编辑器,在控制台通过“scrapy startproject 项目名”命令,创建一个新的爬虫项目,用来抓取读书网的数据:

scrapy startproject scrapy_dushuwang

然后打开这个项目,使用“scrapy genspider 爬虫名 网站地址”命令创建一个爬虫:

cd scrapy_dushuwang  
scrapy genspider myspider www.dushu.com/book/1175.html

2、定义CrawlSpider类

在spiders目录下找到myspider.py文件,将其修改为继承自CrawlSpider。同时我们需要从scrapy.spiders导入CrawlSpider和Rule,以及从scrapy.linkextractors导入LinkExtractor,代码如下

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
# 自定义的Item类
from scrapy_dushuwang.items import ScrapyDushuwangItem

class MyspiderSpider(CrawlSpider):
    name = "myspider"
    allowed_domains = ["www.dushu.com"]
    start_urls = ["https://www.dushu.com/book/1175.html"]

    # 接下来,我们将在这里定义rules和回调函数

3、配置LinkExtractors与Rule

在MySpider类中,我们需要配置LinkExtractors和Rule来定义爬虫如何跟随链接以及提取数据。

rules = (  
    Rule(LinkExtractor(allow=r'/book/1175_\d+\.html'), callback='parse_item', follow=False),  
    # 可以添加更多Rule来处理不同的链接模式  
)

在上述代码中,LinkExtractor(allow=r'/book/1175__\d+\.html')是一个链接提取器,它会匹配所有以“/book/1175_\d+\.html”匹配的URL。callback='parse_item'指定了当爬虫访问到这些链接时,应该调用parse_item方法处理响应内容。follow=True表示如果parse_item方法返回了更多的Request对象,爬虫会继续跟进这些链接,这里我们为了演示方便,不进行深度搜索了,只搜索本页面信息即可,所以设置为了False

4、编写解析函数处理页面数据

接下来需要定义parse_item方法(或你在Rule中指定的任何其他回调函数),用来解析页面并提取所需的数据。
这里我们主要抓取的是每一页图书列表的标题:

正则表达式为“//div[@class="book-info"]//a/@title”。代码编写如下:

def parse_item(self, response):
    a_list = response.xpath('//div[@class="book-info"]//a')
    for a in a_list:
        title = a.xpath('./@title').extract_first()
        titles = ScrapyDushuwangItem()
        if str(title) == 'None':
            print("title为空,无效a标签")
        else:
            titles['title'] = title
            # 这里还可以获取你其他想获取的属性...
            yield titles

其中的ScrapyDushuwangItem类的定义(items.py文件):

import scrapy

class ScrapyDushuwangItem(scrapy.Item):
    title = scrapy.Field()
    pass

在上面的代码中,我们使用了CSS选择器来从HTML中提取数据。你可以根据需要调整选择器来匹配正确的元素。提取的数据被存储在一个Scrapy Item对象中,该对象之后会被送到Item Pipeline进行进一步的处理(比如保存到数据库或文件中)。
最后记得在settings.py中将管道开启:

ITEM_PIPELINES = {
   "scrapy_dushuwang.pipelines.ScrapyDushuwangPipeline": 300,
}

pipelines.py的代码为:

class ScrapyDushuwangPipeline:
    # 1、在爬虫文件开始执行前执行的方法
    def open_spider(self, spider):
        print('++++++++爬虫开始++++++++')
        # 这里写入文件需要用'a'追加模式,而不是'w'写入模式,因为写入模式会覆盖之前写的
        self.fp = open('book.json', 'a', encoding='utf-8')  # 打开文件写入

    # 2、爬虫文件执行时,返回数据时执行的方法
    # process_item函数中的item,就是爬虫文件yield的book对象
    def process_item(self, item, spider):
        # write方法必须写一个字符串,而不能是其他的对象
        self.fp.write(str(item)+'\n')  # 将爬取信息写入文件
        return item

    # 在爬虫文件开始执行后执行的方法
    def close_spider(self, spider):
        print('++++++++爬虫结束++++++++')
        self.fp.close()  # 关闭文件写入

5、运行项目并查看结果

在命令行中运行Scrapy项目来开始爬取数据:

scrapy crawl myspider

Scrapy将开始执行我们定义的爬虫,并输出爬取到的数据到book.json中:

以上就是关于Scrapy框架中有关CrawlSpider的技术介绍。下一篇我们来讲解Scrapy的日志信息及日志级别。

参考:尚硅谷Python爬虫教程小白零基础速通
转载请注明出处:https://guangzai.blog.csdn.net/article/details/137213473

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/509398.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动画效果-精灵图人物移动

效果&#xff1a;人物跑步移动 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&…

高风险IP来自哪里:探讨IP地址来源及其风险性质

在网络安全领域&#xff0c;高风险IP地址是指那些可能涉及恶意活动或网络攻击的IP地址。了解这些高风险IP地址的来源可以帮助网络管理员更好地识别和应对潜在的安全威胁。本文将探讨高风险IP地址的来源及其风险性质&#xff0c;并提供一些有效的应对措施。 风险IP查询&#xf…

每日一题(力扣136):只出现一次的数字

利用哈希&#xff1a;时间复杂度O(n)&#xff0c;空间复杂度O(n) class Solution { public:int singleNumber(vector<int>& nums) {if (nums.size() 1){return nums[0];}unordered_map<int, int> map;int len nums.size();for (int i 0; i < len; i){if…

PCL 计算点与圆的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 3D中的圆可以有圆心、半径以及法线来进行表示,如下图所示: 这里我们假设: Δ = P − C \Delta=P-C Δ

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针赋值和测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针&#xff08;非函数指针&#xff09;&#xff1a; 有类型的函数指针&#xff1a; void 类型的指针&#xff1a; 结语 前言 进行单元测试之后&#xff0c;但凡…

一键切换ip地址软件的功能和优势

随着网络技术的不断发展和普及&#xff0c;IP地址已经成为我们在互联网上活动的重要标识。然而&#xff0c;在某些特定情况下&#xff0c;我们可能需要频繁地切换IP地址&#xff0c;以满足不同的网络需求或保护个人隐私。一键切换IP地址的软件应运而生&#xff0c;为我们提供了…

TM1650芯片驱动四位数码管(含部分代码)

TM1650芯片驱动四位数码管 SCL&#xff1a;IIC的时钟线 SDA&#xff1a;IIC的数据线 DIGx&#xff1a;每个数码管的总开关&#xff0c;不开&#xff0c;怎么搞也不会亮滴&#xff0c;数码管1、2、3、4 A/K11~G/K17/DP/KP&#xff1a;因为只用了下数码管&#xff0c;所以建议不用…

一文搞定防盗链设计

大家好&#xff0c;我是蓝胖子&#xff0c;在涉及到图片或者视频链接时&#xff0c;通常都会提到防盗链&#xff0c;这一节我将会从防盗链的含义到落地&#xff0c;向大家展示如何设计资源的防盗链。 防盗链的含义与作用 防盗链&#xff0c;顾名思义&#xff0c;是为了防止资…

16_嵌入式文件系统选择

嵌入式文件系统选择 在进行嵌入式系统开发过程中&#xff0c;文件系统的选择和制作与硬件条件息息相关。根据硬件&#xff08;Flash 或 RAM&#xff09;的特性来指定相应的文件系统&#xff0c;能够充分利用硬件资源及提高系统效率。因为目前大部分的嵌入式文件系统都是建立在 …

【技巧】Leetcode 287. 寻找重复数【中等】

寻找重复数 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组…

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…

中国90米分辨率可蚀性因子K数据

土壤可蚀性因子&#xff08;K&#xff09;数据&#xff0c;基于多种土壤属性数据计算&#xff0c;所用数据包括土壤黏粒含量&#xff08;%&#xff09;、粉粒含量&#xff08;%&#xff09;、砂粒含量&#xff08;%&#xff09;、土壤有机碳含量&#xff08;g/kg&#xff09;、…

计算机组成原理1:计算机系统概述

此系列介绍计算机的组成原理&#xff0c;参考书&#xff1a;《计算机组成原理考研复习指导》(王道论坛组编)。 1.计算机发展史 1.1 计算机发展 计算机变化 第一代计算机 ( 1946 − 1957 ) (1946-1957) (1946−1957)&#xff1a;电子管时代。 逻辑元件采用电子管&#xff1b;使…

LVS、HAProxy

集群&#xff1a;将很多个机器组织到一起&#xff0c;作为一个整体对外提供服务。集群在扩展性、性能方面都可以做到很灵活。集群的分类&#xff1a;负载均衡集群&#xff1a;Load Balance。高可用集群&#xff1a;High Available。高性能集群&#xff1a;High Performance Com…

酷开系统覆盖尽可能多的用户,助力酷开科技走在数字化营销前面

用户画像可看作企业应用大数据的根基&#xff0c;是定向广告投放与个性化推荐的前置条件&#xff0c;为数据驱动运营奠定了基础。酷开系统家庭激活终端超过6000万&#xff0c;针对全量用户进行分析&#xff0c;覆盖尽可能多的用户&#xff0c;为提升用户画像准确率提供了很好的…

GWO-CNN-BiLSTM多输入回归预测|灰狼群算法优化的卷积-双向长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&…

谷歌翻译示例

概述 项目需要&#xff0c;使用谷歌翻译&#xff0c;前提是得翻墙。 1、获取所有语言和其对应编码如下所示&#xff1a; {auto: 检测语言,sq: 阿尔巴尼亚语,ar: 阿拉伯语,am: 阿姆哈拉语,as: 阿萨姆语,az: 阿塞拜疆语,ee: 埃维语,ay: 艾马拉语,ga: 爱尔兰语,et: 爱沙尼亚语,or…

主站设备通过Modbus转Profinet网关与湿度传感器通讯配置

Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;可以实现不同协议设备通讯&#xff0c;有些现场需要实时监测环境参数&#xff0c;但大由于当时环境仪表设备不能达到直连效果&#xff0c;通过Modbus转Profinet网关&#xff0c;湿度传感器的数据可以被准确、可靠地传输…

三十个中文AI对话网站推荐

目录 写在前面 一、kimi 二、WeexAI 三、Cursor 四、智谱清言 五、讯飞星火 六、通义千问 七、文心一言 八、混元 九、豆包AI 十、其它 写在前面 总的来说&#xff0c;现在国内能用到的大模型类产品分国产和套壳两种。对于中文任务&#xff0c;这些大模型功能都大同…

文献学习-25-综合学习和适应性教学:用于病理性胶质瘤分级的多模态知识蒸馏

Comprehensive learning and adaptive teaching: Distilling multi-modal knowledge for pathological glioma grading Authors: Xiaohan Xing , Meilu Zhu , Zhen Chen , Yixuan Yuan Source: Medical Image Analysis 91 (2024) 102990 Key words: 知识蒸馏、模态缺失、胶质瘤…