基于Websphinx网络爬虫的研究与改进

时间:2022-05-27 06:41:23

基于Websphinx网络爬虫的研究与改进

摘要:搜索引擎技术随着互联网的日益壮大而飞速发展。它成功的商业运作也造就了Google、百度等这样的商业奇迹。作为搜索引擎的重要组成部分,网络爬虫的爬行效率对搜索引擎至关重要。基于Websphinx对网络爬虫进行了相关介绍,概述了Websphinx的结构框架、搜索方式及提出了一些看法。

关键词:搜索引擎;Websphinx网络爬虫;超时;智能化

中图法分类号:TP393文献标识码:A 文章编号:1009-3044(2008)28-0075-03

Research And Improvement of Network Reptile Based on Websphinx

ZHOU Xiang

(Tongji University Software College, Shanghai 200000, China)

Abstract: With the development of internet technical, Search engine is becoming more and more powerful. There are also some fantastic success cases like google and baidu. Network Reptile, as an important part of search engine, play an irreplaceable role in it, especially the performance. here we discuss about Network Reptile based on an exist open source――"Websphinx", explain the structure and search style of Websphinx, and show out some new opinion.

Key words: search engine;websphinx network reptilesInterface; overtime;intelligent

1 引言

现如今,随着搜索引擎的普及,网络爬虫程序也越来越受到人们的重视,它的效率直接关系到搜索引擎的速度。作为搜索引擎三环节中的第一个环节,它的效率直接决定了搜索引擎的搜索广度,面对浩瀚一望无边的网络海洋,如果有一个具有高性能爬虫程序,可能就会达到能够遍历所有internet网页内容的理想状态,同样会解决每天与日俱增的无数的网页和旧网页的更新。

本文主要结合Websphinx 这个网络爬虫源程序来探讨一下关于爬虫程序的现状,该开源项目存在的一些问题以及一些可以改进的优化方案。

2 websphinx 基本原理

从一个基点网站出发,遍历其中的所有有用信息,同时抽去其中的链接信息放入队列,以待有空闲蠕虫(worm)时,从队列中读取,发出request请求,继续进行信息抽取和链接入队列的工作。

3源代码分析

入口为 websphinx.workbench.workbench

主界面如图2。

输入starting URLs后,爬虫将以该网址为基点进行搜索

点击start后代码如下:

private transient PriorityQueue fetchQueue;//等待下载的链接队列

private transient PriorityQueue crawlQueue;//已被爬出的但还未被处理链接队列

fetchQueue接收到网络应答和内容后则将链接加入crawlQueue队列

configureCrawler ();//读取界面输入框中参数信息,准备以后搜索

……

Thread thread = new Thread (crawler, crawler.getName ());

thread.setDaemon (true);

thread.start ();//启动线程搜索

crawler 是一个 Crawler类对象,实现Runnable接口

public void run () {

……

synchronized (crawlQueue) {

Timer timer = new CrawlTimer (this);

int timeout = dp.getCrawlTimeout();//dp:下载参数

if (timeout > 0)

timer.set (timeout*1000, false);

int nWorms = Math.max (dp.getMaxThreads (), 1);//拿到最大可用线程

worms = new Worm[nWorms];//爬虫对象

for (int i=0; i

worms[i] = new Worm (this, i);

worms[i].start ();//开启网页访问进程,每个网址对应一个爬虫

}

……

Label 1 : synchronized (fetchQueue) {

for (int i=0; i

if (worms[i].link != null)

fetchQueue.put (worms[i].link);

}

将爬虫对象爬到的网页对象,只要有,即装入抓取队列继续等待抓取

其中:

class Worm extends Thread {

……

public void run () {

crawler.fetch (this);//关键点,

}

……

}

其中fetch()用于抓取网址对象

在fetch() 关键为 :process(w.link)

Process方法:

// 网页分类

for (int j=0, len=classifiers.size(); j

Classifier cl = (Classifier)

classifiers.elementAt(j);

cl.classify (page);

}

++numPagesVisited;

if (pagePredicate == null || pagePredicate.shouldActOn (page)) {

if (action != null)

action.visit (page);

visit (page);

}

expand (page); //开始遍历该page中的所有链接

expand方法:

Link[] links = page.getLinks();

if (links != null && links.length > 0) {

for (int i=0;i

Link l = links[i];

l.setDownloadParameters (dp);//设置下载参数

if (ignoreVisitedLinks && visited (l))//已访问过(可能访问重复网页)

sendLinkEvent (l, LinkEvent.ALREADY_VISITED);

else if (。。。)//需要跳过

sendLinkEvent (l, LinkEvent.SKIPPED);

else if (page.getDepth() >= maxDepth)//超过最大深度

sendLinkEvent (l, LinkEvent.TOO_DEEP);

else

submit (l);//访问网页(加入队列等待访问)

}

}

submit方法:

markVisited (link); //将此link标记为访问过的

synchronized (crawlQueue) {

synchronized (fetchQueue) {

crawlQueue.put (link);

++numPagesLeft;//剩余未处理的page个数加1

fetchQueue.put (link);//加入等待下载的链接队列

fetchQueue.notifyAll ();//唤醒爬虫程序开始捕捉

}

}

于是此处将crawlQueue和fetchQueue更新,将来会根据里面的内容进行网页遍历

以上是其主要处理流程和核心代码.

流程如图3。

4 问题的提出

4.1 关于超时(timeout)

访问网页会设定了一个超时限制(timeout),这也是大多数爬虫程序都有的限制。超时还没返回网页信息则放弃。对于此Websphinx

fetchTimedOut方法

synchronized (crawlQueue) {

crawlQueue.delete (w.link);

--numPagesLeft;

worms[w.i] = new Worm (this, w.i);

worms[w.i].start ();

crawlQueue.notify ();

}

timeout方法:

synchronized (crawlQueue) {

synchronized (fetchQueue) {

state = CrawlEvent.TIMED_OUT;

fetchQueue.clear ();

crawlQueue.clear ();

numPagesLeft = 0;

crawlQueue.notify ();

}

}

这里存在一个很大的问题,我们知道,如果以国内为基点搜索,国内和国外的网站差别是很大的,而且现在的网络并不是很稳定,对于同一个网站发请求,有时很快就能返回信息,有时过很长时间才行,有时甚至出现无法访问的错误,在这样的环境下,对于爬虫程序,很容易就会返回不正确的结果,比如应该可以访问的,由于网络在某个时刻阻塞而返回超时或无法访问;两次以同一个网站为基站返回的搜索结果截然不同等等。

如果我们能给这种超时限制多一点空间,不要限制的太死是否会好一点?

基于这种想法,我们可以将超时限制分为不同的层次,如果在最开始的超时限制(最严格)下超时,我们可以再将超时限制放宽,再超时再放宽,直到达到上限,这样就可以最大限度的避免网络的不稳定和网站地域的区别而造成的误差

具体做法如下:(限制从严到宽为限制1,限制2。。。)

在达到限制1时,不要马上将对象(网址)剔出队列,而是新建队列:fetchQueue2,并将此对象加入此队列;同样,其他线程也有同样情况对象出现也加入fetchQueue2。同时此时将此队列的超时(timeout)限制放宽一层到限制2,优先级降低。一旦有返回结果时,则进行信息截取,然后重新将遍历出的对象(网址)加入原队列(fetchQueue);如果仍没返回结果,新建队列fetchQueue3,并再次放宽限制,降低优先级;一旦有返回结果时,再回到fetchQueue。。。

当然,一旦成功就回到原始队列fetchQueue,这样如果是国外的网站效率就会很低,因为它很可能每次都要走fetchQueue2,fetchQueue3甚至更高,所以可根据网址特征,过去搜索结果对网址进行评估,是国外网站则可以专门设计一队列(fetchabroadQueue),它的初始限制比fetchQueue高,其他可仿照fetchQueue设计,同样有fetchabroadQueue2,fetchabroadQueue3等等。

对于国内某些本来就很慢的网站(服务器网速慢等情况),可以在搜索时做一些智能化处理,比如,某一网站网址出现:

fetchQueuefetchQueue2fetchQueue3fetchQueuefetchQueue2fetchQueue3……

这种情况达到一定次数,就认定为慢网站,可将该网站的流程改为:

fetchQueuefetchQueue2fetchQueue3fetchQueue2fetchQueue3……

4.2 关于算法

Websphinx对于每张网页调用visit(page)然后expand(page),其中expand(page)用于遍历所有该page中的链接。可以看出,它使用的是广度遍历的方法。

但不是所有的网站都适用于广度遍历。广度遍历适用于深度较少而每层内容较多的情况,而深度遍历适用于深度高而每层内容较少的情况。对于那种像sina,sohu等等的信息集中网站链接比较多的网站适用于广度优先,但是对于某些做专业技术的网站,比如化工,原料,生命科学专业信息网站,他们往往分类很细,要看到具体信息,需要往下找到具体分类,才能看到具体信息,此时深度已经很高了,如果将其看作一颗树,则信息几乎全在低层。如果还用广度优先算法,则在开始会找到很多重复的没有多大价值的信息,并且如果深度限制太死,则可能根本找不到底层而导致找到的有价值信息几乎为0,也失去了爬虫的意义。

但是我认为最值得我们关注的是爬虫程序的智能化。正如我们所见到Websphinx的搜索程序是不变的,每次搜索都是用同样的方法。但对于internet这个庞大的网络而言,每次都用同样的方法势必会导致重复工作效率不高,如果搜索方式(广度或深度)用错,势必每次都用错,如果加入人工智能的因素会对程序的性能有很大的帮助。

对网站的分类(国内或国外,信息集中或专业化),每搜索一次根据前述方法区分一次,记录结果;然后取出最近10次的搜索结果记录取平均值,最近5次的搜索结果记录取平均值;分别作比较,如果分类一致则不变,如果有变化,证明可能网站类型有变化,可再取最近4次,3次,2次的搜索结果记录取平均值作分析重定位网站类型,记录结果。

在扫描网页内容时,可将每一次的信息与上一次比较,对于每次变化很小或长时间没什么变化的网页可以记为“懒惰”网页,同样对网站也是如此。从而可以降低其搜索周期,比如从原来的一周一次降为两周一次,变化快的也可以缩短周期,但到上限为止。

5 结论

网络爬虫作为搜索引擎的基本组成部分,它的爬行速度和爬行量直接影响着搜索效率与质量。本文从具体网络爬虫程序Websphinx的代码实现出发,结合一般网络爬虫的相关概念和构成,介绍了网络爬虫的相关概念,并阐述了网络爬虫的组成结构,对Websphinx的现状提出一些问题和相应解决方案和优化方案。

参考文献:

[1] 徐宝文,张卫丰.搜索引擎与信息获取技术[M].北京:清华大学出版社.2003.

[2] Java开源项目Websphinx,可扩展的Web爬虫项目[EB/OL]./.

[3] 张敏,高剑峰,马少平.基于链接描述文本及其上下文的Web信息检索[J].计算机研究与发展,2004,41(1):221-226.

[4] Jeff Heaton.Programming Spiders,Bots,and Aggrega-tors in Java.[M].Sybex,2002

[5] 李晓明,闫宏飞,王继民.搜索引擎:原理,技术与系统[M].北京:科学出版社,2005.

[6] [Abiteboul 97] Serge Abiteboul and Victor Vianu, Queries and Computation on the Web. Proceedings of the International Conference on Database Theory. Delphi, Greece 1997.

[7] [Bagdikian 97] Ben H.Bagdikian. The Media Monopoly.5th Edition. Publisher: Beacon,ISBN: 0807061557.

[8] [Gravano 94] Luis Gravano, Hector Garcia-Molina, and A. Tomasic. The Effectiveness of GlOSS for the Text-Database Discovery Problem. Proc. of the 1994 ACM SIGMOD International Conference On Management Of Data,1994

[9] [Marchiori 97] Massimo Marchiori. The Quest for Correct Information on the Web: Hyper Search Engines.The Sixth International WWW Conference (WWW 97).Santa Clara,USA, April 7-11,1997.

上一篇:基于流媒体技术的视频点播系统的研究 下一篇:基于AMDF的藏语语音基音周期检测