第三章 网络机器人
3.1什么是网络机器人
网络机器人又称为Spider程序,是一种专业的Bot程序。用于查找大量的Web页面。它从一个简单的Web页面上开始执行,然后通过其超链接在访问其他页面,如此反复理论上可以扫描互联网上的所有页面。
基于因特网的搜索引擎是Spider的最早应用。例如搜索巨头Google公司,就利用网络机器人程序来遍历Web站点,以创建并维护这些大型数据库。
网络机器人还可以通过扫描Web站点的主页来得到这个站点的文件清单和层次机构。还可以扫描出中断的超链接和拼写错误等。
3.2网络机器人的结构分析
Internet是建立在很多相关协议基础上的,而更复杂的协议又建立在系统层协议之上。Web就是建立在HTTP ( Hypertext Transfer Protocol ) 协议基础上,而HTTP又是建立在TCP/IP ( Transmission Control Protocol / Internet Protocol ) 协议之上,它同时也是一种Socket协议。所以网络机器人本质上是一种基于Socket的网络程序。
3.2.1如何解析HTML
因为Web中的信息都是建立在HTML协议之上的,所以网络机器人在检索网页时的第一个问题就是如何解析HTML。在解决如何解析之前,先来介绍下HTML中的几种数据。
文本:除了脚本和标签之外的所有数据
注释:程序员留下的说明文字,对用户是不可见的
简单标签:由单个表示的HTML标签
开始标签和结束标签:用来控制所包含的HTML代码
我们在进行解析的时候不用关心所有的标签,只需要对其中几种重要的进行解析即可。
超连接标签
超连接定义了WWW通过Internet链接文档的功能。他们的主要目的是使用户能够任意迁移到新的页面,这正是网络机器人最关心的标签。
图像映射标签
图像映射是另一种非常重要的标签。它可以让用户通过点击图片来迁移到新的页面中。
表单标签
表单是Web页面中可以输入数据的单元。许多站点让用户填写数据然后通过点击按钮来提交内容,这就是表单的典型应用。
表格标签
表格是HTML的构成部分,通常用来格式化存放、显示数据。
我们在具体解析这些HTMl标签有两种方法:通过JavaTM中的Swing类来解析或者通过Bot包中的HTMLPage类来解析,本人在实际编程中采用后者。
Bot包中的HTMLPage类用来从指定URL中读取数据并检索出有用的信息。下面给出该类几种重要的方法。
HTMLPage构造函数 构造对象并指定用于通讯的HTTP对象
Public HTMLPage(HTTP http)
GetForms方法 获取最后一次调用Open方法检索到的表单清单
Public Vector getForms()
GetHTTP方法 获取发送给构造函数的HTTP对象
Public HTTP getHTTP()
GetImage方法 获取指定页面的图片清单
Public Vector getImage()
GetLinks方法 获取指定页面的连接清单
Public Vector getLinks()
Open方法 打开一个页面并读入该页面,若指定了回调对象则给出所有该对象数据
Public void open(String url,HTMLEditorKit.ParserCallback a)
3.2.2 Spider程序结构
网络机器人必须从一个网页迁移到另一个网页,所以必须找到该页面上的超连接。程序首先解析网页的HTML代码,查找该页面内的超连接然后通过递归和非递归两种结构来实现Spider程序。
递归结构
递归是在一个方法中调用自己本身的程序设计技术。虽然比较容易实现但耗费内存且不能使用多线程技术,故不适合大型项目。
非递归结构
这种方法使用队列的数据结构,当Spider程序发现超连接后并不调用自己本身而是把超连接加入到等待队列中。当Spider程序扫描完当前页面后会根据制定的策略访问队列中的下一个超连接地址。
虽然这里只描述了一个队列,但在实际编程中用到了四个队列,他们每个队列都保存着同一处理状态的URL。
等待队列 在这个队列中,URL等待被Spider程序处理。新发现的URL也被加入到这个队列中
处理队列 当Spider程序开始处理时,他们被送到这个队列中
错误队列 如果在解析网页时出错,URL将被送到这里。该队列中的URL不能被移入其他队列中
完成队列 如果解析网页没有出错,URL将被送到这里。该队列中的URL不能被移入其它队列中
在同一时间URL只能在一个队列中,我们把它称为URL的状态。
以上的图表示了队列的变化过程,在这个过程中,当一个URL被加入到等待队列中时Spider程序就会开始运行。只要等待队列中有一个网页或Spider程序正在处理一个网页,程序就会继续他的工作。当等待队列为空并且当前没有任何网页时,Spider程序就会停止它的工作。