版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
福建工程学院本科毕业设毕业设计(论文)I基于Python的分布式爬虫系统设计摘要在这个互联网飞速发展的时代下,随着互联网网络规模和用户数量的爆炸性增长,相关的服务和信息量也随之快速增长,单纯依赖计算机单机处理能力的集中式网络爬虫信息采集的速度已经无法满足快速获取大量数据的需求。分布式网络爬虫由可并行获取资源的多个节点爬虫组成,具有良好的可扩展性,它们在数据检索方面的优秀表现受到人们的欢迎。因此,本文将根据平台的需求,设计出一个个性化的高效的分布式网络爬虫。本文依托针对上述课题展开研究,设计并实现了一个分布式网络爬虫。本文在对当前流行的分布式网络爬虫的相关技术进行了一定研究的基础上,根据需求分析设计理念,结合代码介绍爬虫的设计细节,通过对比实验体现分布式爬虫的优势,并作出总结,提出展望。本文所研究设计的分布式网络爬虫系统,最大限度地利用了爬虫和网络带宽,不仅提高了计算机信息采集的速度,降低了系统损耗,而且加强了系统的可扩展性,能够适应更多类型的数据。关键词:Python,分布式爬虫,scrapy,Redis,MongoDB目录TOC\o"1-3"\h\u24003第1章绪论 1132241.1研究背景及意义 1258171.1.1系统背景 111141.1.2系统开发意义 1270221.2研究方向与内容 26137第2章相关工具和理论介绍 3141002.1Python概述 3198042.2Hadoop概述 360582.3Scrapy框架简介 365312.4Redis数据库 564282.5MonggoDB数据库 521645第3章系统需求分析 6221353.1功能需求 6192553.2用例图 7307073.3架构示意图 885683.4功能架构划分 9255153.5程序流程图 1014082第4章数据库设计 11114194.1数据库E-R图 1111904.2数据库表及其结构 1225065第5章系统详细设计与实现 13163435.1爬虫的设计与实现 13236415.1.1爬取策略的设计的设计与实现 13224965.1.2爬虫的具体实现 14221045.1.3去重与增量爬取 1569665.2爬虫防屏蔽组件的实现 1644775.3数据处理 193835第6章系统运行 2210423第7章系统测试 23192767.1测试简介 23247957.2测试结果 2414147参考文献 28第1章绪论1.1研究背景及意义1.1.1系统背景近年来,互联网正处于稳重求快的阶段,互联网正在全面渗透于我们的日常生活中,在很多方面改变和改善我们的生活和工作形态。当前互联网已经成为影响我国经济社会发展、改变人们生活形态的关键行业,膨胀的网民数量给搜索引擎的发展带来了极大的机遇。为了更好地解决这个问题,怎样从越来越大的数据资料源中以更快的速度、极高的效率、很高的安全性寻找到对网络使用者有价值的数据成为了搜索引擎的主要目标。在海量数据的现状下,想要解决网络搜索问题,单纯地依赖计算机单机处理能力是几乎完成不了的,即使是提升计算机硬件方面的功能,也不可能赶上信息增长的速度。经过研究者的潜心钻研,他们提出了分布式信息检索技术。该技术一经发布,便得到了极大的关注,目前几乎所有的大型搜索系统都使用了分布式的体系构造,众所周知的Google和百度,它们的搜索引擎系统便是采用这一体系,利用分布式网络爬虫提高数据检索的效率。分布式搜索系统采用分布式信息检索技术,以分布式网络爬虫为基础,联结互联网中的多个机器,协调解决大规模数据的处理、索引和检索问题。其中,分布式搜索引擎的核心功能是由分布式网络爬虫实现的。1.1.2系统开发意义随着大数据时代的到来,如何采集庞大的数据库也是目前难题之一,这个时候网络爬虫就变成了一个必不可少的东西,其中爬虫又分为单机爬虫和分布式爬虫。分布式爬虫是在多台机器上运行爬虫程序,重点是联合采集数据。在多个服务器上能够协同采集的就是分布式的,分布式实现了多台主机使用一个共同的爬虫程序,可以在多台电脑上运行,这样的话可以提高爬虫效率。像是采集非常大量的数据,多线程爬虫是很难做到高效的,所以研究分布式爬虫是这个大数据时代所必须的。无论是单机或者是多台主机,分布式爬虫都对计算机的性能有一定的要求,首先是处理器,其次是网络,分布式爬虫的效率会受这些的影响,如果硬件设施无法达到要求甚至不如单机爬虫。分布式爬虫本质上就是将程序的运行从一台机器扩展到多台机器,加快运行速率。1.2研究方向与内容 本文结合实际平台需求,基于分布式搜索引擎的框架,设计实现分布式网络爬虫。研究内容主要包括以下四个方面: (1)查阅当前流行的分布式模型的相关资料,积累相关分布式网络爬虫的开发经验和理论基础。 (2)着重掌握分布式网络爬虫相关知识,根据苏州贷后风险平台的实际需要,分析爬虫设计要点,例如爬虫结构、通信方式、数据结构、报文设计、异常处理方式等。 (3)细化设计要点,编码实现一个分布式网络爬虫,从报文解析和线程控制两个方面进行说明,确保系统正常高效运行。(4)将本文实现的爬虫运用于模拟的分布式系统环境下,测试其爬行效率和系统的稳定性,并进行对比实验,分析实验效果,提出改进建议。相关工具和理论介绍2.1Python概述Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白语言本身。Python极其容易上手,因为Python有极其简单的说明文档。风格清晰划一、强制缩进,Python的底层是用C语言写的,很多标准库和第三方库也都是用C写的,运行速度非常快。Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。Python支持重载运算符和动态类型。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持。有两个标准库(functools,itertools)提供了Haskell和StandardML中久经考验的函数式程序设计工具。2.2Hadoop概述Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统,其中一个组件是HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的硬件上;而且它提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS放宽了POSIX的要求,可以以流的形式访问文件系统中的数据。Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。2.3Scrapy框架简介Scrapy是用Python开发的一个开源的Web爬虫框架,可用于快速抓取Web站点病虫页面中搞笑提取结构化的数据。Scrapy可广泛应用于数据挖掘、监测和自动化测试等方面,提供了多种类型爬虫的基类,如BaseSpaider、SitemapSpider等。Scrapy使用了Twisted异步网络库来处理网络通讯。整体架构大致如下(图片来源网络):图2-1Scrapy整体架构图Scrapy架构组件介绍:ScrapyEngine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。Downloader(下载器):负责下载ScrapyEngine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给ScrapyEngine(引擎),由引擎交给Spider来处理,Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),ItemPipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.DownloaderMiddlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。SpiderMiddlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)2.4Redis数据库Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。2.5MonggoDB数据库MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。第3章系统需求分析3.1功能需求随着网络资源的不断爆炸,社会越来越需要一些自动化的技术取代传统的数据收集方法,来筛选有用、有价值的信息,并提取出来满足人们的生活需要。爬虫程序就是在这样的要求下产生的,它是大数据时代信息收集的必备技能。基于Python的Scrapy框架爬虫又是其中重要的一员,在搜索引擎、信息检索和数据挖掘中都是十分重要的基础。通过使用该技术,我们能更好的根据自己的需要从特定的所需网站里获取自己所想要的信息,从而满足自己的需求。本课题研究的是基于Python的分布式爬虫,是一个以研究Scrapy与hadoop框架为主的分布式爬虫系统。该系统采用Scrapy框架;Scrapy框架的数据流向首先从初始URL开始。调度程序接受请求,并对URL进行排序,再发送请求给下载器,下载器抓取网页并将网页内容返回给爬虫。爬虫分析出来的结果有两种:一种是需要进一步抓取的链接,放回调度器;另一种是需要保存的数据,则被送回项目管道,项目管道负责清洗数据,验证解析出来的数据,检查数据是否和已存储的数据重复,有则丢弃,最终将清洗后的数据存储在Redis数据库中。之后将Redis里面的数据录入到MongoDB数据库当中,可以做到查看,删除等功能,除此之外还利用matplolib进行可视化处理3.2用例图图3-1用户用例图图3-2爬虫用例图3.3架构示意图图3-3架构示意图3.4功能架构划分爬虫功能的功能需求主要在对于字段的爬取,对网站反爬的处理,内容的保存和处理。这就要求爬虫能够满足对于网站各种信息的晒别,提取,能够应对网站的反爬,以及对爬取出来的内容进行收集和处理。系统功能架构如下图所示:图3-4功能架构图3.5程序流程图图3-5程序流程图第4章数据库设计4.1数据库E-R图系统采用的是MonggoDB数据库,从需求的分析上找出实体,实体和属性联系通过E-R图表展示,通过优化后得到具体模型,系统的E-R图如下图所示:图4-1数据库E-R图4.2数据库表及其结构该表主要是以主要爬取字段为目标,由Slave服务器端解析爬取字段数据,所以数据库表的内容必须符合抓取内容。以秀动网演唱会数据为主,通过分析内部结构,内容字段如下表所示:表4-1演唱会内容表序号字段名称字段含义1platform平台2title演唱会标题3ShowTime表演时间4actors明星名字5address演出地址6price价格7url页面地址第5章系统详细设计与实现5.1爬虫的设计与实现该系统主要以爬取秀动演唱会网页内容为主来设计爬虫,重点考虑爬取策略的设计,数据的抓取、去重和增量功能的实现、爬虫防屏蔽的实现、数据处理与存储5.1.1爬取策略的设计的设计与实现由scrapy的结构分析可知,网络爬虫从初始地址开始,根据spider中定义的目标地址获的正则表达式或者Xpath获得更多的网页链接,并加入到待下载队列当中,进行去重和排序之后,等待调度器的调度。在这个系统中,新的链接可以分为两类,一类是目录页链接,也就是我们通常看到的下一页的链接,一类是内容详情页链接,也就是我们需要解析网页提取字段的链接,指向的就是实际的房源信息页面。网络需从每一个目录页链接当中,提取到多个内容页链接,加入到待下载队列准备进一步爬取。具体代码如下:classMovieSpider(RedisSpider):
name='movie'
allowed_domains=['']
redis_key='xiudong:start_urls'
#foriinrange(1,90):
#start_urls.append('/event/list?cityId=0&siteId=0&isList=1&pageNo=%s'%(i))
index=3
base_url='/event/list?cityId=0&siteId=0&isList=1&pageNo={}'
defparse(self,response):
urls=response.xpath('//ul[@class="g-list-wrapjustifyMT30"]/li/a/@href').extract()
names=response.xpath('//ul[@class="g-list-wrapjustifyMT30"]/li/a/p[@class="g-name"]/text()').extract()
fori,jinzip(names,urls):
yieldscrapy.Request(url=j,callback=self.handle)
ifself.index<100:
yieldscrapy.Request(self.base_url.format(self.index),callback=self.parse)
self.index=self.index+2此处是Master端的目标链接的爬取策略,因为采取的分布式主从模式,Master端爬虫主要爬取下载到内容详情页链接,通过redis分享下载任务给其他slave端的爬虫。Slave端主要是负责对详情页链接的进一步解析提取存储到数据库中。5.1.2爬虫的具体实现爬虫程序的包含四个部分,分别是对象定义程序,数据抓取程序,数据处理程序和下载设置程序,此处的组成是Slave端,Master少了对象定义程序以及数据处理程序,Master端主要是下载链接的爬取。数据抓取程序
数据抓取程序分Master端和Slave端,数据抓取程序从Redis中获得初始地址,数据抓取程序中定义了抓取网页的规则和使用Xpath提取字段数据的方法等,这里着重介绍Xpath提取字符数据的方法,Xapth使用路径表达式来选取网页文档中的节点或者节点集。在Xpath中有其中类型的几点:元素、属性、文本、命名空间、处理指令、注释和文档节点。网页文档是被当做节点树来对待,树的跟被称为文档节点和根节点,通过Xpath表达式定位目标节点即可抽取网页文档的字段数据,下面以Master抓取标题内容页和Slave提取字段数据为例。图5-1网页具体字段图Xpath抽取内容详情页链接的方法关键代码如下:title=response.xpath('//h1[@class="goods-name"]/text()').extract()[-1].replace('\t','').replace('\n','')
info=response.xpath('//ul[@class="items-list"]/li/text()').extract()
ShowTime=info[0].replace('\t','').replace('\n','')
actors=response.xpath('//ul[@class="items-list"]/li[2]/a/text()').extract()
actors="".join(actors)
address=response.xpath('//ul[@class="items-list"]/li[4]/text()').extract()[0].replace('\t','').replace('\n','')
price=response.xpath('//span[@class="price"]/text()').extract()[0]
url=response.url
url="".join(url)
platform="ShwoStart"5.1.3去重与增量爬取去重与增量爬取,对于服务器有很重大的意义,能够减少服务器的压力以及保证数据的准确性。如果不采取去重处理,那么抓取的内容会抓取大量重复内容,让爬虫效率极大的下降。其实去重流程很简单,核心就是每次请求的时候,先判断这个请求是否在已经爬取的队列当中。如果已存在,则舍弃当前请求。(1)
从待爬队列中获取url(2)将即将请求的url判断是否已经爬取,若已爬取,则将请求忽略,未爬取,继续其他操作并将url插入已爬取队列中此处使用的是Scrapy-redis组件,关键代码如下:BOT_NAME='CatEye'
SPIDER_MODULES=['CatEye.spiders']
NEWSPIDER_MODULE='CatEye.spiders'
#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agent
USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.190Safari/537.36'
#Obeyrobots.txtrules
ROBOTSTXT_OBEY=False
REDIS_HOST=''#根据自己的ip进行更改
REDIS_PORT=6379
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER="scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST=True
ITEM_PIPELINES={
'scrapy_redis.pipelines.RedisPipeline':400,5.2爬虫防屏蔽组件的实现访问一个网站的网页的时候,会给网站带了一定的负载,而爬虫程序则是模拟了我们正常访问网页的过程,但是。大规模的爬虫会给网站增加大量的负载,影响正常用户的访问。为保证网页能够别大多数正常用户的访问,大多数网站都有相应的防爬虫策略。一旦访问行为被认定为爬虫,网站将会采取一定的措施,限制你的访问,比如提示你,访问过于频繁让你输入验证码,更严重者,会封掉你的ip,禁止你访问该网站。本系统定向抓取网页数据的时候,将不间断的访问网站内容,如果不采取伪装措施,很容易被网站识别为爬虫行为而屏蔽掉。本系统采用以下方法来防止爬虫被屏蔽:1.
模拟不同的浏览器行为2.
以一定的频率更换代理服务器和网关3.
本着君子协议,降低爬虫爬取网页的频率,减少并发爬取的进程,限制每个ip并发爬取的次数,牺牲一定的效率来换取系统的稳定性。(a)模拟不同浏览器行为实现思路及代码原理:从scrapy的介绍我们可以知道,scrapy有下载中间件,在这个中间件我们可以对请求跟响应进行自定义处理,类似于spring面向切面编程,像一个钩子嵌入到程序的运行前后。核心就是对请求的属性进行修改首先主要是对下载中间件进行了扩展,首先在seetings.py上面增加中间件,其次,扩展中间件,主要是写一个useragent列表,将常用的浏览器请求头保存为一个列表,代码如下所示:#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agent
USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.190Safari/537.36'再让请求的头文件随机在列表中取一个agent值,然后到下载器进行下载。综上,每次发出请求的时候模拟使用不同的浏览器对目标网站进行访问。(b)使用代理ip进行爬取的实现思路及代码。首先在seetings.py上面增加中间件,扩展下载组件请求的头文件随机从代理ip池中取出一个代理值然后到下载器进行下载。a.
对免费代理ip网站进行抓取。b.
对代理ip进行存储并验证c.
验证通过存储进数据库d.
如果满足ip最大数量,则停止爬去,一定时间后验证数据的ip有效性,将失效的ip删除e.
直到数据库ip小于0,继续爬取ip,重复步骤a。(c)爬虫异常状态组件的处理没有被屏蔽运行时,访问网站不是一直都是200请求成功,而是有各种各样的状态,像上述爬虫被禁的时候,其实返回的状态是302,防止屏蔽组件就是捕捉到302状态加以实现的。同时异常状态的处理有利于爬虫的健壮性。在settings中扩展中间件捕捉到异常的情况之后,将请求Request重新加入到待下载队列当中流程如下:图5-2异常处理流程图(d)数据存储模块数据存储模块主要负责将slave端爬取解析的页面进行存储。使用Mongodb对数据进行存储。Scrapy支持数据存储的格式有json,csv和xml等文本格式,用户可以在运行爬虫时设置,例如:scrapycrawlspider-oitems.json-tjson,也可以在Scrapy工程文件额ItemPipline文件中定义,同时,Scrapy也支持数据库存储,如Monogdb,Redis等,当数据量大到一定程度时,可以做Mongodb或者Reids的集群来解决问题,本系统数据存储如下图所示:图5-3数据存储示意图5.3数据处理5.3.1对象定义程序Item是定义抓取数据的容器。通过创建一个scrapy.item.Item类来声明。定义属性为scrapy.item.Field对象,通过将需要的item实例化,来控制获得的站点数据。本系统定义了九个抓取对象,分别是:标题,表演时间,演员名字,地址,价格,url。关键代码如下:classCateyeItem(scrapy.Item):
#definethefieldsforyouritemherelike:
title=scrapy.Field()
ShowTime=scrapy.Field()
actors=scrapy.Field()
address=scrapy.Field()
price=scrapy.Field()
url=scrapy.Field()5.3.2数据处理程序Pipeline类中定义了数据的保存和输出方法,从Spider的parse方法返回的Item,数据将对应ITEM_PIPELINES列表中的Pipeline类处理后以顶一个格式输出。本系统传回管道的数据使用Mongodb来进行存储。关键代码如下:defopen_spider(self,spider):
self.client=connect(host='localhost',port=3306,user='root',password='root',db='yanchu',charset='utf8')
self.cursor=self.client.cursor()
defprocess_item(self,item,spider):
args=[
item["title"],
item["ShowTime"],
item["actors"],
item["address"],
item["price"],
item["url"],
item["platform"],
]
sql='insertintot_showstartVALUE(0,%s,%s,%s,%s,%s,%s,%s)'
self.cursor.execute(sql,args)
mit()
returnitem5.3.3数据库录入程序数据存储模块主要负责将slave端爬取解析的页面进行存储。使用Mongodb对数据进行存储。classMongoPipeline(object):
defopen_spider(self,spider):
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 盐城市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(新)
- 2026年六安市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解
- 2026年潮州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(突破训练)
- 延边朝鲜族自治州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(易错题)
- 株洲市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(黄金题型)
- 桂林市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(新)
- 山东省农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(易错题)
- 2026年铜陵市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解一套
- 泸州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及参考答案详解
- 石家庄市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(综合题)
- 2024-2025学年初中生物冀少版八年级上册教学课件 3.4.1 呼吸作用
- 政治学理论与方法前沿 课件 第13、14章 国际政治;大数据政治学
- 电力设备交接和预防性试验规程
- 劳动教育课件 4章 劳动精神与工匠精神
- 《城镇液化石油气加臭技术规程》
- 烂尾楼续建报告范文
- 道德与法治五年级上册全册教案
- 甘肃省天水市麦积区2024-2025学年八年级上学期10月期中考试数学试卷(含详解)
- 2024马克思主义发展史第2版配套题库里面包含考研真题课后习题和章节题库
- 广东省深圳市龙岗区2024-2025学年高二上学期11月期中考试 数学试题含答案
- 周围性面瘫课件
评论
0/150
提交评论