一种面向主题的获取动态页面内容的方法及系统的制作方法

文档序号:6365969阅读:120来源:国知局
专利名称:一种面向主题的获取动态页面内容的方法及系统的制作方法
技术领域
本发明属于网络数据采集技术领域,尤其涉及一种面向主题的获取动态页面内容的方法及系统。
背景技术
当今是信息技术高速发展的时代,各种新事物层出不穷,网络信息呈爆炸趋势,如何从海量数据信息中获取有用的信息,在很多领域和行业中成为一种必需的支撑手段,能够最快最全地掌握行业领域相关的信息往往有利于做出恰当的抉择。与此同时,互联网信息爬取技术已经有了相当发展,尤其是在通用搜索领域,提供给用户的信息量比以前更大,处理用户请求的响应时间也大大提高;特定于客户需求的服务也越来越人性化,搜索内容 也从文本、图片覆盖到当今的热门领域-视频。然而随着信息多元化发展,对于特定领域和特定主题的搜索需求越来越多,但通用搜索技术在这些领域的召回率和准确率通常无法满足特定的需求。于是垂直搜索技术应运而生,由于其提供的信息相关度高、同主题信息更多更深入、目标群体更为明确等特点,当前该领域的新技术与新应用越来越广泛。尽管垂直搜索与通用搜索一样面临着在互联网抓取过程中如何爬取动态页面信息的问题,但由于垂直搜索面向的用户更为具体,需求更为明确,因此如何提供更为全面的基于主题的动态页面信息是垂直搜索引擎的生存基础。目前在垂直搜索领域,如何获取动态页面方面已经取得了一些进展,例如在获取动态页面信息上多采用在抓取客户端中嵌入浏览器内核的方式来获取动态内容,然而该方式虽能获取到一定层次的动态内容,但由于浏览器解析过程中加载了页面布局模块、大量的兼容性代码、与主题无关的动态图片或Flash以及各种广告联盟的广告推广代码等与抓取主题无关的内容,因此时空效率比较低下。为此有人提出将JavaScript解析器嵌入到抓取过程中来实现动态抓取的方式,通常的做法是获取页面、构造D0M、标记DOM中的JavaScript、构造宿主对象、执行JavaScript、返回动态页面。通过这种方式虽然减少了与抓取主题无关的页面布局代码、兼容性代码和图片操作代码等内容的加载解析,但仍然存在着一些缺点1.加载与主题无关的JavaScript ;2.从远程主机请求外部JavaScript文件的时间效率低;3.在执行JavaScript获取的动态页面内容丢失了原页面中存在的部分信息。鉴于这种状况,本申请在这里提供一种新的面向主题的获取动态页面内容的方法。

发明内容
针对当前普遍采用的以嵌入JavaScript解析器的方式实现动态页面内容获取的方法存在的问题,本发明的目的在于提供一种面向主题的获取动态页面内容的方法及系统。本发明提出以下解决方案,通过建立JavaScript过滤库以过滤与主题无关的JavaScript文件,从而减少加载与主题无关的外部JavaScript文件;通过建立JavaScript本地库以便从本地加载原本需要从远程主机加载的JavaScript文件,从而减少与远程主机之间的交互,进而减少加载外部JavaScript文件所需的时间;通过将原页面中存在而JavaScript解析器解析后的动态页面中缺少的信息加入到动态页面中来提高动态页面的完整性。本申请提供一种面向主题的获取页面动态内容的方法及系统,用以解决垂直搜索领域如何爬取动态页面信息的问题,技术方案如下本 申请提供一种面向主题的获取页面动态内容的方法,具体步骤如下I.建立 JavaScript 过滤库分析每一个抓取页面内部的JavaScript文件,根据其是否与抓取主题相关来决定是否将其相关信息存入到JavaScript过滤库,并增加库维护模块。2.建立 JavaScript 本地库初始存入常见的JavaScript文件,然后根据每一次远程请求的外部JavaScript文件来完善该JavaScript本地库,并增加库维护模块。3.提供生成各种宿主对象的类主要包括JavaScript语言本身不存在但在执行JavaScript代码时可能需要访问的对象。4.获取页面信息基于正确的页面编码获取页面信息。5.生成当前页面的DOM对象利用DOMParser, HTMLParser等HTML解析器生成该页面的DOM对象,当前页面中如果使用到相关宿主对象,则从步骤3提供的宿主类中实例化相应对象。6.标记是否需过滤JavaScript文件根据步骤I中提供的JavaScript过滤库信息来检验页面中请求的外部JavaScript文件是否需要继续加载处理,如果该文件在JavaScript过滤库中存在,则在该页面对应的DOM对象中相应位置设置无需加载的过滤标记,否则设置正常加载标记。7.标记是否需请求JavaScript本地库 如果当前处理的JavaScript文件不是当前站点内部文件并且该文件在JavaScript本地库中存在,则设置从JavaScript本地库加载的本地标记,否则设置正常加载标记。8.执行页面中的JavaScript利用JavaScript解析器执行页面中的JavaScript获取动态页面信息,其中需要加载外部JavaScript文件时应根据步骤6和7中设置的过滤标记和本地标记来判断是否需加载该文件以及是否从JavaScript本地库加载该文件。9.保存动态页面信息主要包含通过Asynchronous JavaScript and XML (简称Ajax)请求动态获取的
页面信息。10.获取整合后的页面信息通过执行JavaScript获取的动态页面可能会丢失一些原页面中存在的信息,将这部分丢失的信息重新加入到动态页面中,从而提高页面信息的完整性。本申请还提供一种面向主题的获取页面动态内容的系统,具体步骤如下
I. JavaScript 过滤库用页面中与抓取主题无关的JavaScript文件建立JavaScrip过滤库,并提供用于判别是否需过滤的模块。2. JavaScript 本地库初始库中存入常见的javaScript文件,然后基于每一次远程请求的JavaScript文件去完善该JavaScript本地库,并提供库维护模块。3.宿主对象生成模块
提供各种宿主对象的定义和生成方法。4.页面爬行器以正确的页面编码获取页面源代码的模块。5.页面DOM对象生成模块利用页面解析器生成当前页面的HTML DOM对象。6. JavaScript 过滤器基于JavaScript过滤库来判断当前页面中的JavaScript文件是否需要解析的模块。7· JavaScript本地库管理器提供维护JavaScript本地库的模块以及本地库自动加载模块。8. JavaScript 解析器嵌入外部的JavaScript引擎为执行页面中的JavaScript脚本提供支持的模块。9.动态页面管理器保存并维护通过异步JavaScript与XML(Ajax)请求的页面信息。10.信息整合模块该模块主要用来检验动态生成的页面是否丢失了原有页面中的一些内容,如果丢失则重新将其添加到动态页面中。以上技术方案,总体过程是首先建立JavaScript本地库,JavaScript过滤库和生成各种宿主对象,接着通过页面爬行器获取正确的页面信息,随后通过HTML DOM解析器生成该页面的DOM对象,在该过程中由JavaScript过滤器标记当前页面中的JavaScript文件是否需要解析,由JavaScript本地库管理器标记当前页面中的JavaScript文件是否需从JavaScript本地库加载,之后由JavaScript引擎执行当前页面中存在JavaScript文件,与此同时,将解析过程中由Ajax请求获取的页面保存在动态页面库中,接着将 JavaScript解析器解析后的页面信息经由信息整合模块处理,最后返回更为完整的页面内容,其中JavaScript解析器中的数据流如图6所示。与现有技术相比,本发明的积极效果为应用如上技术方案,垂直搜索引擎在爬取过程中可以获取更为完整的动态页面信息,而且与现有的调用浏览器内核或者调用JavaScript解析器的方案相比具有更高的时效性。


图I是本申请方法实现获取动态内容的方法流程;
图2是本申请方法中页面爬行器的结构示意图;图3是本申请方法中JavaScript过滤库模块的结构示意图;图4是本申请方法中宿主对象生成模块的结构示意图;图5是本申请方法中JavaScript本地库模块的结构示意图;图6是本申请方法中JavaScript解析器模块的数据流程图。
具体实施例方式如图I所示由本方法所构建的网页动态内容获取方法主要包括I.建立JavaScript过滤库;2.建立JavaScript本地库;3.提供生成各种宿主对象的类;4.获取页面信息;5.生成当前页面的DOM对象;6.标记是否需过滤JavaScript文件;7.标记是否请求JavaScript本地库;8.执行页面中的JavaScript代码;9.保存动态页面信息;10.获 取整合后的页面信息。该方法对应的系统为I. JavaScript过滤库,如图3 ;2. JavaScript本地库,如图5 ;3.宿主对象生成模块,如图4;4.页面爬行器,如图2 ;5.页面DOM对象生成模块;6. JavaScript过滤器;
7.JavaScript本地库管理器;8. JavaScript解析器;9.动态页面库管理器;10.信息整合模块。其中,页面爬行器用来获取目标页面初始源码,是整个系统持续运行的基础;JavaScript过滤器用来维护需要解析的JavaScript文件以及确定当前的页面中是否有无需分析的文件,是减少与目标无关的资源加载的关键ー步;宿主对象生成模块实现了 HTMLDOM、EVENT、CSS、Browser Object Model、XMLHttprequest 规范定义的接 ロ,是 JavaScript解析器正确解析、执行页面中JavaScript代码的关键JavaScript本地库管理器提供了大多数常用的JavaScript文件,尽可能将远程请求转换为本地请求,以便减少与远程主机的交互,是减少加载外部JavaScript文件的关键所在;动态页面库管理器主要用来存储当前页面中通过Ajax请求获取的动态页面内容,为信息整合模块提供必须的资源;信息整合模块主要用于提高目标内容的完整性。为了便于本领域工程技术人员实施,下面详细说明该方法的实施步骤步骤一建立JavaScript过滤库基于主题建立与目标内容无关的JavaScript过滤库,该库中主要包含两类可执行的文件1.与主题明显无关的JavaScript文件,例如用来改变页面布局的JavaScript文件;2.用于在线统计客户满意度,插入第三方广告推广代码等功能的文件,例如在线统计客户满意度代码ForSee Results Survey Code,百度联盟、淘宝联盟以及GoogleAdSense提供的以JavaScript形式实现的广告服务。该库中内容的选择,主要使用逐一分析加入到抓取URL集中的页面,通过判断其中所包含的外部JavaScript文件是否与抓取主题相关来决定是否将其存入JavaScript过滤库。在选择过程中需要注意以下几点(I)对于ー个主题而言无用的第三方JavaScript文件可能对于另ー个主题来说是必须的。(2)如果第三方JavaScript文件包含多个JavaScript文件,需要确保包含的文件具有完整的逻辑依赖性。(3)存储第三方JavaScript文件时以该JavaScript文件名称中的关键词部分命名。关键词部分,可以以此种方式来实现,比如ForSee集合,通常以*_ForSee_*形式来命名,那么此时的关键词部分就是指ForSee。另外,针对该JavaScript过滤库增加ー些辅助功能A.增加增删改查方法,以便于提供人工更新库中信息的接ロ。B.过滤外部JavaScript文件在加载外部JavaScript文件时,通过文件名称中的关键词部分去搜索JavaScript过滤库,如果能在该库中找到匹配的JavaScript文件,则在DOM树相应位置设置过滤标记I (即无需加载该文件),否则设置正常加载标记O。步骤ニ 建立JavaScript本地库该库初始应该加入jQuery, Ext, Do jo, Google Web ToolKit, ProtoType, YUI 等文件集合,根据关键字为各个文件集合建立关键字与文件集合的一対一映射关系,以便于加载时准确快捷。随后根据每一次去当前站点外请求的JavaScript文件名称的关键字部分来检验是否在JavaScript本地库中存在,如果不存在则发出Ajax请求获取该文件并保存到JavaScript本地库;如果存在则不用发送请求,直接进行本地下载。为方便后面的环节使用该JavaScript本地库,需为该库增加增删查的维护功能和标记是否从该库加载的功倉^:。A.增删查的功能具体如下(I)增加JavaScript文件到JavaScript本地库,需要检验该文件的逻辑完整性,比如增加jQuery UI子文件,应保证增加jQuery-Core文件。(2)从JavaScript本地库中删除JavaScript文件,需要保证文件的逻辑依赖性,比如首先删除jQuery UI,而不能首先删除jQuery-Core,当且仅当没有其他文件对jQuery-Core有依赖后才可以删除jQuery-Core。(3)每个文件集合包含的子文件,以及子文件之间的依赖关系通过XML文件进行配置。
B.检验是否从JavaScript本地库加载文件依次顺序检验当前DOM树中每ー个JavaScript文件的对应结点处设置的过滤标识来验证该文件是否需要被加载,此时分两种情况(I)如果是过滤标识为1,即无需加载,则不予处理本请求,直接处理当前DOM树中下ー个JavaScript文件对应的结点,如果当前结点是DOM树中最后ー个结点,则终止整个检验过程;(2)如果是正常加载标识0,则根据该JavaScript文件的关键字部分在JavaScript本地库中查询其中是否存在该文件,此时分两种情况i.如果存在,则设置该文件在对应DOM树结点的标识属性为2,即从JavaScript本地库加载;ii否则继续处理当前DOM树中下ー个JavaScript文件对应的结点,如果当前节点是DOM树中最后ー个结点,则终止整个检验过程。JavaScript文件的关键字部分根据步骤ニ B项中的方式来确定。该部分加载文件的方式与步骤一中页面爬行器采用的方式大体一祥,不同之处在于加载JavaScript文件时,直接采用UTF-8编码方式,不进行编码识别。步骤三提供生成各种宿主对象的类A.实现 HTML DOM 对象基于DOM规范实现相应等级的DOM对象,该模块应该包含相应等级对应规范中定义的所有DOM对象,其中要保证常见对象的所有属性以及所有对象的常用属性必须实现,以确保在JavaScript解析器在执行时能够找到相应的DOM对象。
B.实现CSS对象由于本申请方法以及系统中只关注页面中的目标内容,因此涉及页面布局、展示方式的CSS只提供基本的实现即可,该实现中至少应该包括如下部分css样式转文本property的操作方法、CSS样式与文本转换的方法、CSS支持的样式集合、CSS选择器规则以及CSS样式表的解析模块。注意,如果不提供该实现会造成JavaScript解析中找不到相应属性或方法等异常。C.实现 EVENT 对象该模块部分,应该实现Event注册·、Event派发功能,主要用于触发onload、onunload、onerror等以on开头的事件。D.实现BOM对象该模块主要用于JavaScript解析器在执行JavaScript代码时访问浏览器对象的情况,必须实现窗ロ(Window),历史(History),导航器(Navigator),屏幕(Screen),文档(Document),位置(Location)六个对象,其中窗ロ (Window),历史(History),文档(Document),位置(Location)这四个常用对象的属性和方法实现要全面,对于未实现部分要给出异常信息提示。E.实现 XMLHttpRequest 对象该对象的实现中应该包括,open,send, setRequestHeader, getResponseHeader,getResponseHeaders方法,其中send方法中需要对Cookie做相应处理。步骤四获取页面信息需要抓取的url地址来源于特定于主题的URL集合,代码获取部分与传统互联网抓取客户端类似,主要包括两个部分A.识别页面编码首先通过HTTP响应头获取Content-Type字段,如果该字段中不包含charset字符,则以GBK,UTF-8等字符集中任意一种作为当前字符集读取页面的一部分代码,然后查找其中的charset字符串从中截取charset,如果仍然不能确定字符集,则默认当前字符集为 UTF-8。B.读取页面本步骤与传统互联网客户端采用的技术ー样,通过URL(Uniform Resource,统ー资源定位符)地址读取该地址对应的页面代码内容。步骤五生成当前页面的DOM对象利用HTMLParser等HTML解析器解析当前页面,该解析器具有在DOM树的每个javascript结点上增加ー个标识flag属性的功能,其中flag意义为0代表正常;1代表需过滤;2代表需向本地JavaScript框架库请求该文件。步骤六标记是否需过滤JavaScript文件遍历当前页面的DOM树,对所遇到的JavaScript结点利用步骤ー辅助功能B设置过滤标识。步骤七标记是否请求JavaScript本地库遍历当前页面的DOM树,对所遇到的JavaScript结点利用步骤ニ B中的方法设置是否从JavaScript本地库加载标识。步骤八执行页面中的JavaScript代码
这里可以采用现有的JavaScript解析器,比如SpiderMonkey, Rhino或者Googlev8等JavaScript引擎,采用其中任何一种引擎,都应该首先将步骤三中所描述的所有宿主对象加载进去。需要执行的JavaScript代码具体分为两部分(I)在构造DOM对象过程中加载外部JavaScript文件,或执行页面中存在的代码段或存在于属性值内部的代码语句(2)在构造DOM结束后,触发onload等以on开头的注册事件所包含的代码,其中既包括页面中调用注册· onload等事件,也包括加载的外部JavaScript文件中包含的onload等事件。其中,JavaScript文件是指通过HTML标签的src属性加载的外部JavaScript文件,代码段是指存在于HTML标签〈scriptX/script〉之间的代码,代码语句是指存在于HTML标签属性值中以JavaScript :方式开头的语句。在执行代码过程中,根据每个需要从外部加载的JavaScirpt文件所对应的DOM结点上的flag属性来决定是否需要加载和是否需要从JavaScipt本地库加载该文件,如果需要则从JavaScript本地库加载,否则按照原有方式请求远程主机。步骤九保存动态页面信息将当前页面中所涉及到的所有JavaScript代码中发出的Ajax请求获取到的页面保存为当前页面的动态页面库。对于库中的每个页面,只有〈body〉标签内部部分对于主题来说是有意义的,因此提取出姆ー个页面〈body〉标签内部的内容,嵌套在<div>标签内。步骤十获取整合后的页面信息对于每个当前页面都建立一个动态页面库,遍历当前动态页面的动态页面库,针对每个动态页面,对它的根<div>标签执行以下算法,其中该算法根据深度优先的顺序来取下一个标签,另需要初始化ー个空栈(I)取根div标签下的第一个元素;(2)如果该元素不存在,弹出栈顶元素,然后获取栈顶元素,此时如果栈顶元素为空,转步骤(7),否则取出该元素中的下ー个元素,此时如果该元素的下ー个元素为空则弹出栈顶元素,此时如果栈为空,则转步骤(7);如果该元素为文本内容,则转向步骤(4);(3)如果标签内部包含标签,则将当前标签压入栈中,取出该标签(即当前标签)下第一个元素,转步骤(2),否则取出该标签的文本内容;(4)在前面已经构造好的D0M(即当前页面的DOM树)中查询该本文内容;(5)如果找到,则获取栈顶元素,如果为空,则转向步骤(7),否则取出该元素中下ー个元素,转向步骤⑵;
(6)将该文本内容放在根标签<div>内并插入到当前页面主体标签〈/body〉前面的位置,获取栈顶元素,并取其中的下ー个元素,转向步骤2);(7)取下一个动态页面的根<div> ;(8)如果下ー个动态页面存在,则转步骤(I),否则结束处理。最终获取JavaScript解析器执行整个DOM操作后获取的动态页面源码与执行过程中未被插入进当前DOM的内容的结合页面信息,该页面信息与传统JavaScript解析后的 页面相比,提供了更为完整的页面信息。
权利要求
1.一种面向主题的获取动态页面内容的方法,其步骤为 1)在抓取服务器端建立一JavaScript过滤库和一 JavaScript本地库; 2)获取每一抓取页面的页面信息,生成当前页面的DOM对象;如果当前页面中使用宿主对象,则该抓取服务器将其实例化为相应对象; 3)根据所述JavaScript过滤库检验当前页面中请求的外部JavaScript文件,如果与主题无关,则在当前页面的DOM对象相应位置设置无需加载标记,否则设置正常加载标记; 4)对于标记为正常加载的外部JavaScript文件,如果当前处理的JavaScript文件存在于所述JavaScript本地库,则设置本地加载标记,否则设置正常加载标记; 5)执行当前页面中的JavaScript,获取动态页面信息;其中,根据加载标记加载外部JavaScript 文件; 6)检验获取的每一动态页面是否丢失了原有页面中的部分信息,如果丢失,则重新将丢失部分添加到动态页面中,得到整合后的页面信息。
2.如权利要求I所述的方法,其特征在于所述JavaScript过滤库存储与抓取主题无关的JavaScript文件;所述JavaScript本地库存储外部JavaScript文件。
3.如权利要求2所述的方法,其特征在于所述JavaScript过滤库还包括在线统计客户满意度,插入第三方广告推广代码功能的JavaScript文件。
4.如权利要求2或3所述的方法,其特征在于根据所述JavaScript过滤库检验当前页面中请求的外部JavaScript文件,如果该文件在所述JavaScript过滤库中存在,则在当前页面对应的DOM对象相应位置设置无需加载标记,否则设置正常加载标记。
5.如权利要求I所述的方法,其特征在于所述得到整合后的页面信息的方法为遍历当前动态页面的动态页面库,针对每个动态页面,初始化一个空栈并对它的根标签执行 a)取根标签下的第一个元素; b)如果该元素不存在,弹出栈顶元素,然后获取栈顶元素;此时如果栈顶元素为空,则取下一个动态页面的根标签,否则取出该元素中的下一个元素;此时如果该元素的下一个元素为空,则弹出栈顶元素;此时如果栈为空,则取下一个动态页面的根标签,如果该元素为文本内容,则从当前页面的DOM中查询该本文内容; c)如果标签内部包含标签,则将当前标签压入栈中,取出该标签下第一个元素,执行步骤b)的处理;否则,取出该标签的文本内容,从当前页面的DOM中查询该本文内容; d)如果从当前页面的DOM中找到查询的本文内容,则获取栈顶元素,如果栈顶元素为空,则取下一个动态页面的根标签;否则取出该元素中下一个元素,执行步骤b)的处理; e)将该文本内容放在根标签内并插入到当前页面主体标签〈/body〉前面的位置,获取栈顶元素,并取其中的下一个元素,执行步骤b)的处理; f)如果下一个动态页面不存在,则结束处理。
6.如权利要求I所述的方法,其特征在于该抓取服务器端包括一生成宿主对象的类,用于实例化相应宿主对象;所述宿主对象包括=HTML DOM对象、CSS对象、EVENT对象、BOM对象、XMLHttpRequest 对象。
7.如权利要求I所述的方法,其特征在于利用HTML解析器生成当前页面的DOM对象;所述 HTML 解析器为 DOMParser 或 HTMLParser。
8.如权利要求I或2所述的方法,其特征在于所述JavaScript本地库包括jQuery文件集合、Ext文件集合、Dojo文件集合、Google Web ToolKit文件集合、ProtoType文件集合、YUI文件集合,并检验文件的逻辑完整性;然后根据关键字为各个文件集合建立关键字与各个文件集合的一对一映射关系。
9.一种面向主题的获取动态页面内容的系统,其特征在于包括JavaScript过滤库,JavaScript本地库,宿主对象生成模块,页面爬行器,页面DOM对象生成模块,JavaScript过滤器,JavaScript解析器,信息整合模块;其中, 所述JavaScript过滤库,用于存储与抓取主题无关的JavaScript文件; 所述JavaScript本地库,用于存储外部JavaScript文件; 所述页面爬行器,用来获取目标页面初始源码; 所述JavaScript过滤器,用来维护需要解析的JavaScript文件以及确定当前页面中是否有无需分析的JavaScript文件; 所述宿主对象生成模块,用于提供各种宿主对象的定义和生成方法; 所述信息整合模块,用于检验获取的每一动态页面是否丢失了原有页面中的部分信息,如果丢失,则重新将丢失部分添加到动态页面中,得到整合后的页面信息。
10.如权利要求9所述的系统,其特征在于还包括JavaScript本地库管理器,动态页面库管理器;其中,所述JavaScript本地库管理器包括若干JavaScript文件,并检验文件的逻辑完整性;所述动态页面库管理器,用来存储当前页面中通过Ajax请求获取的动态页面内容,为信息整合模块提供资源。
全文摘要
本发明公开了一种面向主题的获取动态页面内容的方法及系统,属于网络数据采集技术领域。本方法为1)在抓取服务器端建立一JavaScript过滤库和一JavaScript本地库;2)获取每一抓取页面的页面信息,生成当前页面的DOM对象;3)根据过滤库检验当前页面中请求的外部文件,如果与主题无关,则在当前页面的DOM对象相应位置设置无需加载标记,否则设置正常加载标记;4)如果标记为正常加载的外部文件存在于本地库,则设置本地加载标记,否则设置正常加载标记;5)执行当前页面中的JavaScript,获取动态页面信息;6)获取整合后的页面信息。与现有技术相比,本方法具有更高的时效性、且动态页面信息完整。
文档编号G06F17/30GK102662966SQ20121006033
公开日2012年9月12日 申请日期2012年3月8日 优先权日2012年3月8日
发明者归文胜, 杨风雷, 黎建辉 申请人:中国科学院计算机网络信息中心
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1