读取并解析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网络爬虫(蜘蛛)源码是一种用Java语言编写的程序,它可以模拟人类在互联网上的浏览并抓取信息。这种程序可以在互联网上自动地搜索和提取数据,并将其保存在本地计算机上,以供后续处理和分析。通过使用Java网络...
(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java毕业设计)Java网络爬虫(蜘蛛)(Java...
java程序-蜘蛛纸牌java程序-蜘蛛纸牌java程序-蜘蛛纸牌java程序-蜘蛛纸牌java程序-蜘蛛纸牌java程序-蜘蛛纸牌
一个多线程的网络蜘蛛示例程序。采用java实现的Applet小程序。很实用,很有学习价值。 经本站测试通过。可以放心下载使用。
一个非常不错的java网络蜘蛛程序及源码,依靠apache commons httpclient v3.0,可以从网站上下载任何你指定扩展名的文件
java写的简单蜘蛛程序
[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)源码_zhizhu.rar[搜索链接]Java网络爬虫(蜘蛛)...
Java实现windows自带小游戏,蜘蛛纸牌小游戏源码
网络蜘蛛 网络爬虫 网络机器人 电子书pdg版值得参考
网络爬虫是一种自动化程序,用于在网络中抓取信息,而这份资源提供了使用Java语言实现的网络爬虫的完整源码。源码中包含了爬虫的架构设计、功能实现以及相关技术的应用。 适用人群:这份资源适用于Java开发者、对...
网络蜘蛛,有时也称为网络爬虫,是一些根据网络链接从一个网站到另外一个网站,检查内容和记录位置的程序。商业搜索站点使用网络蜘蛛丰富它们的数据库,研究人员可以使用蜘蛛获得相关的信息。创建自己的蜘蛛搜索的...
程序设计综合实验所需的代码,简单的蜘蛛纸牌代码,通过Java编写,易懂易上手
java swing 实现蜘蛛纸牌 面向对象思想 采用面向对象的思路,实现蜘蛛纸牌游戏,适合初学者,以及对面向对象有更深层次理解的开发者或者同学。 使用原生的java swing进行窗口式开发
主题网络蜘蛛程序设计及JAVA实现.doc
Java是一种广泛使用的编程语言,拥有丰富的网络编程库和工具,因此Java非常适合用于编写网络爬虫。下面是一个基于Java的网络爬虫源码的简要介绍。 该爬虫的基本原理是:从指定的起始网址开始,递归地遍历整个网站,...
是一个Java程序,很好的解释了网络蜘蛛
此资源集包含了一套完整的Java实现的网络爬虫(蜘蛛)项目源代码、相关的毕业论文以及详尽的使用说明。它旨在提供一个全面、深入的学习和研究工具,适用于本科课程设计、毕业设计以及任何希望深入学习Java编程的学习者...
蜘蛛纸牌的java程序蜘蛛纸牌的java程序