显示标签为“crawler”的博文。显示所有博文
显示标签为“crawler”的博文。显示所有博文

2009-01-14

常见爬虫分析

最近在写一篇关于爬虫的论文,写了N天英文,感觉用英文说事真是麻烦,还是用汉语说更能表达我的观点。所以写一篇博客总结一下。

很多人说,爬虫有什么了不起的,不就是个广度优先搜索嘛!现在也有各种各样的开源爬虫,拿过来直接用挺方便,不过实际的网络爬虫确实不那么简单。

一般来说,好的爬虫要满足两个条件:(1)首先爬比较著名的网站,比如sina,qq,啥的(2)在更新的时候,首先更新比较著名的网站,比如sina,qq啥的。这两个条件很容易理解,因为这些网站受到很多用户的注意,所以先爬先更新是应该的。

那么我要问,互联网上这么多网站,你怎么知道哪些网站是著名的?有人要说,不是有著名的pagerank算法吗,他可以基于链接关系给出网页的排名。那么我又要问这帮人,现在网页还没有爬下来,你怎么运行你的pagerank算法。这个问题就不那么好解决了。

于是,一个牛人说,我们可以这样,我们先用广度优先搜索爬一段时间,然后得出一个网页集合,然后用pagerank算法对这个集合中的那些未爬网页(就是这个集合中的网页会指向很多网页,这些网页很多没爬)排名,然后选择排名最高的网页先爬。这个就是启发式爬虫的思想,简单的说,他是用一个优先级队列,而不是广度优先爬虫的FIFO队列来存储待爬的网页,然后用爬下来的网页直接的链接结构启发式的估计待爬网页的排名。
这个爬虫的想法不错,不过还是有效率问题,我们知道,pagerank是一个迭代算法,如果网页多了,算起来还是很费事的。

一个牛人看到这个问题,他重新研究了广度优先爬虫,他忽然发现,广度优先爬虫能够自然的倾向于爬著名的网站,这是因为著名的网站有大量的反向链接,所以很容易从别的网页发现著名的网站,从而著名的网站能够比较早的爬下来。广度优先爬虫的这个属性实在是太好了,不过尽管他有这个倾向,但是他在爬著名网站这个问题上的效率还是不如上面的那种爬虫,也就是说,他首先爬下来的网页中,还是有大量的不重要的网页。

所以说,如果我们有一个方法,能够像广度优先爬虫那么自然的对著名网页有一种倾向,而且这个倾向非常大。那么这中爬虫无疑是很高效的,不用每次都算PageRank就能自动的先爬著名的网站,这种爬虫当然很好很强大。

我的这篇文章,主要就是谈如何设计这种爬虫。