1、浅谈网络爬虫设计浅谈网络爬虫设计 雷才峰 田仁杰 王建锋 摘 要:网络爬虫(又被称为网页蜘蛛,网络机器人,在 FOFA 社区中间,更经常被称为网页追逐者)是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。本文从网络爬虫的介绍出发,阐述了网络爬虫的搜索策略以及相关算法,包括页面解析,重复链接分析,以及多线程等等 关键词:搜索引擎 网络爬虫 一、引言 随着信息时代的到来,网络飞速发展,规模无限扩大,信息量呈爆炸式的增长。网络给人们带来了丰富和动态的网络信息,但是因为 Internet 上的信息是极其分散,无序,毫无规则。所以很难被利用。因此如何在 Internet 这个巨大的信息海洋中快速
2、并且准确的找到有用的信息,是 Internet 用户的所共同面对的难题。而网络搜索引擎的出现则解决了这一困难,加强了 Internet 用户定位和收集网络信息的能力,引擎通过收集众多网络站点上的网络信息来为帮助用户更方便的寻找所需信息。而在整个搜索引擎中,网络爬虫起着重要的作用,它是整个搜索引擎的数据来源,爬虫设计的好坏直接决定着整个引擎系统的内容是否丰富,信息能否得到及时的更新。二、网络爬虫的种类 几年来随着对网络爬虫的不断研究与探索,备种各样的爬虫层出不穷。现在常见的优秀网给爬虫有:批量型网络爬虫、增量型网络爬虫、通用网络爬虫、垂直网络爬虫、聚焦网络爬虫。这几种爬虫功能不一,使用的领域也不
3、同。比如谷歌、百度等大型搜索引擎都是非常典型的增量型网络爬虫,可以提供非常大量的数据。而如淘宝、苏宁易购等店铺进行爬取就需要用到批量型网络爬虫,它们经常会对各种内容设限或屏蔽防止外来的爬取。三、网络爬虫的基本原理 网络爬虫是一个自动提取网页的程序,它为搜索引擎从 Internet 上下载网页,是搜索引擎的重要组成。爬虫从一个或若干初始网页的 URL 开始,通过分析该URL 的源文件,提取出新的网页链接,继而通过这些链接继续寻找新的链接,这样一直循环下去,直到抓取并分析完所有的网页为止。当然这是理想状态下爬虫的执行过程,但是实际上要抓取 Internet 上所有的网页是不可能完成的。从目前公布的
4、数据来看,最好的搜索引擎也只不过抓取了整个 Internet40%的网页。这有两个原因,其一是网络爬虫设计时的抓取技术瓶颈造成的,无法遍历所有的网页,很多网页链接不能从其他网页中得到。其二是存储技术和处理技术造成的,如果按照每个页面的平均的大小是 20K,那么 100 亿个页面的大小就是 200000G,对于现在的存储技术来说是个挑战。四、网络爬虫的爬行策略 网络爬虫的爬行策略可以分成深度优先和广度优先。(一)深度优先策略:其本质就是将网页链接按照深度由低到高的顺序依次进行爬取直到最底层为止。通俗点讲就是“一条道走到黑”,当一条路完全走完后再去返回来去走另条道。这种策略作为早期最为流行的算法比
5、较适合于垂直搜索等需要深度搜索的引擎,但又因为往往会爬取的过深会而耗时耗力产生大量的浪费。(二)广度优先策略:广度优先策略又被称为宽度优先策略。其原理就是从个初始点出发,将所有检测到的路径全部都访間一遍,每当全部路径都访问结束却没有发现目标时,那么就会把所有走两步可以到达的位置全部访问一遍。如果任然没有发现目标,就以此类推将所有走三步可以达到的位置全部访问一遍。这种方法听起来非常的笨,而且极为的耗时,但可以保证一定能找到一条最短路径。五、爬虫的具体实现(一)基本流程。如果是第一次运行,爬虫根据编码过程中给定的起始网页,开始分析网页源文件,把分析出来的链接放进待爬取队列,把已经处理过的原始网页放
6、进已爬行队列,并根据网页链接在哈希表中添加一个新元素,然后各个工作线程从待爬行 队列中取出链接继续分析,提取链接,把提取出的新链接与哈希表中已存在的元素进行对比,如果已在哈希表中存在,则放弃该链接,如果不存在,则在哈希表中生成一个新元素,并且把该链接放入待爬行队列,然后工作线程继续取出链接进行爬行这样一直循环下去,直到满足系统停止条件,如果系统运行期间人为的关闭了系统,则系统会自动在关闭时把相关记录保存到文本文件中。如果系统不是第一次运行,则在启动系统后,系统不是分析编码过程中指定的起始网页,而是先读取保存在文本文件中的信息,然后生成和上一次运行时同样的哈希表,待爬行队列,已爬行队列,然后从待
7、爬行对列中取出链接执行。(二)爬虫主要数据结构。1.CHashTable 类:这个类根据一定的算法为每一个链接(链接对应的网址)生成一个唯一对应的数字,然后把这个数字作为该链接在哈希表中的位置,并把该位置的值设置为 1,表示该位置已经有一个链接对应了。当有新的链接要放入哈希表中时,则只需检查新链接所对应的哈希表中的位置的值,如果为 0 则表示该链接以前未出现,如果为 1 则表示是重复链接,不需要处理了。2.CURLParse 类:该类主要负责得到链接的源文件,并从中提取出源文件中的所有链接,然后把不重复的链接放入到待爬行队列中去,供工作线程使用。在提取源文件链接的过程中,本系统没有使用正则表达
8、式,而是直接利用 CString 类来寻找链接,个人觉得这样操作的准确性更高。由于提取出来的链接很多都不完整,而是相对路径,因此,还需要对此类链接进行一些操作,使其变成完整路径后才能放入待爬行队列。3.CURLQueue 类:该类用来存储待爬行链接和已爬行链接,并提供了一些可以操作队列的接口以及一些返回队列相关信息的接口。4.URLStruct 结构体:该结构体用来控制系统的执行层级。如果某个链接的层级为 1,则由它分析出的链接的层级为 2。当链接的层级大于系统设定的层级时,就不对此链接做任何处理,既不从该链接中提取新的链接。五、系统运行 操作系统 Windows7 及以上。但是根据实际使用情况,建议使用 Windows10。因为 Windows10 做为目前主流的操作系统具有更好的服务器性能、更强的安全性、更轻的管理工作负担。参考文献 1 孟时,王彦,larbin 网络爬虫的体系结构J.电脑学习,2010 2 高波,Linux 网络编程M.程序设计 2000 3 王芳,陈海建 深入解析 Web 主题爬虫的关键性原理J.微型电脑应用,2011