1、网络爬虫的设计方案与实现完整版网络爬虫的设计与实现 摘 要网络爬虫将下载的网页和收集到的网页信息存储在本地数据库中以供搜索引擎使用,它是一个专门从万维网上下载网页并分析网页的程序。随着网络的快速发展,人们对搜索引擎的要求也越来越高,而网络爬虫的效率直接影响着搜索引擎的质量。本课题研究的是通用网络爬虫,它是从一个或若干个初始网页的链接开始进而得到一个链接队列。伴随着网页的抓取又不断从抓取到的网页中抽取新链接放入到链接队列中,直到爬虫系统满足了停止条件。该课题主要涉及到了缓冲池技术,多线程技术,套接字技术,HTTP和SSL协议,正则表达式,Linux网络编程技术,PHP+Apache的使用等相关技
2、术。本说明书叙述的网络爬虫是以Linux C实现的,加以PHP语言编写的界面使用户更加方面的操作,利用Shell脚本和Apache服务器使得爬虫系统和界面很好的结合在一起。关键词:网络爬虫 缓冲池 正则表达式 SSL协议 多线程目 次1 引言随着网络技术日新月异的发展,互联网俨然已成为信息的最大载体。为了能够在浩瀚的信息海洋中精确地查询用户所需要的信息,搜索引擎技术应运而生。目前比较流行的搜索引擎是Google和XX,他们拥有着庞大的用户数量。作为搜索引擎的重要组成部分,网络爬虫的设计直接影响着搜索引擎的质量。网络爬虫是一个专门从万维网上下载网页并分析网页的程序。它将下载的网页和采集到的网页信
3、息存储在本地数据库中以供搜索引擎使用。网络爬虫的工作原理是从一个或若干初始网页的链接开始进而得到一个链接队列。伴随着网页的抓取又不断从抓取到的网页里抽取新的链接放入到链接队列中,直到爬虫程序满足系统的某一条件时停止。本说明书对课题背景进行简单介绍的同时,又对研究网络爬虫的意义进行了叙述,在此基础上,详细的介绍来了利用C语言在linux系统上开发出多线程网络爬虫的设计步骤。1.1 课题选题背景搜索引擎是用户在网上冲浪时经常使用的一种工具,毫无疑问,每个用户都可以通过搜索引擎得到自己所需要的网络资源。搜索引擎一词在互联网领域得到广泛的应用,但是每个地区对它又有着不同的理解。在一些欧美国家搜索引擎常
4、常是基于因特网的,它们通过网络爬虫程序采集网页,并且索引网页的每个词语,也就是全文检索。而在一些亚洲国家,搜索引擎通常是基于网站目录的搜索服务。总的来说:搜索引擎只是一种检索信息的工具。它的检索方式分为以下两种:一种是目录型的方式,爬虫程序把网络的资源采集在一起,再根据资源类型的不同而分成不同的目录,然后继续一层层地进行分类,人们查询信息时就是按分类一层层进入的,最后得到自己所需求的信息。另一种是用户经常使用的关键字方式,搜索引擎根据用户输入的关键词检索用户所需资源的地址,然后把这些地址反馈给用户。1.2 课题研究的意义网络在我们的生活中越来越重要,网络的信息量也越来越大,研究该课题可以更好的
5、理解网络爬虫在搜索引擎中的作用以及网络爬虫的原理。现实中,一般的服务器大多是linux系统该课题更好的配合了linux系统上运行爬虫程序,加上界面更容易操作。21世纪是一个讲究信息安全的时代,于是网站上出现了越来越多的https(超文本传输安全协议)协议的链接,该课题很好的利用了SSL协议解决了下载https协议链接的问题。设备的内存是珍贵的,如何更加合理有效地利用内存提高内存的利用率是值得研究的,该课题为了解决内存的利用使用了内存池来提高内存的使用率。2 需求分析网络爬虫是一个专门从万维网上下载网页并分析网页的程序。它将下载的网页和收集到的信息存储在本地数据库中以供搜索引擎使用。网络爬虫的工
6、作原理是从一个或若干初始网页的链接开始进而得到一个链接队列。伴随着网页的抓取又不断从抓取到的网页里抽取新的链接放入到链接队列中,直到爬虫程序满足系统的某一条件时停止。它是搜索引擎的重要组成部分。2.1 功能需求分析(1)网页下载功能1能够下载任何http协议和https协议的链接的网页。2构造HTTP请求中的GET请求。3分析HTTP响应请求。(2)网页分析功能1提取网页标题。2提取网页关键字。3提取网页摘要。4提取网页链接并统计数量。5把新链接加入到URL队列。(3)内存池功能1能够分配固定大小的内存。2能够回收内存对象。3能够释放内存对象。4能够销毁内存池。5能够分配固定大小的内存。(4)
7、保存功能1能够正确保存网页以及网页信息到文件。2功能把系统运行中的异常写入日志文件。(5)界面1可以配置参数和运行后台的爬虫系统。2能够查看运行结果。2.2 系统性能分析当用户使用系统时,系统需要能够对于一些异常状况系统能够记录并跳过此异常继续执行。系统需要具有较高的可移植性和可靠性。系统需要具有很好的可测试性和可维护性。网络爬虫系统是不停的从万维网上下载网页和采集网页信息的系统。由于网络爬虫系统是搜索引擎的组成部分,搜索引擎要利用到爬虫系统的信息,所以系统要设计合理的存储文件并建立索引。3 系统设计3.1 系统工作流程图本系统通过IE共同访问Apache服务器的发布的页面、Apache服务器
8、返回页面方便用户操作。(1)系统物理结构如图3-1:图3-1 系统物理结构图(2)界面的流程如图3-2:图3-2页面结构图.(3)网络爬虫系统流程如图3-3:图3-3 系统流程图3.2 数据结构设计系统中主要是使用了链表作为URL队列,而链表中的每个结构体是一个数据单元,数据单元中的元素及其含义如表3-1:表3-1 数据结构表字段类型 含义host char *网页所在的主机 port int网络服务器所使用的端口dirchar *网页所在的目录pagechar *网页文件名filechar *本地保存的文件名pageinfo char *保存网页信息的文件名urlchar *存储网页链接ti
9、tlechar *网页的标题keywordschar *网页的关键字bodychar *网页的摘要protocalchar连接使用的协议 0 -http 1- httpsurl_countint网页中的链接数目typechar *网页类型codechar *网页编码page_sizeint网页大小is_handledchar是否处理过brotherstrcut *兄弟节点链表指针childstruct *子节点链表指针系统把初始的链接保存在了init_url文件中;把一些异常情况保存在了crawl.log文件中;把下载的网页文件保存在了page_db文件夹中;把网页信息文件保存在page_in
10、fo文件夹中;把网页中链接文件保存在了page_url文件夹中;把网页文件名称,网页信息文件名称,网页链接文件名称保存在link.db文件中。3.3 系统各功能流程图(1)主模块功能流程图如图3-5:图3-4 主模块流程图需要说明的问题:1指向内存池的是一个全局变量指针。2初始的URL必须从文件中读取,然后调用函数get_host()解析出URL的host, page, dir, port。3必须要有全局变量指向URL队列的头。(2)功能模块流程图如图3-6:图3-5 下载模块流程图 需要说明的问题:1启动线程下载。2对于GET请求不变动的部分使用宏定义。3在链接服务器前需要建立socket套
11、接字并进行域名解析。4注意HTTP报文头的接受。(3)功能模块流程图如图3-7:图3-6 解析模块流程图需要说明的问题:1)利用系统函数把网页读入内存。2)利用正则表达式提取相关信息。3)把一个网页的URL写入文件保存。(4)功能模块流程图如图3-8:图3-7 界面流程图需要说明的问题:1配置界面配置爬行深度的参数必须大于0。2每个界面必须有返回按钮和返回首页的按钮。3配置界面输入的URL不能为空。4 系统实现4.1 相关技术分析4.1.1 多线程操作系统能够运行多线程还不到40年,但线程的出现带来了很多正面影响,使用多线程具有以下好处: (1)和进程相比,多线程是多任务操作中十分“节俭”的方
12、式。在Linux操作系统中,开启新进程来达到多任务工作的目的是十分昂贵的,因为必须给新进程分配独立的地址空间以及用来维护代码段的众多数据表、堆栈段、数据段。而多个线程共享相同的内存空间和大部分数据,因此启动一个线程跟启动一个进程在所花费的空间上有很大的差别,同时,在启动需要的时间上线程要远远小于进程。(2)通信机制。由于进程具有独立的数据空间,因此进程间只能通过通信的方式进行数据传递,显然这种方式是耗时又不方便的。由于线程共享数据空间的特性,因此线程与线程通信更加方便。当然共享特性也带了一定的数据不一致的风险,但可以通过锁机制来解决。4.1.2 内存池申请内存空间几乎是每个系统必须涉及到的,而
13、直接使用系统函数malloc和free进行内存分配和释放会产生额外的开销并且频繁使用还会产生大量内存碎片从而降低程序运行效率,同时还容易造成内存泄漏。内存池很好的解决了直接调用系统函数所带来的问题。也就说使用内存池进行内存申请、释放要比使用malloc和free方式快,系统开销小;不会造成内存碎片或有很少的内存碎片同时内存池很好的避免了内存泄漏。4.1.3 正则表达式在本说明书所叙述的网络爬虫系统中在提取网页中链接、提取网页标题等功能函数中使用了正则表达式。正则表达式是Linux系统中一种非常重要的字符串搜索模式,是一组规则字符的集合。这些规则字符能够组成我们所需要的搜索规则,效率高、功能强,
14、可以极大地简化处理字符串时的复杂度。虽然标准C是不支持正则表达式的,但是可以在POSIX函数库中的regex系列函数的辅助下在程序中运用它们。4.1.4 SSL协议SSL的全称是Secure Sockets Layer,它是一个为基于TCP的应用层协议提供安全连接的安全协议,为网络上数据的传输提供安全性保证,因而被广泛应用于网上银行、电子商务等金融领域。SSL提供的安全连接(如https)可以实现:(1)连接的私密性:传输的数据是利用对称密钥进行加密,并利用RSA加密传输对称密钥算法中使用的密钥。(2)身份验证:对服务器和客户端进行身份验证的方法是基于证书利用数字签名实现的。SSL服务器和客户
15、端通过公钥基础设施提供的机制从认证机构获取证书。(3)连接的可靠性:使用基于密钥的消息验证码来检验传输消息的完整性。消息验证码是将密钥和随机数转换为定长数据的一种算法。SSL协议本身可以分为两层:底层为SSL记录协议(SSL record protocol);上层为SSL握手协议(SSL handshake protocol)、SSL密码变化协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。4.2 系统功能模块的实现(一)主模块(1)主要事件流:1调用内存池模块创建内存池返回指向内存池的指针并在程序结尾销毁内存池。2
16、初始URL队列。3调用下载模块和分析模块。(2)异常事件流:1创建内存池失败。2初始URL队列失败。(3)重要编码实现: cache = object_cache_create( sizeof(WEBNODE), OBJECT_COUNT ); confp = fopen(CONF_PATH, r); crawl_deep = atoi(buf); rfp = fopen(FILE_PATH, r); while() get_host(); add_init_node(); handle_init_node(nodeheader, FIRST); object_cache_destroy( c
17、ache );(二) 内存池模块(1)主要事件流:1创建内存池。2销毁内存池。3分配内存对象。4回收内存对象。5释放内存对象。(2)异常事件流:1申请大块内存失败。2分配内存对象失败。3释放内存块失败。(3)模块重要函数接口:1int object_cache_init( object_cache_t *cache, size_t unit_size, unsigned count );接口功能: 初始化对象缓存。 针对已有的缓存结构进行初始化;若count为0,则初始化后缓存中不包含可用对象在第一次申请时创建OBJECT_CACHE_DEFAULT_COUNT数目的对象。2void obje
18、ct_cache_free( object_cache_t *cache );接口功能:释放对象缓存内部存储。3object_cache_t *object_cache_create( size_t unit_size, unsigned count );接口功能: 创建对象缓存池 。unit_size 单个对象大小; count 初始对象数目,同样作为自动扩大的数目。4void object_cache_destroy( object_cache_t *cache );接口功能:销毁对象缓存池,同时销毁缓存中的所有对象。5void *object_new( object_cache_t *c
19、ache );接口功能:从缓存中获取一个新对象6int object_del( object_cache_t *cache, void *object );接口功能:将对象释放到缓存中。(三)下载模块(1)主要事件流:1构造GET请求。2链接服务器。3发送GET请求。4接受网站返回的数据。(2)异常事件流:1链接网站服务器失败。 2发送请失败。3接受网站返回数据失败(3)重要代码实现:static int get_https_page(int sockfd, WEBNODE *node, char *request) SSL_library_init(); OpenSSL_add_all_al
20、gorithms(); SSL_load_error_strings(); ctx = SSL_CTX_new(SSLv23_client_method(); ssl = SSL_new(ctx); SSL_set_fd(ssl, sockfd); if (SSL_connect(ssl) else SSL_get_cipher(ssl); len = SSL_write(ssl, request, strlen(request); while() 。接受报文头。 while( ) fclose(localfp); (四)解析模块(1)主要事件流:1把网页读入内存。2提取网页标题。3提取网页关
21、键字。4提取网页类型和编码。5提取网页链接。6检查链接是否处理过。(2)异常事件流:1向URL队列添加链接。2网页读入内存失败。3打开文件失败。(3)重要代码实现: struct node_t *getinfo (const char *page, const char *pattern) nodearr = malloc (maxnode * sizeof (struct node_t); for ( i=0; patterni; i+ ) regcomp (®, patterni, REG_EXTENDED | REG_ICASE); p = page; while (1) ret
22、= regexec (®, p, NRM, rm, 0); maxnode += ADDNODESTEP; nodearr = realloc (nodearr, maxnode * sizeof (struct node_t); ret = addnode (nodearr, nnode, newpattern, rm); p = page + ret; regfree (®); nodearrnnode.begin = -1; nodearrnnode.end = -1; qsort (nodearr, nnode, sizeof (struct node_t), nodecm
23、p); (五)界面(1)主要事件流:1能够设置参数和添加网页链接。2能够显示参数和链接并可以对他们进行基本的操作。3能够执行后台的爬虫系统。4能够显示执行结果。(2)异常事件流:1添加不合法的数据。(六)其他功能模块(1)主要事件流:1读取现在的时间。2保存及时数据。(2)异常事件流:1打开文件失败。5 测试与结果对界面的测试:能够通过界面把数据写入文件并能够从文件中读出在页面上显示。返回和执行按钮可以正常的使用。数据的修改和删除功能能够正常使用。但对于异常数据没有进行判断以致不合法的数据也可以写入配置文件。对爬虫程序的测试:输入不合法的URL。能够把错误类型写入日志文件。输入各种类型的URL
24、,只对http和https链接处理其他链接被视为异常。对系统速度的测试:经过多次运行计算平均数值。得到系统的运行效率不是很高。平均每秒大约下载3个网页。测试移植性:把系统移植到其他的linux系统上运行大多是缺少openssl库而致使系统出错。总的来说系统没有出现系统无响应,处于死机状态,需要其他人工修复系统才可复原这样的严重错误。经过多测试和修改系统现已能够正常运行。配置界面和效果图如下:图5-1 使用linux命令行运行系统的效果图图5-2 配置界面图说明:1设置参数把参数写进了set.conf文件。2添加网址把网址写进了init_url文件。3执行爬虫程序按钮是触发系统运行。图5-3 运
25、行之后的效果图说明:1点击查看日志按钮出现的效果图为图5-4。2点击查看网页信息出现效果图为图5-5。3点击查看网页中的链接出现效果图为图5-6.4点击打开网页出现效果图为图5-7。图5-4 显示日志文件效果图图5-5 网页信息效果图图5-6 网页链接信息效果图图5-7 显示网页效果图Linux 下数据文件存储的格式如图5-8图5-8 linux下数据文件效果图说明:1page_db 文件夹中存放的文件如图5-9。2page_info 文件夹中存放的文件如图5-10。3page_url 文件夹中存放的问价如图5-11。图5-9 网页文件效果图图5-10 网页信息文件效果图图5-11 网页中的链
26、接效果图结论该系统主要实现了一下功能:1http和https协议链接网页的下载并把网页中的链接解析出来存放在文件中,2把网页中的标题,关键字,摘要解析出来存放在文件中。3把链接存放在URL队列中。4该系统现已能够顺利的运行,有很好的健壮性,可持续性。虽然系统能够正常的运行,但是由于本人的经验不足和时间有限,以及对一些相关的技术、思想、理论掌握的还不够透彻,因此本系统中还存在许多不足、许多待完善的地方:1现有的网络爬虫系统对除了http和https协议的链接能够下载外,对其他协议的链接均按异常情况处理。2对于后缀是.shtm和.shml的网页不能够下载。这些不足之处,会在今后的学习中不断的完善和
27、维护,希望能够达到更好的效果。参 考 文 献1 万源,万方,王大震一种并行Crawler系统中的URL分配算法设计口计算机工程与应用,20062 蒋宗礼,赵钦,肖华,等高性能并行爬行器计算机工程与设计 ,20063 张三峰,吴国新一种面向动态异构网络的容错非对称DHT方 法计算机研究与发展,20074 余锦,史树明分布式网页排序算法及其传输模式分析计算机工程与应用,20045 沈贺丹,潘亚楠关于搜索引擎的研究综述计算机技术与发展,20066 张敏,高剑峰,马少平基于链接描述文本及其上下文的Web信息检索计算机研究与发展,20047 贺广宜,罗莉分布式搜索引擎的设计与实现计算机应用,20038
28、周雪忠,吴朝晖文本知识发现:基于信息抽取的文本挖掘计算机科学,20039 陈华,罗昶,王建勇基于Web的百万级FTP搜索引擎的设计 与实现口计算机应用,200010 吴功宜,计算机网络(第三版).北京:清华大学出版社,200711 张海藩,软件工程导论(第五版).北京:清华大学出版社,200812 Winter,中文搜索引擎技术解密:网络蜘蛛 人民邮电出版社,200413 Sergey 等,The Anatomy of a Large-Scale Hypertextual Web Search Engine清华大学出版社,199814 Wisenut,WiseNut Search Engine
29、 white paper 中国电力出版社,200115(美)Gary R.Wright W.Richard Stevens,TCP-IP协议详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议 机械工业出版社,2002 16 (美)维尼|译者:李明/贾晓楠,登上GOOGLE之巅SEO技巧与技术 机械工业 201017 Ronald J.Norman.Object-Oriented System Analysis and Design.清华大学出版社,200118 Mark Wutka,Alan Moffet,Kunal MittalSams Teach Yourself JAVAServerPages 2.0 with Apache Tomcat in 24 HoursSams Publishing,200319 Kong Michael. An environment for secure SQL/Server computingOxford University Press Inc.199320 Tsui,Frank F. JSP EM DASH A RESEARCH SIGNAL PROCESSOR IN JOSEPHSON TECHNOLOGY. IBM Journal of Research and Development,Vol24, No2,1980
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1