没有合适的资源?快使用搜索试试~ 我知道了~
网络爬虫试验报告.doc
0 下载量 65 浏览量
2024-05-09
06:13:51
上传
评论
收藏 103KB DOC 举报
温馨提示
试读
25页
网络爬虫试验报告.doc
资源推荐
资源详情
资源评论
网络爬虫实验报告
院系:国际教育学院
班级:互联网 12—02
姓名:陈赛赛
学号:541212010202
“网络蜘蛛”或者说“网络爬虫”,是一种能访问网站并跟踪链接的程序,通过它,可快速地
画出一个网站所包含的网页地图信息。本文主要讲述如何使用 Java 编程来构建一个“蜘蛛”,
我们会先以一个可复用的蜘蛛类包装一个基本的“蜘蛛”,并在示例程序中演示如何创建一个
特定的“蜘蛛”来扫描相关网站并找出死链接。
Java 语言在此非常适合构建一个“蜘蛛”程序,其内建了对 HTTP 协议的支持,通过它可以
传输大部分的网页信息;其还内建了一个 HTML 解析器,正是这两个原因使 Java 语言成为
本文构建“蜘蛛”程序的首选。
文章后面例 1 的示例程序,将会扫描一个网站,并寻找死链接。使用这个程序时需先输入
一个 URL 并单击“Begin”按钮,程序开始之后,“Begin”按钮会变成“Cancel”按钮。在程
序扫描网站期间,会在“Cancel”按钮之下显示进度,且在检查当前网页时,也会显示相关
正常链接与死链接的数目,死链接将显示在程序底部的滚动文本框中。单击“Cancel”按钮
会停止扫描过程,之后可以输入一个新的 URL;如果期间没有单击“Cancel”,程序将会一
直运行直到查找完所有网页,此后,“Cancel”按钮会再次变回“Begin”,表示程序已停止。
下面将演示示例程序是如何与可复用“Spider”类交互的,示例程序包含在例 1 的 CheckLin
ks 类中,这个类实现了 ISpiderReportable 接口,如例 2 所示,正是通过这个接口,蜘
蛛类才能与示例程序相交互。在这个接口中,定义了三个方法:第一个方法是“spiderFoundU
RL”,它在每次程序定位一个 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 导致一个错误,就会把它当作一个死链接;如
果链接有效,就会继续检查它是否在一个不同的服务器上,如果链接在同一服务器上,“spid
erFoundURL”返回 true,表示“蜘蛛”应继续跟踪这个 URL 并找出其他链接,如果链接在
另外的服务器上,就不会扫描是否还有其他链接,因为这会导致“蜘蛛”不断地浏览
Internet,寻找更多、更多的网站,所以,示例程序只会查找用户指定网站上的链接。
构造 Spider 类
前面已经讲了如何使用 Spider 类,请看例 3 中的代码。使用 Spider 类及“ISpiderReporta
ble”接口能方便地为某一程序添加“蜘蛛”功能,下面继续讲解 Spider 类是怎样工作的。
Spider 类必须保持对其访问过的 URL 的跟踪,这样做的目的是为了确保“蜘蛛”不会访问同
一 URL 一次以上;进一步来说,“蜘蛛”必须把 URL 分成三组,第一组存储在“workloadWaiti
ng”属性中,包含了一个未处理的 URL 列表,“蜘蛛”要访问的第一个 URL 也存在其中;第
二组存储在“workloadProcessed”中,它是“蜘蛛”已经处理过且无需再次访问的 URL;第
三组存储在“workloadError”中,包含了发生错误的 URL。
Begin 方法包含了 Spider 类的主循环,其一直重复遍历“workloadWaiting”,并处理其中
的每一个页面,当然我们也想到了,在这些页面被处理时,很可能有其他的 URL 添加到“work
loadWaiting”中,所以,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 信息的。
读取并解析 HTML
Java 同时支持访问 URL 内容及解析 HTML,而这正是“processURL”方法要做的。在 Java
中读取 URL 内容相对还比较简单,下面就是“processURL”方法实现此功能的代码:
URLConnection connection = url.openConnection();
if ( (connection.getContentType()!=null) &&!connection.getContentType().toL
owerCase().startsWith("text/") ) {
getWorkloadWaiting().remove(url);
getWorkloadProcessed().add(url);
log("Not processing because content type is: " +
connection.getContentType() );
return;
}
首先,为每个传递进来的变量 url 中存储的 URL 构造一个“URLConnection”对象,因为网
站上会有多种类型的文档,而“蜘蛛”只对那些包含 HTML,尤其是基于文本的文档感兴趣。
前述代码是为了确保文档内容以“text/”打头,如果文档类型为非文本,会从等待区移除此 UR
L,并把它添加到已处理区,这也是为了保证不会再次访问此 URL。在对特定 URL 建立连
接之后,接下来就要解析其内容了。下面的代码打开了 URL 连接,并读取内容:
InputStream is = connection.getInputStream();
Reader r = new InputStreamReader(is);
现在,我们有了一个 Reader 对象,可以用它来读取此 URL 的内容,对本文中的“蜘
蛛”来说,只需简单地把其内容传递给 HTML 解析器就可以了。本例中使用的 HTML 解析器
为 Swing HTML 解析器,其由 Java 内置,但由于 Java 对 HTML 解析的支持力度不够,
所以必须重载一个类来实现对 HTML 解析器的访问,这就是为什么我们要调用“HTMLEditor
Kit”类中的“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,
如
)和一个开始 tag,这两类回调函数名为“handleSimpleTag”和“handleStartTag”。
因为每种的处理过程都是一样的,所以“handleStartTag”方法仅是简单地调用“handleSimp
leTag”,而“handleSimpleTag”则会负责从文档中取出超链接,这些超链接将会用于定位
“蜘蛛”要访问的其他页面。在当前 tag 被解析时,“handleSimpleTag”会检查是否存在一
个“href”或超文本引用:
剩余24页未读,继续阅读
资源评论
平头哥在等你
- 粉丝: 2
- 资源: 7332
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功