没有合适的资源?快使用搜索试试~ 我知道了~
里面有java源码 比如实现网络爬虫的关键点 以及实现思路等 还可以!
资源推荐
资源详情
资源评论
网络爬虫(Spider)Java 实现原理 收藏
网络蜘蛛”或者说“网络爬虫”,是一种能访问网站并跟踪链接的程序,通过它,可
快速地画出一个网站所包含的网页地图信息。本文主要讲述如何使用 编程来构建一个
“蜘蛛”,我们会先以一个可复用的蜘蛛类包装一个基本的“蜘蛛”,并在示例程序中演示如何
创建一个特定的“蜘蛛”来扫描相关网站并找出死链接。
语言在此非常适合构建一个“蜘蛛”程序,其内建了对 协议的支持,通过它可以
传输大部分的网页信息;其还内建了一个 解析器,正是这两个原因使 语言成
为本文构建“蜘蛛”程序的首选。
文章后面例 的示例程序,将会扫描一个网站,并寻找死链接。使用这个程序时需先输入
一个 并单击“按钮,程序开始之后,“按钮会变成“按钮。在程
序扫描网站期间,会在“按钮之下显示进度,且在检查当前网页时,也会显示相关
正常链接与死链接的数目,死链接将显示在程序底部的滚动文本框中。单击“按钮
会停止扫描过程,之后可以输入一个新的 ;如果期间没有单击“,程序将会一
直运行直到查找完所有网页,此后,“按钮会再次变回“,表示程序已停止。
下面将演示示例程序是如何与可复用“类交互的,示例程序包含在例 的
类中,这个类实现了 ! 接口,如例 " 所示,正是通过这个
接口,蜘蛛类才能与示例程序相交互。在这个接口中,定义了三个方法:第一个方法是
“#$,它在每次程序定位一个 时被调用,如果方法返回 $,表示
程序应继续执行下去并找出其中的链接;第二个方法是“%,它在每次程序
检测 导致错误时被调用(如“&'&(页面未找到”);第三个方法是
“#$%,它在每次发现电子邮件地址时被调用。有了这三个方法,
类就能把相关信息反馈给创建它的程序了。
在 ! 方法被调用后,“蜘蛛”就开始工作了;为允许程序重绘其用户界面,“蜘蛛”是作为
一个单独的线程启动的。点击“按钮会开始这个后台线程,当后台线程运行之后,
又会调用“类的 $ 方法,而 $ 方法是由 对象实例化时启动的,如
下所示:
()(*(+ ,-(
.+,-(
!()(*(+$. / +,,-(
.+!,-(
.!+,-(
首先,一个新的 对象被实例化,在此,需要传递一个“ !对象给
对象的构造函数,因为“类实现了“ !接口,只需
简单地把它作为当前对象(可由关键字 表示)传递给构造函数即可;其次,在程序中
维护了一个其访问过的 列表,而“方法的调用则是为了确保程序开始时 列
表为空,程序开始运行之前必须添加一个 到它的待处理列表中,此时用户输入的
则是添加到列表中的第一个,程序就由扫描这个网页开始,并找到与这个起始
相链接的其他页面;最后,调用“!方法开始运行“蜘蛛”,这个方法直到“蜘蛛”工作完
毕或用户取消才会返回。
当“蜘蛛”运行时,可以调用由“ !接口实现的三个方法来报告程序当前状
态,程序的大部分工作都是由“#$方法来完成的,当“蜘蛛”发现一个新的
时,它首先检查其是否有效,如果这个 导致一个错误,就会把它当作一个死链
接;如果链接有效,就会继续检查它是否在一个不同的服务器上,如果链接在同一服务器
上,“#$返回 $,表示“蜘蛛”应继续跟踪这个 并找出其他链接,如
果链接在另外的服务器上,就不会扫描是否还有其他链接,因为这会导致“蜘蛛”不断地浏
览 ,寻找更多、更多的网站,所以,示例程序只会查找用户指定网站上的链接。
构造 类
前面已经讲了如何使用 类,请看例 0 中的代码。使用 类及
“ !接口能方便地为某一程序添加“蜘蛛”功能,下面继续讲解 类
是怎样工作的。
类必须保持对其访问过的 的跟踪,这样做的目的是为了确保“蜘蛛”不会访问同
一 一次以上;进一步来说,“蜘蛛”必须把 分成三组,第一组存储在
“*1 属性中,包含了一个未处理的 列表,“蜘蛛”要访问的第一个
也存在其中;第二组存储在“*中,它是“蜘蛛”已经处理过且无需再次
访问的 ;第三组存储在“*%中,包含了发生错误的 。
方法包含了 类的主循环,其一直重复遍历“*1 ,并处理其
中的每一个页面,当然我们也想到了,在这些页面被处理时,很可能有其他的 添加到
“*1 中,所以,! 方法一直继续此过程,直到调用 类的
方法,或“*1 中已不再剩有 。这个过程如下:
()(2-(
*(+(3 11 +,.%4 5+,(66(3(,(7
8!9 ( :;()( 11 +,. <5+,-(
2(+( ()'-(+=.%>?,663<>%-(,(@@A
++, :;,-(
B
当上述代码遍历“*1 时,它把每个需处理的 都传递给“
方法,而这个方法才是真正读取并解析 中 信息的。
读取并解析
同时支持访问 内容及解析 ,而这正是“方法要做的。在
中读取 内容相对还比较简单,下面就是“方法实现此功能的代码:
( ()($. +,-(
2(+(+ . 5+,3)$,(663
. 5+,. *+,. 1 +C / DC,(,(7
11 +,.4+$,-(
1+,.+$,-(
+C> ((!$( ( 5(E(C(@
. 5+,(,-(
$-(
B(
首先,为每个传递进来的变量 $ 中存储的 构造一个“ 对象,因为
网站上会有多种类型的文档,而“蜘蛛”只对那些包含 ,尤其是基于文本的文档感兴
趣。前述代码是为了确保文档内容以“ / D打头,如果文档类型为非文本,会从等待区移
除此 ,并把它添加到已处理区,这也是为了保证不会再次访问此 。在对特定
建立连接之后,接下来就要解析其内容了。下面的代码打开了 连接,并读取内
容:
$ 4(()( . $ 4+,-(
(()(*($ 4+,-(
现在,我们有了一个 对象,可以用它来读取此 的内容,对本文中的“蜘
蛛”来说,只需简单地把其内容传递给 解析器就可以了。本例中使用的 解析
器为 *( 解析器,其由 内置,但由于 对 解析的支持力度不够,
所以必须重载一个类来实现对 解析器的访问,这就是为什么我们要调用
“% F 类中的“ 方法。但不幸的是,$ 公司把这个方法置为
,唯一的解决办法就是创建自己的类并重载“ 方法,并把它置为
$!,这由“类来实现,请看例 &:
4 (9/.*. / . 4.G-(
$!(((/ (% F (7
$!(% F .( +,
7
$($. +,-(
B
B
这个类用在 类的“方法中,我们也会看到, 对象会用于
读取传递到“% F .中网页的内容:
% F .(()(*(+,. +,-(
.+H*(+$,H $,-(
请留意,这里又构造了一个新的 类,这个 类是一个 类中的内
嵌类,而且还是一个回调类,它包含了对应于每种 ( 将要调用的特定方法。在本
文中,我们只需关心两类回调函数,它们分别对应一个简单 (即不带结束 的
,如
剩余23页未读,继续阅读
资源评论
Cqsh19880524
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 通过python实现抽象工厂模式(Abstract Factory Pattern).rar
- 学习记录111111111111111111111111
- JavaScript函数
- java-leetcode题解之Range Sum Query 2D - Mutable.java
- java-leetcode题解之Random Pick Index.java
- java-leetcode题解之Race Car.java
- java-leetcode题解之Profitable Schemes.java
- java-leetcode题解之Product of Array Exclude Itself.java
- java-leetcode题解之Prime Arrangements.java
- MCU51-51单片机
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功