读取并解析HTML
Java同时支持访问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对象,可以用它来读取此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”中网页的内容:
HTMLEditorKit.Parser parse = new HTMLParse().getParser(); parse.parse(r,new Parser(url),true);
请留意,这里又构造了一个新的Parser类,这个Parser类是一个Spider类中的内嵌类,而且还是一个回调类,它包含了对应于每种HTML tag将要调用的特定方法。在本文中,我们只需关心两类回调函数,它们分别对应一个简单tag(即不带结束tag的tag,如<br>)和一个开始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”属性指向其他页面,一个典型的超链接通常为以下形式:
<a href="linkedpage.html">Click Here</a>
上面链接中的“href”属性指向其链接到的页面,但是“linkedpage.html”不是一个地址,它只是指定了这个Web服务器上一个页面上的某处,这称为相对URL,相对URL必须被解析为绝对URL,而这由以下代码完成:
这又会构造一个URL,str为相对URL,base为这个URL上的页面,这种形式的URL类构造函数可构造一个绝对URL。在URL变为正确的绝对形式之后,通过检查它是否在等待区,来确认此URL是否已经被处理过。如果此URL没有被处理过,它会添加到等待区,之后,它会像其他URL一样被处理。
分享到:
相关推荐
本资源提供了一个基于Java实现的网络蜘蛛程序及其源码,适用于学习和研究网络爬虫技术。这个程序依赖于Apache Commons HttpClient v3.0库,这是一个强大的HTTP客户端库,为Java开发者提供了丰富的功能来执行HTTP请求...
Java网络爬虫(蜘蛛)源码是一种用Java语言编写的程序,它可以模拟人类在互联网上的浏览并抓取信息。这种程序可以在互联网上自动地搜索和提取数据,并将其保存在本地计算机上,以供后续处理和分析。通过使用Java网络...
标题中的“用java做的网络蜘蛛搜索引擎”指的是使用Java编程语言实现的一种网络爬虫技术,它能够在互联网上自动遍历网页,搜集信息,并构建一个可搜索的数据库。这种搜索引擎的工作原理类似于真实的蜘蛛在网中穿梭,...
**Java网络蜘蛛示例程序**,也被称为网络爬虫或网页抓取器,是一种自动浏览互联网并抓取信息的程序。在本示例中,它采用Java编程语言编写,特别是利用了多线程技术,提高了数据抓取的效率。Applet是Java的一种小程序...
(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java...
Java编写的简单蜘蛛程序,通常是指使用Java语言实现的网络爬虫软件,它能够自动抓取互联网上的网页信息。在编程领域,网络爬虫是一种自动化技术,用于从万维网中提取大量数据,用于数据分析、搜索引擎索引或其他特定...
【蜘蛛纸牌(Java)实现】是一个典型的编程项目...通过这样的项目,开发者不仅能深入理解Java编程,还能提高问题解决能力和软件设计思维。同时,对于想要提升Java基础知识和线程应用的人来说,这是一个很好的实践机会。
《网络蜘蛛Java编程指南》是一本深入探讨网络爬虫技术的专业书籍,主要针对使用Java语言进行网络数据抓取的开发者。网络蜘蛛,也称为网络爬虫或网络机器人,是自动遍历互联网并抓取网页信息的程序。这些程序在大数据...
在实现网络蜘蛛系统时,我们需要使用多个Java类库,例如java.net和java.io。我们将使用java.net.URL类来构造入口网址,并使用java.io.File类来下载和保存网络资源。 在系统的实现过程中,我们需要考虑到多个问题,...
【Java实现的蜘蛛纸牌源代码】是一种基于Java编程语言开发的桌面游戏,它复现了经典的蜘蛛纸牌玩法。这种游戏通常包括排列和消除纸牌以完成关卡的目标。在给定的压缩包中,有两个主要部分:打包发布的可执行文件和...
【Java实现蜘蛛纸牌小游戏源码】是一个基于Java编程语言开发的项目,旨在复现Windows操作系统中的经典小游戏——蜘蛛纸牌。在这个项目中,开发者利用Java的面向对象特性、图形用户界面(GUI)以及事件处理机制,构建...
在这个“java swing实现蜘蛛纸牌”的项目中,开发者使用Swing来创建了一个经典的蜘蛛纸牌游戏。接下来,我们将深入探讨Java Swing在游戏开发中的应用,以及蜘蛛纸牌游戏的基本规则和实现原理。 首先,Java Swing...
[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)...
在Java编程中,我们可以设计以下几个关键类: 1. **Card类**:代表单张牌,包括牌的值(Value,如2、3等)和花色(Suit,如红桃、黑桃等)。这个类需要包含比较方法,以便进行牌的排序。 ```java public class ...
【Java实现蜘蛛纸牌代码】是一个典型的编程项目,它涉及到计算机科学中的游戏开发、图形用户界面(GUI)设计以及算法实现等多方面知识。蜘蛛纸牌是一款流行的经典单人纸牌游戏,通常由Windows系统内置,玩家需要通过...
"基于Java Swing实现的蜘蛛纸牌.zip" 这个标题表明这是一个使用Java编程语言,特别是Swing库来开发的项目,旨在创建一个蜘蛛纸牌游戏。Swing是Java的一个图形用户界面(GUI)工具包,用于构建桌面应用程序。蜘蛛纸牌...