网络爬虫(Spider)Java实现原理

合集下载

搜索引擎spider爬虫(蜘蛛)原理

搜索引擎spider爬虫(蜘蛛)原理

搜索引擎spider爬⾍(蜘蛛)原理做SEO的⼈应该要对搜索引擎的基本原理有⼀些了解,从搜索引擎发现⽹址到该页⾯拥有排名,以及后续更新整个过程中,搜索引擎到底是怎么⼯作的?你都需要了解。

对于专业的算法不必进⾏深⼊的研究,但是对于搜索引擎⼯作中的⽣命⼒和算法原理要有个简单的认知,这样才能更有效地开展SEO⼯作,知其然也要知其所以然;当然也有⼀些朋友不懂这些,照样做昨有声有⾊,但是有对搜索引擎⼯作原理,懂总⽐不懂好⼀点。

以往的SEO书藉中对这内容讲解都⽐较简单,希望在些能够尝试结合SEO实际⼯作和现象,更进⼀步剖析⼀下搜索引擎的⼯作原理,其实当你了解了搜索引擎的⼯作流程、策略和基本算法后,就可以在⼀定程序上避免因为不当操作⽽带来的不必要处罚,同也可以快速分析出很多搜索引擎搜索结果异常的原因。

有搜索⾏为的地⽅就有搜索引擎,站内搜索、全⽹搜索、垂直搜索等都⽤到搜索引擎;接下来,本⽂会根据从业认知,讨论⼀下全⽂搜索引擎的基本架构。

百度、⾕歌等综合搜索巨头肯定有着更为复杂的架构和检索技术,但宏观上基本原理都差不多的。

搜索引擎的⼤概架构如图2-1所⽰。

可以分成虚线左右两个部分:⼀部分是主动抓取⽹页进⾏⼀系列处理后建⽴索引,等待⽤户搜索;另⼀部分是分析⽤户搜索意图,展现⽤户所需要的搜索结果。

搜索引擎主动抓取⽹页,并进⾏内容处理、索引部分的流程和机制⼀般如下:1.派出spider按照⼀定策略把⽹页抓回到搜索引擎服务器;2.对抓回的⽹页进⾏链接抽离、内容处理,削除噪声、提取该页主题⽂本内容等;3.对⽹页的⽂本内容进⾏中⽂分词、去除停⽌词等;4.对⽹页内容进⾏分词后判断该页⾯内容与已索引⽹页是否有重复,剔除重复页,对剩余⽹页进⾏倒排索引,然后等待⽤户的检索。

当有⽤户进⾏查询后,搜索引擎⼯作的流程机制⼀般如下:1.先对⽤户所查询的关键词进⾏分词处理,并根据⽤户的地理位置和历史检索特征进⾏⽤户需求分析,以便使⽤地域性搜索结果和个性化搜索结果展⽰⽤户最需要的内容;2.查找缓存中是否有该关键词的查询结果,如果有,有为最快地呈现查询,搜索引擎会根据当下⽤户的各种信息判断其真正需求,对缓存中的结果进⾏微调或直接呈现给⽤户;3.如果⽤户所查询的关键词在缓存中不存在,那么就在索引库中的⽹页进⾏调取排名呈现,并将该关键词和对应的搜索结果加⼊到缓存中;4.⽹页排名是⽤户的搜索词和搜索需求,对索引库中⽹页进⾏相关性、重要性(链接权重分析)和⽤户体验的⾼低进⾏分析所得出的。

爬虫工作原理

爬虫工作原理

爬虫工作原理爬虫,又称网络爬虫、网络蜘蛛,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚本。

它可以在互联网上自动采集信息,并将采集到的信息存储在本地或者数据库中。

爬虫在搜索引擎、数据挖掘、网络监测等领域有着广泛的应用。

那么,爬虫是如何工作的呢?接下来,我们将从爬虫的工作原理来详细介绍。

首先,爬虫需要一个起始的URL,它会从这个URL开始抓取页面。

当爬虫访问一个页面时,它会解析页面内容,提取出页面中的链接,并将这些链接加入待抓取的URL队列中。

然后,爬虫会从待抓取的URL队列中取出一个URL,再次访问页面,重复上述的过程。

这就是爬虫的基本工作流程。

在访问页面时,爬虫需要注意一些细节。

比如,爬虫需要模拟浏览器的行为,设置合适的User-Agent,以免被网站屏蔽;还需要处理页面中的动态加载内容,确保能够获取到完整的页面信息。

另外,爬虫还需要处理页面中的重定向、验证码等情况,以确保能够正常地获取页面内容。

当爬虫抓取到页面内容后,它会进行页面内容的解析。

这包括提取页面中的文本信息、图片、链接等内容。

爬虫会根据预先设定的规则,提取出需要的信息,并将这些信息进行存储或者进一步处理。

在提取文本信息时,爬虫可能会用到正则表达式、XPath、CSS选择器等技术,以便能够准确地提取出目标信息。

在处理图片、视频等非文本内容时,爬虫可能会用到一些其他的技术。

比如,爬虫可能会下载图片到本地,或者将视频链接保存下来,以备后续处理。

这些非文本内容的处理,通常需要依赖于一些第三方的库或者工具。

除了页面内容的解析,爬虫还需要处理页面中的链接。

爬虫可能会根据一定的规则,筛选出需要抓取的链接,并将这些链接加入待抓取的URL队列中。

同时,爬虫还需要考虑到页面中的循环链接、重复链接等情况,以免陷入无限循环的抓取中。

最后,爬虫还需要考虑一些其他的问题。

比如,爬虫可能需要处理页面中的编码问题,以确保能够正确地解析页面内容。

另外,爬虫还需要考虑到抓取速度、并发数、代理IP等问题,以确保能够高效地抓取页面内容。

使用JAVA进行网络爬虫和数据抓取的方法与建议

使用JAVA进行网络爬虫和数据抓取的方法与建议

使用JAVA进行网络爬虫和数据抓取的方法与建议一、引言随着互联网的快速发展,网络上的数据量也在不断增长。

为了获取和分析这些数据,网络爬虫和数据抓取成为了一种重要的技术手段。

本文将介绍使用JAVA进行网络爬虫和数据抓取的方法与建议。

二、网络爬虫的原理网络爬虫是一种自动化程序,通过模拟浏览器的行为,访问网页并抓取其中的数据。

其主要原理包括以下几个步骤:1. 发送HTTP请求:通过JAVA的网络编程库,发送HTTP请求到目标网址。

2. 下载网页内容:获取到HTTP响应后,将网页内容下载到本地。

3. 解析网页内容:使用HTML解析库,解析网页的结构,提取出需要的数据。

4. 存储数据:将提取到的数据存储到数据库或者文件中。

三、JAVA网络编程库的选择在使用JAVA进行网络爬虫和数据抓取之前,我们需要选择一个适合的网络编程库。

常用的网络编程库有Apache HttpClient、OkHttp等。

这些库提供了丰富的API,可以方便地发送HTTP请求和处理HTTP响应。

四、HTML解析库的选择HTML解析库可以帮助我们解析网页的结构,提取出需要的数据。

常用的HTML解析库有Jsoup、HtmlUnit等。

这些库提供了简洁的API,可以方便地进行网页解析和数据提取。

五、设置合适的请求头在发送HTTP请求时,我们需要设置合适的请求头。

一些网站可能会对爬虫进行限制,通过设置合适的请求头可以模拟浏览器的行为,降低被封禁的风险。

常见的请求头包括User-Agent、Referer等。

六、处理反爬机制为了防止被爬虫抓取,一些网站会采取一些反爬机制,如验证码、IP封禁等。

在进行网络爬虫和数据抓取时,我们需要针对这些反爬机制进行相应的处理。

可以通过使用代理IP、使用验证码识别库等方式来应对反爬机制。

七、数据存储与处理在进行数据抓取之后,我们需要将抓取到的数据进行存储和处理。

可以选择将数据存储到数据库中,如MySQL、MongoDB等;也可以选择将数据存储到文件中,如CSV、JSON等。

爬虫的原理

爬虫的原理

爬虫的原理
爬虫,又称网络爬虫,是一种按照一定的规则,自动地抓取互联网信息的程序或脚本。

爬虫的原理主要包括以下几个方面,网页抓取、网页解析、数据存储和更新等。

首先,爬虫的原理之一是网页抓取。

爬虫程序通过发送HTTP请求,获取网页的HTML源代码。

在发送请求的过程中,爬虫需要模拟浏览器的行为,包括发送请求头、处理Cookie等,以便获取完整的网页内容。

在获取网页内容后,爬虫需要对网页进行解析。

其次,爬虫需要进行网页解析。

网页解析是指对获取的HTML源代码进行解析和提取有用信息的过程。

爬虫程序可以利用正则表达式、XPath、CSS选择器等技术,从HTML源代码中提取出需要的数据,如链接、文本、图片等。

解析完网页后,爬虫需要将提取的数据进行存储。

然后,爬虫需要进行数据存储和更新。

爬虫程序通常会将抓取到的数据存储到数据库或者本地文件中,以便后续的数据分析和处理。

同时,爬虫还需要定期更新已经抓取的数据,以保证数据的及时性和准确性。

除了以上几个主要的原理外,爬虫还需要考虑一些其他的问题。

比如,爬虫需要处理网页的反爬机制,避免被网站封禁IP或者账号。

此外,爬虫还需要考虑并发抓取、分布式部署、数据去重等问题,以提高抓取效率和数据质量。

总的来说,爬虫的原理主要包括网页抓取、网页解析、数据存储和更新等几个方面。

通过对这些原理的深入理解,可以帮助开发者更好地设计和实现爬虫程序,从而更高效地抓取和处理互联网上的海量数据。

干货:一文看懂网络爬虫实现原理与技术(值得收藏)

干货:一文看懂网络爬虫实现原理与技术(值得收藏)

干货:一文看懂网络爬虫实现原理与技术(值得收藏)01 网络爬虫实现原理详解不同类型的网络爬虫,其实现原理也是不同的,但这些实现原理中,会存在很多共性。

在此,我们将以两种典型的网络爬虫为例(即通用网络爬虫和聚焦网络爬虫),分别为大家讲解网络爬虫的实现原理。

1. 通用网络爬虫首先我们来看通用网络爬虫的实现原理。

通用网络爬虫的实现原理及过程可以简要概括如下(见图3-1)。

▲图3-1 通用网络爬虫的实现原理及过程1.获取初始的URL。

初始的URL地址可以由用户人为地指定,也可以由用户指定的某个或某几个初始爬取网页决定。

2.根据初始的URL爬取页面并获得新的URL。

获得初始的URL地址之后,首先需要爬取对应URL地址中的网页,爬取了对应的URL地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已爬取的URL地址存放到一个URL列表中,用于去重及判断爬取的进程。

3.将新的URL放到URL队列中。

在第2步中,获取了下一个新的URL地址之后,会将新的URL地址放到URL队列中。

4.从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新网页中获取新URL,并重复上述的爬取过程。

5.满足爬虫系统设置的停止条件时,停止爬取。

在编写爬虫的时候,一般会设置相应的停止条件。

如果没有设置停止条件,爬虫则会一直爬取下去,一直到无法获取新的URL地址为止,若设置了停止条件,爬虫则会在停止条件满足时停止爬取。

以上就是通用网络爬虫的实现过程与基本原理,接下来,我们为大家分析聚焦网络爬虫的基本原理及其实现过程。

2. 聚焦网络爬虫聚焦网络爬虫,由于其需要有目的地进行爬取,所以对于通用网络爬虫来说,必须要增加目标的定义和过滤机制,具体来说,此时,其执行原理和过程需要比通用网络爬虫多出三步,即目标的定义、无关链接的过滤、下一步要爬取的URL地址的选取等,如图3-2所示。

▲图3-2 聚焦网络爬虫的基本原理及其实现过程1.对爬取目标的定义和描述。

深入理解JAVA的网络爬虫与搜索引擎

深入理解JAVA的网络爬虫与搜索引擎

深入理解JAVA的网络爬虫与搜索引擎引言:随着互联网的快速发展,我们每天都会面临大量的信息。

为了更高效地获取我们需要的信息,网络爬虫和搜索引擎成为了必不可少的工具。

而作为一种常用的编程语言,JAVA在网络爬虫和搜索引擎的开发中扮演着重要的角色。

本文将深入理解JAVA的网络爬虫与搜索引擎的原理、应用以及相关技术。

一、网络爬虫的原理与应用1.1 网络爬虫的原理网络爬虫是一种自动化程序,通过模拟人类浏览器的行为,自动访问互联网上的网页并提取有用的信息。

其原理主要分为以下几个步骤:首先,网络爬虫需要指定一个起始网址,也称为种子URL。

然后,它会通过HTTP协议向服务器发送请求,获取网页的HTML源代码。

接下来,爬虫会解析HTML源代码,提取出页面中的链接,并将这些链接添加到待爬取的URL队列中。

然后,爬虫会从URL队列中取出一个URL,并重复前面的步骤,直到队列为空或达到设定的爬取深度。

最后,爬虫会将提取到的有用信息进行处理和存储,以供后续的分析和应用。

1.2 网络爬虫的应用网络爬虫在各个领域都有广泛的应用,以下是一些常见的应用场景:搜索引擎:搜索引擎通过网络爬虫来获取互联网上的网页信息,并建立索引以供用户搜索。

数据挖掘:网络爬虫可以用于获取大量的数据,用于分析和挖掘有用的信息。

舆情监测:通过网络爬虫可以实时监测社交媒体、新闻网站等发布的信息,用于舆情分析和预警。

价格比较:一些电商网站使用网络爬虫来获取竞争对手的价格信息,以便制定自己的价格策略。

二、JAVA网络爬虫的开发2.1 JAVA网络爬虫的基本框架在JAVA中,我们可以使用一些开源的网络爬虫框架来简化开发过程。

比较常用的有Jsoup、HttpClient和WebMagic等。

Jsoup是一款优秀的HTML解析器,可以方便地解析HTML源代码,并提供了丰富的API来获取和操作页面中的元素。

HttpClient是一个功能强大的HTTP客户端库,可以模拟浏览器的行为,发送HTTP请求并获取响应。

网络爬虫技术剖析

网络爬虫技术剖析

网络爬虫技术剖析随着互联网的迅猛发展,大量的网络信息被快速发布和更新,人们对于获取实时并有价值的信息变得越来越重要。

为了满足这一需求,网络爬虫技术应运而生。

本文将深入剖析网络爬虫技术的原理、应用以及存在的挑战。

一、网络爬虫技术的原理网络爬虫是一种通过自动化程序从网络上收集并解析数据的技术。

其基本原理是通过模拟浏览器的行为,自动发起HTTP请求,获取网页的HTML源代码或者其他指定格式的数据。

然后,通过解析HTML源码,提取出所需的数据信息。

为了实现这一目标,网络爬虫通常需要经历以下几个步骤:1. 确定起始URL:爬虫程序需要从一个或多个起始URL开始,然后逐级深入访问与之相关的链接。

2. 发起HTTP请求:对于每个URL,爬虫程序会模拟浏览器,通过发送HTTP请求获取相应的网页内容。

3. 解析网页:爬虫程序会解析网页的HTML源码,提取出所需的数据。

这个过程可以通过正则表达式、XPath或CSS选择器等方式进行。

4. 处理提取的数据:爬虫程序会对提取到的数据进行处理,可以是简单的数据清洗、整合,也可以是复杂的数据分析和挖掘。

5. 存储数据:最后,爬虫程序需要将处理后的数据存储到数据库、文件或者其他媒介中,以备后续的使用。

二、网络爬虫技术的应用网络爬虫技术具有广泛的应用场景。

以下列举了几个常见的应用领域:1. 搜索引擎:著名的搜索引擎,如Google、百度等,使用网络爬虫技术来收集和索引互联网上的信息,以便用户能够方便地搜索到相关的内容。

2. 数据采集与分析:许多企业和研究机构需要从互联网上获取大量的数据进行分析和研究。

网络爬虫技术可以帮助他们从各种资源中抓取所需的数据。

3. 新闻聚合:一些新闻聚合网站使用网络爬虫技术自动从各大新闻网站收集新闻资讯,以便用户在一个平台上获取多个来源的新闻。

4. 价格比较:一些电商网站或比价网站使用网络爬虫技术来抓取各大商家的商品信息和价格,以便用户能够进行比较和选择最优惠的商品。

java爬虫实现原理

java爬虫实现原理

java爬虫实现原理
Java爬虫实现的原理是基于网络爬取和数据提取的技术。

简单来说,爬虫就是通过HTTP协议从网络获取指定URL的
HTML页面,然后解析HTML文档,提取出所需的信息。

1. 指定URL:首先需要指定要爬取的网站URL,通常是通过URL连接来实现。

2. 发送HTTP请求:使用Java的URLConnection类或HttpClient等工具,构建HTTP请求,并发送到指定的URL上。

3. 接收响应:获取到服务器返回的HTML页面,可以通过InputStream或其他方法获取响应内容。

4. 解析HTML:将获取到的HTML页面进行解析,通常使用Jsoup等HTML解析库。

可以根据HTML标签、类名、ID等
特征来定位和提取所需的数据。

5. 保存数据:将提取到的数据保存到本地数据库或文件中,以便后续使用。

6. 遍历链接:如果需要爬取整个网站,可以在解析HTML时
获取到页面中的链接,并将这些链接加入到待爬取的URL集
合中,然后继续循环爬取。

7. 限制访问频率:为了避免对目标网站造成过大的负担,可以设置爬取间隔时间或使用代理服务器来降低访问频率。

需要注意的是,爬虫在实际应用时也需要遵循相关的法律法规和道德规范,避免对目标网站的正常运行造成干扰或侵犯隐私等问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

“网络蜘蛛”或者说“网络爬虫”,是一种能访问网站并跟踪链接的程序,通过它,可快速地画出一个网站所包含的网页地图信息。

本文主要讲述如何使用Java编程来构建一个“蜘蛛”,我们会先以一个可复用的蜘蛛类包装一个基本的“蜘蛛”,并在示例程序中演示如何创建一个特定的“蜘蛛”来扫描相关网站并找出死链接。

Java语言在此非常适合构建一个“蜘蛛”程序,其内建了对HTTP协议的支持,通过它可以传输大部分的网页信息;其还内建了一个HTML解析器,正是这两个原因使Java 语言成为本文构建“蜘蛛”程序的首选。

文章后面例1的示例程序,将会扫描一个网站,并寻找死链接。

使用这个程序时需先输入一个URL并单击“Begin”按钮,程序开始之后,“Begin”按钮会变成“Cancel”按钮。

在程序扫描网站期间,会在“Cancel”按钮之下显示进度,且在检查当前网页时,也会显示相关正常链接与死链接的数目,死链接将显示在程序底部的滚动文本框中。

单击“Cancel”按钮会停止扫描过程,之后可以输入一个新的URL;如果期间没有单击“Cancel”,程序将会一直运行直到查找完所有网页,此后,“Cancel”按钮会再次变回“Begin”,表示程序已停止。

下面将演示示例程序是如何与可复用“Spider”类交互的,示例程序包含在例1的CheckLinks类中,这个类实现了ISpiderReportable接口,如例2所示,正是通过这个接口,蜘蛛类才能与示例程序相交互。

在这个接口中,定义了三个方法:第一个方法是“spiderFoundURL”,它在每次程序定位一个URL时被调用,如果方法返回true,表示程序应继续执行下去并找出其中的链接;第二个方法是“spiderURLError”,它在每次程序检测URL导致错误时被调用(如“404 页面未找到”);第三个方法是“spiderFoundEMail”,它在每次发现电子邮件地址时被调用。

有了这三个方法,Spider类就能把相关信息反馈给创建它的程序了。

在begin方法被调用后,“蜘蛛”就开始工作了;为允许程序重绘其用户界面,“蜘蛛”是作为一个单独的线程启动的。

点击“Begin”按钮会开始这个后台线程,当后台线程运行之后,又会调用“CheckLinks”类的run方法,而run方法是由Spider对象实例化时启动的,如下所示:spider = new Spider(this);spider.clear();base = new URL(url.getText());spider.addURL(base);spider.begin();首先,一个新的Spider对象被实例化,在此,需要传递一个“ISpiderReportable”对象给Spider对象的构造函数,因为“CheckLinks”类实现了“ISpiderReportable”接口,只需简单地把它作为当前对象(可由关键字this表示)传递给构造函数即可;其次,在程序中维护了一个其访问过的URL列表,而“clear”方法的调用则是为了确保程序开始时URL列表为空,程序开始运行之前必须添加一个URL到它的待处理列表中,此时用户输入的URL则是添加到列表中的第一个,程序就由扫描这个网页开始,并找到与这个起始URL相链接的其他页面;最后,调用“begin”方法开始运行“蜘蛛”,这个方法直到“蜘蛛”工作完毕或用户取消才会返回。

当“蜘蛛”运行时,可以调用由“ISpiderReportable”接口实现的三个方法来报告程序当前状态,程序的大部分工作都是由“spiderFoundURL”方法来完成的,当“蜘蛛”发现一个新的URL时,它首先检查其是否有效,如果这个URL导致一个错误,就会把它当作一个死链接;如果链接有效,就会继续检查它是否在一个不同的服务器上,如果链接在同一服务器上,“spiderFoundURL”返回true,表示“蜘蛛”应继续跟踪这个URL并找出其他链接,如果链接在另外的服务器上,就不会扫描是否还有其他链接,因为这会导致“蜘蛛”不断地浏览Internet,寻找更多、更多的网站,所以,示例程序只会查找用户指定网站上的链接。

构造Spider类前面已经讲了如何使用Spider类,请看例3中的代码。

使用Spider类及“ISpiderReportable”接口能方便地为某一程序添加“蜘蛛”功能,下面继续讲解Spider类是怎样工作的。

Spider类必须保持对其访问过的URL的跟踪,这样做的目的是为了确保“蜘蛛”不会访问同一URL一次以上;进一步来说,“蜘蛛”必须把URL分成三组,第一组存储在“workloadWaiting”属性中,包含了一个未处理的URL列表,“蜘蛛”要访问的第一个URL也存在其中;第二组存储在“workloadProcessed”中,它是“蜘蛛”已经处理过且无需再次访问的URL;第三组存储在“workloadError”中,包含了发生错误的URL。

Begin方法包含了Spider类的主循环,其一直重复遍历“workloadWaiting”,并处理其中的每一个页面,当然我们也想到了,在这些页面被处理时,很可能有其他的URL 添加到“workloadWaiting”中,所以,begin方法一直继续此过程,直到调用Spider类的cancel方法,或“workloadWaiting”中已不再剩有URL。

这个过程如下:cancel = false;while ( !getWorkloadWaiting().isEmpty() && !cancel ) {Object list[] = getWorkloadWaiting().toArray();for ( int i=0; (i<list.length)&&!cancel; i++="" )="">processURL((URL)list[i]);}当上述代码遍历“workloadWaiting”时,它把每个需处理的URL都传递给“processURL”方法,而这个方法才是真正读取并解析URL中HTML信息的。

读取并解析HTMLJava同时支持访问URL内容及解析HTML,而这正是“processURL”方法要做的。

在Java中读取URL内容相对还比较简单,下面就是“processURL”方法实现此功能的代码:URLConnection connection = url.openConnection();if ( (connection.getContentType()!=null) &&!connection.getContentType().toLowerCase().startsWith("text/") ) {getWorkloadWaiting().remove(url);getWorkloadProcessed().add(url);log("Not processing because content type is: " +connection.getContentType() );return;}首先,为每个传递进来的变量url中存储的URL构造一个“URLConnection”对象,因为网站上会有多种类型的文档,而“蜘蛛”只对那些包含HTML,尤其是基于文本的文档感兴趣。

前述代码是为了确保文档内容以“text/”打头,如果文档类型为非文本,会从等待区移除此URL,并把它添加到已处理区,这也是为了保证不会再次访问此URL。

在对特定URL建立连接之后,接下来就要解析其内容了。

下面的代码打开了URL 连接,并读取内容:InputStream is = connection.getInputStream();Reader r = new InputStreamReader(is); //字符流reader现在,我们有了一个Reader对象,可以用它来读取此URL的内容,对本文中的“蜘蛛”来说,只需简单地把其内容传递给HTML解析器就可以了。

本例中使用的HTML解析器为Swing HTML解析器,其由Java内置,但由于Java对HTML解析的支持力度不够,所以必须重载一个类来实现对HTML解析器的访问,这就是为什么我们要调用“HTMLEditorKit”类中的“getParser”方法。

但不幸的是,Sun公司把这个方法置为protected,唯一的解决办法就是创建自己的类并重载“getParser”方法,并把它置为public,这由“HTMLParse”类来实现,请看例4:import javax.swing.text.html.*;public class HTMLParse extends HTMLEditorKit {public HTMLEditorKit.Parser getParser(){return super.getParser();}}这个类用在Spider类的“processURL”方法中,我们也会看到,Reader对象会用于读取传递到“HTMLEditorKit.Parser”中网页的内容://这个地方意思是,所谓的回调方法,就是供别人调用的,当parser的对reader对象进行解析的时候,发现标记或者文本就会去调用回调类的方法去执行相应的动作readerHTMLEditorKit.Parser parse = new HTMLParse().getParser();parse.parse(r,new Parser(url),true);请留意,这里又构造了一个新的Parser类,这个Parser类是一个Spider类中的内嵌类,而且还是一个回调类,它包含了对应于每种HTML tag将要调用的特定方法。

在本文中,我们只需关心两类回调函数,它们分别对应一个简单tag(即不带结束tag的tag,如)和一个开始tag,这两类回调函数名为“handleSimpleTag”和“handleStartTag”。

因为每种的处理过程都是一样的,所以“handleStartTag”方法仅是简单地调用“handleSimpleTag”,而“handleSimpleTag”则会负责从文档中取出超链接,这些超链接将会用于定位“蜘蛛”要访问的其他页面。

在当前tag 被解析时,“handleSimpleTag”会检查是否存在一个“href”或超文本引用:String href = (String)a.getAttribute(HTML.Attribute.HREF);if( (href==null) && (t==HTML.Tag.FRAME) )href = (String)a.getAttribute(HTML.Attribute.SRC);if ( href==null )return;如果不存在“href”属性,会继续检查当前tag是否为一个Frame,Frame会使用一个“src”属性指向其他页面,一个典型的超链接通常为以下形式:上面链接中的“href”属性指向其链接到的页面,但是“linkedpage.html”不是一个地址,它只是指定了这个Web服务器上一个页面上的某处,这称为相对URL,相对URL必须被解析为绝对URL,而这由以下代码完成:URL url = new URL(base,str);这又会构造一个URL,str为相对URL,base为这个URL上的页面,这种形式的URL类构造函数可构造一个绝对URL。

相关文档
最新文档