




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
_课题名称: Web资源自动获取技术研究与应用(JAVA实现) 学 校: 中 南 大 学 学 院: 信息科学与技术学院 专业班别: 计算机软件专业NIIT081 姓 名: 谭东方 指导教师: 完成日期: 摘要随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如: (1) 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。 (2) 通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。 (3) 万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频/视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。 (4) 通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。 为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(generalpurpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。 关键字:网络爬虫程序,WEB爬虫,网页蜘蛛,网络机器人AbstractThis paper first introduces the key techniques and theories which are required in the realization of the extensible Spider, on the basis of which we then use the oriented-object methods to have analyzed and designed a Web Spider with extensibility. Finally, the programming work has been realized on the JCreator platform with the Java language. The designing of the extensible Spider is made up of two major parts: the Client crawler and the Server monitor. The Client is responsible for the page-collection job, which receives URL of the web pages to be crawled from the server and transmits those out of its crawling range. In order to reduce the response time, the page-collection has borrowed the multithreading technique to improve the systems performance. The URL transition has utilized the “Character Conversion” function of the MD5 algorithm and the “Splitting Constructor” of the hashing function. The server monitor takes charge of the arrangement of the active spiders and the transition of the arriving URL: the system would allocate an unique ID for every crawler to realize unified management as well as making a reasonable judgment for every URL from clients to determine which active spider this URL should be sent to. In the system, the running process, including the start and interruption, of the crawlers is completely controlled by the server, and the server can dynamically supervise the collection status of each of the crawler.It has been proved by the experiment that this system has the characteristic of good extensibility. Also, it is capable of adding the active spiders during the running process as well as remembering the collection interruption point .Meanwhile, weve found that the speed of the downloading pages as well as the number of the active crawlers is the key factor that would have an effect on the whole systems performance.Keywords: Extensibility; Web Spider; Multithreading; the URL Transition.第1章绪论:1.1课题背景随着国际互联网(internet)的迅速发展,网上的信息越来越多,全球目前的网页超过20亿,每天新增加730万网页。要在如此浩瀚的信息海洋里寻找信息,就像“大海捞针”一样困难。搜索引擎正是为了解决这个问题而出现的技术。搜索引擎是通过互联网搜索信息的重要途径。它要用到信息检索、人工智能、计算机网络、分布式处理、数据库、数据挖掘、数字图书馆、自然语言处理等多领域的理论和技术,具有很高的综合性和很强的挑战性。本文研究的内容是作为搜索引擎关键的一部分的网络爬虫,首先,简略介绍一下搜索引擎。1.1.1搜索引擎的分类和整体结构搜索引擎虽然所采用的技术和实现的方法各有不同,但是总体来说可以分为两类,一种是基于目录的搜索引擎,另一种是基于全文检索的搜索引擎。早期的搜索引擎很多都是基于目录的搜索引攀,由于人工干预较多,故在覆盖的范围上要远远的小于基于信息采集器的搜索引擎。一般来说,由于使用了人(专家)来对网站进行归纳和分类,网站分类技术为网络信息导航带来了极大的方便,广受人们的欢迎。但是它的缺陷除了成本较高之外,对网站的描述也十分简略,其描述能力不能深入网站的内部细节,因此用户查询不到网站内部的重要信息,造成了信息丢失1。例如:如果对一个进行电脑硬件销售站点的目录分为是商业与经济公司电脑硬件公司。对其描述为“显示器、电源、硬盘内存等销售”。用户在以“显示器”、“硬盘”为关键字进行检索时,就能检索到。但如果该站点中还包含有对于主板和显卡的介绍,用户在检索“主板”、“显卡”时,就无法检索到了。同时,对于基于目录的搜索引擎技术而言,其覆盖范围相对与基于全文检索的搜索引擎而言十分有限。目前,在国内外各主要商业搜索引擎在技术上主要使用了全文检索技术,下面对基于使用全文检索技术的搜索引擎进行讨论。基于全文检索技术的搜索引擎主要由三部分组成,如图1-1所示,信息采集器(网络爬虫),索引器、搜索接口。图1-1搜索引擎的基本构成信息采集器:主要功能就是搜集互联网上的信息资源(主要是网页和文字信息资源)。运行信息采集器时,只要提供极少量的起始网页,信息采集器就能够按一定的规则沿着网页上的超级链接在网络上漫游,收集资源信息,直至遍历整个网站。它的性能在很大程度上影响了搜索引擎站点的规模。这部分是本论文要讨论的重点。索引器:由信息采集器从网上取来的信息杂乱无章,如果把它们直接用于查询,效率将极为低微。索引器的主要功能就是分析收集的信息,建立索引库以供查询。它主要用到的技术有分词、索引词选取、停用词过滤、索引归并、索引压缩、索引更新、倒排文件缓存。查询接口:它是用户与搜索引擎的接口。它通常是一个Web应用程序,主要负责接收、解释用户的请求、查询索引库以及返回排序后的搜索结果。它的用户界面友好与否是用户能否最大限度地使用搜索引擎功能的关键。信息采集模块主动派出信息采集器进行自动搜索,信息采集器自动地在网上漫游,从一个URL或一组URL开始,访问该URL,记录该URL所指文件中所有新的URL。然后再以这些新URL的为起点,继续进行本地索引,直到再没有满足条件的新URL为止。对于一些新出现的网站或在自动搜索中有所遗漏的站点,用户也可以自行向搜索引擎提交网站地址,使得站点内容能被及时得以搜索。得到网页内容后,信息预处理模块过滤文件系统信息,为文件系统的表达提供各种满意的索引输出,获取最优的索引记录,使用户能很容易地检索到所需信息。信息预处理模块要完成以下一些功能:格式过滤、词语切分、词性标注和短语识别等。最后这些被处理完的信息被送入一个数据库中,使用者在执行查询时,实际上是从这一数据库中寻找匹配网页、或资料的过程。全文检索己是一个比较成熟的技术,它能够解决对大量网页细节的检索问题。从理论上说,只要网页上出现了某个关键词(如果是中文,这个关键词必须是一个词或者是词的组合),就能够使用全文检索用关键词匹配把该网页查出来。1.1.2网络爬虫研究现状网络爬虫,又称为Robots,Spiders以及Wanderers,几乎与网络同时出现。第一个网络爬虫是Matthew Gray的Wanderer,出现于1993的春天。在头两届国际万维网会议上出现过数篇关于网络爬虫的论文,如文献24。但是那时候互联网上的信息规模比现在要小得多,那些文章中并没有阐述如何处理现在所面临的海量网络信息的技术。每个搜索引擎的后台,都有相应的网络爬虫在工作着。但是出于互相竞争的原因,这些网络爬虫的设计并没有公开,除了以下3个:Google Crawler,InternetArchive Crawler以及Mercator5。搜索引擎Google中,采用了多台机器进行分布式爬行6。它的网络爬虫包括5个功能模块,分别运行在不同的进程中。一个URL Server进程负责从一个文件里读取URL(Uniform Resource Locator),并把它们分发给多个Crawler进程。每个Crawler进程运行在不同的机器上,采用单线程和异步I/O同时从近300个网站上获取数据。所有的Crawler将下载来的数据传输到同一个StoreServer进程,它将这些页面压缩并存放在磁盘上。Indexer进程将这些页面从磁盘上读出,它将URL从HTML页面中抽取出来,并将它们存放在另一个磁盘文件中。一个URL Resolver进程读取这个存放链接的文件,将其中的相对链接转化为绝对链接,然后存入一个文件,这个文件供URL Server进程读取。Internet Archive Crawler也使用多台机器进行爬行7。每个Crawler进程可分配64个站点同时爬行,并且每个站点最多只分配给一个Crawler来爬行。每个单线程的Crawler进程从磁盘中读取分配给其爬行的站点的种子URL,把它们发送到各自站点的爬行队列中。然后采用异步I/O从这些队列读取链接,下载对-3-哈尔滨工业大学工学硕士学位论文应的网页。一旦一个HTML网页下载下来,Crawler就将包含在其中的链接抽取出来。如果链接指向同一个网站,那就将该链接加入到该站点的队列中;否则,就将该链接存放到磁盘中。一个批处理进程周期地将这些链接进行过滤,去除重复链接,并把它们放入相应站点的队列中。Mercator是一个在可扩展性方面做得非常出色的Crawler8。Mercator完全用Java实现。它采用的数据结构可以不管爬行规模的大小,在内存中只占有限的空间。这些数据结构的大部分都在磁盘上,在内存中只存放有限的部分,伸缩性很强。Mercator采用模块化设计的思想,通过替换以及增减模块可以很方便地实现各种功能,如进行各类Web信息统计以及Web快照,体现了良好的可扩展性。Mercator由5个部分构成,分别负责:给即将付诸下载的URL进行排序;将主机名解析为IP地址;使用HTTP协议下载文档;从HTML文档中提取链接;检测一个URL是否已经遇到过。一个网络爬虫程序通常网络爬虫从种子URL开始,通过网页内容解析,跟随网页上的超链接进行下载。互联网上的信息更新很快,必须定期更新已经搜集过的旧信息,避免无效链接,同时获取最新信息。只有高效深度的挖掘才能使搜索引擎提供全面、即时的服务。应用于大规模系统的数据采集软件有两个主要设计要求:一是必须有合理的挖掘策略,主要是何时下载哪些页面。常用策略包括:主题式挖掘,根据URL链接分析和网页内容对URL列表进行主题分类,然后根据类别进行有目的的挖掘;分级式挖掘,根据站点规模、权威性、数据更新频率等参数将站点列表进行分级,实现等级式采集。二是必须要有高度优化的采集架构,能高速下载大量网页,要占用合理的网络流量、具有鲁棒性、易于管理。目前主要采用服务器集群技术,由中央控制软件进行任务分发、负载平衡和运行监控。第2章分布式网络爬虫基本构架本章讨论一个良好的网络爬虫的设计目标,然后讨论单个结点的结构设计,最后讨论分布式网络爬虫的结构设计2.1聚焦爬虫工作原理网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件,如图1(a)流程图所示。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止,如图1(b)所示。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。 相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题: (1) 对抓取目标的描述或定义; (2) 对网页或数据的分析与过滤; (3) 对URL的搜索策略。 抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。2.2抓取目标描述现有聚焦爬虫对抓取目标的描述可分为基于目标网页特征、基于目标数据模式和基于领域概念3种。 基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。根据种子样本获取方式可分为: (1) 预先给定的初始抓取种子样本; (2) 预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等; (3) 通过用户行为确定的抓取目标样例,分为: a) 用户浏览过程中显示标注的抓取样本; b) 通过用户日志挖掘得到访问模式及相关样本。 其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。 现有的聚焦爬虫对抓取目标的描述或定义可以分为基于目标网页特征,基于目标数据模式和基于领域概念三种。 基于目标网页特征的爬虫所抓取、存储并索引的对象一般为网站或网页。具体的方法根据种子样本的获取方式可以分为:(1)预先给定的初始抓取种子样本;(2)预先给定的网页分类目录和与分类目录对应的种子样本,如Yahoo!分类结构等;(3)通过用户行为确定的抓取目标样例。其中,网页特征可以是网页的内容特征,也可以是网页的链接结构特征,等等。2.3系统结构2.3.1 单个Spider的系统结构图单个Spider的系统结构如上图所示.每个爬虫从一组种子URL开始,首先根据初始URL并按照机器人拒绝协议检测被访问主机是否允许访问该URL,通过检测后由HTTP/HTTPS下载模块下载该网页。URL抽取器从下载的网页中抽取出新的URL,然后由URL过滤器逐个检测URL是否符合过滤器限制。最后,用哈希函数计算各个URL的哈希值,如果属于本Spider的爬行范围,则将该URL加入到本地URL数据库中;否则把该URL插入到URL发送队列中,由URL分发器定时转发给对应的Spider.2.3.2 可扩展Spider的系统结构图及其爬行策略如图上图所示,为了能够高效地采集页面数据,我们在Spider系统中采用了Client/Server结构。“网络蜘蛛”由一台或多台Spider构成,它们通过内部通信,由信息服务器统一管理并协同工作。由于Spider的效率受采集平台、网络性能等诸多限制,为了达到比较理想的采集速度,我们采用了用多个Spider同时并行采集的策略。具体并行的Spider个数需要根据实际的采集速度要求和网络环境而定。显而易见,采用服务器/采集器的结构使采集系统具有很好的可扩展性。管理员可根据系统采集规模的变化动态地调整采集器的数量,在保证系统性能的前提下尽量减少系统开销,达到最佳的性能/价格比。而且在规模动态变化的过程中,系统能维持一致的管理和数据输出接口。这里所说的信息服务器主要负责对全局URL队列中的URL进行分发、对采集到的页面信息和文件信息进行缓存和压缩以及在采集过程中的一些协调和控制。为了实现的简单性,我们采用了轮转法进行分配。并且当某个Spider没有待采集的URL时,它也会主动向URL分发器发送URL请求。每个Spider的任务就是将信息服务器分配给它的URL按照到来的先后顺序插入到自己的URL队列中,然后不停的从队首取出URL进行采集,直到自己的URL队列为空。为了提高进一步的采集效率,在每个Spider上我们采用了多线程方式。3 可扩展Spider使用的关键技术3.1 相关协议的介绍Internet构建在很多相关的协议基础上,协议(Protocol)是用于两个或多个系统之间协作通信的方式。该系统的实现是基于Internet协议之上的,主要有:Socket套接字协议,HTTP超文本传输协议,HTTPS超文本传输安全协议,下面就这些协议作一一介绍。3.1.1 Socket套接字协议“套接字”(Socket)是一种软件形式的抽象,用于表达两台机器间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象它们之间有一条虚拟的“线缆”。套接字不关心数据的格式,它和底层的TCP/IP协议都只需确保数据到达正确的目的地。套接字的工作很像邮政服务,它们所做的就是将信息分遣到世界各地的计算机系统。Java有非常简单的套接字编程,其中定义有两个类:Socket和ServerSocket,在套接字程序设计中特别重要。如果编写的程序是扮演服务器的角色,它就应该使用ServerSocket;如果程序是连接到服务器的,那么它扮演客户端的角色,就应该使用Socket类。无论是通过子类ServerSocket完成的服务器还是客户端,Socket类只用于最初的开始连接,一旦连接建立,就使用输入和输出流来促进客户端和服务器之间的通信。连接成功后,客户端和服务器之间的区别就完全没意义了。任意一端都可以往套接字读写数据。从套接字得到的结果是一个InputStream以及OutputStream(若使用恰当的转换器,则分别是Reader和Writer),以便将连接作为一个IO流对象对待。一旦客户(程序)申请建立一个套接字连接,ServerSocket就会返回(通过accept()方法)一个对应的服务器端套接字,以便进行直接通信。从此时起,我们就得到了真正的“套接字套接字”连接,可以用同样的方式对待连接的两端,因为它们本来就是相同的!此时可以利用getInputStream()以及getOutputStream()从每个套接字产生对应的InputStream和OutputStream对象,这些数据流必须封装到缓冲区内。 客户端套接字编程步骤首先,构造客户端套接字。当客户端套接字被第一次实例化时,必须指定两个参数:连接的主机和将要连接的端口号,例如: .Socket s=new Socket(ip地址,端口号port);其次,如果在连接指定的主机时出现任何错误,Socket构造函数将抛出IOException。一旦连接成功,就通过Socket.getInputStream和Socket.getOutputStream方法获得输入和输出流。例如: _out=new java.io.PrintWriter(s.getOutputStream(); _in=new java.io.BufferedReader(new Java.io.InputStreamReader(s.getInputStream(); 服务器套接字编程步骤首先,构造服务器套接字。ServerSocket对象有几个可利用的构造函数,最简单的构造函数仅仅接受程序将要侦听的端口号,例如: try s=new ServerSocket(端口号port); catch(Exception e) System.out.println(“Error:”+e); retrun; try语句块是必须要的,因为当程序尝试注册端口号port时,可能会出现不少错误,导致最常见的错误原因是本机已经有服务器在侦听端口port。其次,一旦程序成功注册了端口port,它就可以开始侦听连接了。以下代码是用于等待连接的: Socket remote=s.accept(); 通过accept返回的Socket对象正好和客户端套接字使用的是同一个类。一旦连接被建立,客户端套接字和服务器套接字之间的不同就消失了。客户端套接字和服务器套接字之间的主要的不同就在于它们的连接方式,客户端套接字连接到其他端,而服务器套接字等待其他端连接它。3.1.2 HTTP/HTTPS协议HTTP(Hypertext Transfer Protocol)是建立在TCP/IP网络协议基础上的用于WWW数据传输的标准协议。通过HTTP协议,搜索引擎与WWW服务器建立通信机制,向服务器提出对网页各种特征提取的请求,并从服务器的应答中获得相应数据。HTTP协议的通讯包是由头字段和实体两部分组成。头字段用于描述各种信息,实体用于装载内容息。重要的头字段有HTTP/1.1(版本号)、Server(服务器类型)、Date(获取时间)、Content-type(媒体类型)、Last-modified(最后修改时间)、Content-length(内容长度)等。了解了HTTP请求/响应通讯包的构造方法,可以很容易获取网页的内容。HTTPS(Hypertext Transfer Protocol Secure)在许多方面都非常类似HTTP,由于提供底层加密协议的安全套接字层(Secure Socket Layer,简称SSL),才使HTTPS与HTTP有所区分。一旦数据包被解密,协议的大多数元素都是相同的。3.2 URL地址结构及分类 Internet上的位置是通过URL(Uniform Resourse Locator,统一资源定位器)来指定的。这就是唯一标识Internet上具体资源的地址。例如,/images/jeffpic1.jpg 就唯一标识了一副存储在Web服务器上的图像。 URL由Scheme(模式),HostnameJ(主机名),Port(端口),Path(路径)和Anchor(锚点)组成,其中某些URL的端口号和锚点可以省略URL有绝对和相对之分,绝对URL将指定一个准确的、无歧义的Internet资源位置。绝对URL包含主机名和文件名。例如:/myfile.html,就是一个绝对的URL:主机名,myfile.html是文件名。相对URL仅指定绝对URL的一部分,从来不指定http:/前缀。通常,相对URL只是一个文件名。如果相对地址以斜杠(/)开始,则表示“直接来源于主机”。这意味着它将使用同样的主机名,完全替换其中的主机名。不以斜杠开始的相对地址,将被简单地连接到正在查看页面所在的目录。3.3 多线程与线程同步多线程是一个程序在同一时刻运行超过一个任务的能力。但多线程不是多任务,二者区别是:多线程是在一个程序内部,多任务是在一个计算机内部。在实际应用中,基于单线程的系统无法满足我们的需要。当一个应用程序正在下载某个文件时,我们并不希望它只专注于原来的任务,也许我们还想同时用它来打开已经下载的多媒体文件或者向它添加新的下载任务,在这个时候,我们要用多线程来打造一个反应灵敏的用户界面。多线程的另一个作用是用来提高系统的并发性。对于多CPU的PC,多线程实现了真正的并行,使程序高效的运行。对于单CPU的PC来说,操作系统会自动进行任务切换,给人的感觉是同时发生的,其实并不是真正的并发。但是一旦这些任务在执行过程中需要等待,那这种伪并行会在一个任务等待其它资源的时候执行其它任务,以解决程序中存在的瓶颈问题。例如,一个Spider程序需要下载十个网页,要完成这个任务,Spider程序必须向服务器发出请求然后接收数据,而Spider程序等待响应是一个平颈。若采用多线程则可提高效率,因为众多的线程允许这十个网页的等待时间结合在一起,而不是让他们一个接一个地执行。如果让Spider仅等待一个网页效率是十分底的,多线程能让Spider同时等待大量的网页。线程一起工作时,不仅必须共享数据,而且还必须知道其它线程的状态和活动。当你创建了一个多线程时,就相当于建立了一支规定人数的军队。你让他们各自不停地去执行相同的任务。比如这些军人都是工兵,你给他们下达了排除某地地雷的任务,任务的具体内容就是:每个人都独立地去发现地雷、排除地雷、作好标记(即多线程)。这些工兵在给定范围内重复相同的动作,他们之间会协调各自的行为。任何一个工兵都不会在已经排完雷、作好标记的地区再进行排雷,也不可能几个工兵聚集在同一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木竹浆在环保型胶粘剂中的应用考核试卷
- 设计类课程全攻略
- 2025办公室租赁合同范本办公室租赁合同格式
- 珍爱生命 预防溺水-小学生防溺水安全教育
- 2025南京汽车租赁合同范本2
- 2025版权合同模板
- 2025标准简易建筑工程承包合同范本
- 2024-2025湘科版科学一年级下册第一单元测试卷及答案
- 幼儿园大班剪纸《窗花》课件
- 2025高中生物学教师课标考试模拟试卷及参考答案 (二套)
- 栽树劳务合同协议
- 2025年不动产登记代理人《不动产登记代理实务》考前必刷题库(含真题、重点440题)含答案解析
- 酒馆加盟代理协议书
- 加油站站长试题及答案
- 环境突发事件应急预案演练记录
- 外研版(三起)(2024)三年级下册英语Unit 3 单元测试卷(含答案)
- 人教版中职数学拓展模块一:6.2复数的运算课件(共24张课件)
- 2024年同等学力申硕《英语》试题真题及答案
- 公共资源交易知识培训
- 《危机管理案例》课件
- DB13-T5687-2023负压封闭引流术护理规范
评论
0/150
提交评论