搜索引擎实现方式java_用Java实现搜索引擎

本文详细介绍了网页爬虫的工作原理,包括广度优先和深度优先的网页遍历策略,以及如何利用Java的URLConnection类获取网页数据。网页处理涉及将收集的网页存入数据库和提取URL,同时关注了URL的有效性和避免重复收集。分配器通过单例模式管理URL池,确保多线程安全地访问和分配任务。最后,通过启动多个gather线程实现并行爬取,提高效率。

第一部分:网络爬虫

1、网页爬虫模块

网页的搜集过程如同图的遍历,网页作为图中的节点,而网页中的超链接则作为图中的边,通过某网页的超链接得到其他网页的地址,从而可以进一步的进行网页收集,图的遍历分为广度优先和深度优先两种方法,网页的收集过程也是如此。收集网页的过程如下:从初始URL集合获得目标网页地址,通过网页链接获得网页数据,将获得的网页数据添加到网页数据库中并且分析该网页中的其他url链接,放入未访问URL集合用于网页收集。

网页收集器通过URL来获取该URL对应的网页数据,主要是利用Java中的URL

Connection类来打开URL对应页面的网络链接,然后通过i/o流读取其中的数据,bufferReader提供读取数据的缓存区提高数据读取的效率以及其下定义的readline读取函数。

2、网页处理

收集到的单个网页,需要进行两种不同的处理,一种是放入网页库,作为后续处理的原始数据;另一种是被分拆之后,抽取其中的URL链接,放入URL连接池等待对应网页的收集。

网页的保存需要按照一定的格式,以便以后数据的批量处理。

添加数据收集日期的原因,由于许多网站的内容都是动态变化的,这就意味着如果不是当天爬取得网页数据,很可能发生数据过期的问题,所以需要添加日期加以识别。

URL的提取分为两步,第一步是进行URL识别,第二部进行URL的处理,主要是因为有些网站的链接采用相对路径,如果不整理会产生错误。URL的识别主要是通过正则表达式来进行匹配,过程首先设定一个字符串作为匹配的字符串模式,然后在pattern中编译后即可使用macher类来进行相应字符串的匹配。经过这两步可以把网页收集到的URL放入URL池中,

分配器管理URL,负责保存着URL池并且在gather取得某一个网页之后分派新的URL,还要避免网页的重复收集,分配器采用设计模式中的单例模式,负责提供给gather新的URL,

重复收集是指物理上存在的一个网页,在没有更新的前提下,被gather重复访问,造成资源的浪费,主要原因是没有清楚的记录已经访问的URL而无法辨别,所以,dispather维护两个列表,“已访问列表”“未访问列表”

每个URL对应的页面被抓取之后,该URL放入已访问列表中,而从该页面提取出来的URL则放入未访问表中;

当gather向dispather请求URL的时候,先验证该URL是否在已访问表中,然后再给gather进行作业。

启动多个gather线程

gather的功能是收集网页,我们可以通过spider类来开启多个gather线程,从而达到多线程的目的。

启动线程,然后开始收集网页资料

在开启线程之后,网页收集器开始作业的运作,并在一个作业完成之后,向dispather申请下一个作业,因为有了多线程的gather,为了避免线程不安全,需要对dispather进行互斥访问,在函数中添加synchronized关键词,从而达到线程的安全访问。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值