网络爬虫的设计与实现完整版分解.docx
《网络爬虫的设计与实现完整版分解.docx》由会员分享,可在线阅读,更多相关《网络爬虫的设计与实现完整版分解.docx(21页珍藏版)》请在冰豆网上搜索。
![网络爬虫的设计与实现完整版分解.docx](https://file1.bdocx.com/fileroot1/2022-10/10/abf9787d-ae42-4538-90e8-56ac6cc645b2/abf9787d-ae42-4538-90e8-56ac6cc645b21.gif)
网络爬虫的设计与实现完整版分解
网络爬虫的设计与实现(完整版)分解
LT
目次
1引言
随着网络技术日新月异的发展,互联网俨然已成为信息的最大载体。
为了能够在浩瀚的信息海洋中精确地查询用户所需要的信息,搜索引擎技术应运而生。
目前比较流行的搜索引擎是Google和XX,他们拥有着庞大的用户数量。
作为搜索引擎的重要组成部分,网络爬虫的设计直接影响着搜索引擎的质量。
网络爬虫是一个专门从万维网上下载网页并分析网页的程序。
它将下载的网页和采集到的网页信息存储在本地数据库中以供搜索引擎使用。
网络爬虫的工作原理是从一个或若干初始网页的链接开始进而得到一个链接队列。
伴随着网页的抓取又不断从抓取到的网页里抽取新的链接放入到链接队列中,直到爬虫程序满足系统的某一条件时停止。
本说明书对课题背景进行简单介绍的同时,又对研究网络爬虫的意义进行了叙述,在此基础上,详细的介绍来了利用C语言在linux系统上开发出多线程网络爬虫的设计步骤。
1.1课题选题背景
搜索引擎是用户在网上冲浪时经常使用的一种工具,毫无疑问,每个用户都可以通过搜索引擎得到自己所需要的网络资源。
搜索引擎一词在互联网领域得到广泛的应用,但是每个地区对它又有着不同的理解。
在一些欧美国家搜索引擎常常是基于因特网的,它们通过网络爬虫程序采集网页,并且索引网页的每个词语,也就是全文检索。
而在一些亚洲国家,搜索引擎通常是基于网站目录的搜索服务。
总的来说:
搜索引擎只是一种检索信息的工具。
它的检索方式分为以下两种:
一种是目录型的方式,爬虫程序把网络的资源采集在一起,再根据资源类型的不同而分成不同的目录,然后继续一层层地进行分类,人们查询信息时就是按分类一层层进入的,最后得到自己所需求的信息。
另一种是用户经常使用的关键字方式,
搜索引擎根据用户输入的关键词检索用户所需资源的地址,然后把这些地址反馈给用户。
1.2课题研究的意义
网络在我们的生活中越来越重要,网络的信息量也越来越大,研究该课题可以更好的理解网络爬虫在搜索引擎中的作用以及网络爬虫的原理。
现实中,一般的服务器大多是linux系统该课题更好的配合了linux系统上运行爬虫程序,加上界面更容易操作。
21世纪是一个讲究信息安全的时代,于是网站上出现了越来越多的https(超文本传输安全协议)协议的链接,该课题很好的利用了SSL协议解决了下载https协议链接的问题。
设备的内存是珍贵的,如何更加合理有效地利用内存提高内存的利用率是值得研究的,该课题为了解决内存的利用使用了内存池来提高内存的使用率。
2需求分析
网络爬虫是一个专门从万维网上下载网页并分析网页的程序。
它将下载的网页和收集到的信息存储在本地数据库中以供搜索引擎使用。
网络爬虫的工作原理是从一个或若干初始网页的链接开始进而得到一个链接队列。
伴随着网页的抓取又不断从抓取到的网页里抽取新的链接放入到链接队列中,直到爬虫程序满足系统的某一条件时停止。
它是搜索引擎的重要组成部分。
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)保存功能
1能够正确保存网页以及网页信息到文件。
2功能把系统运行中的异常写入日志文件。
(5)界面
1可以配置参数和运行后台的爬虫系统。
2能够查看运行结果。
2.2系统性能分析
当用户使用系统时,系统需要能够对于一些异常状况系统能够记录并跳过此异常继续执行。
系统需要具有较高的可移植性和可靠性。
系统需要具有很好的可测试性和可维护性。
网络爬虫系统是不停的从万维网上下载网页和采集网页信息的系统。
由于网络爬虫系统是搜索引擎的组成部分,搜索引擎要利用到爬虫系统的信息,所以系统要设计合理的存储文件并建立索引。
3系统设计
3.1系统工作流程图
本系统通过IE共同访问Apache服务器的发布的页面、Apache服务器返回页面方便用户操作。
(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
网络服务器所使用的端口
dir
char*
网页所在的目录
page
char*
网页文件名
file
char*
本地保存的文件名
pageinfo
char*
保存网页信息的文件名
url
char*
存储网页链接
title
char*
网页的标题
keywords
char*
网页的关键字
body
char*
网页的摘要
protocal
char
连接使用的协议0-http1--https
url_count
int
网页中的链接数目
type
char*
网页类型
code
char*
网页编码
page_size
int
网页大小
is_handled
char
是否处理过
brother
strcut*
兄弟节点链表指针
child
struct*
子节点链表指针
系统把初始的链接保存在了init_url文件中;把一些异常情况保存在了crawl.log文件中;把下载的网页文件保存在了page_db文件夹中;把网页信息文件保存在page_info文件夹中;把网页中链接文件保存在了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套接字并进行域名解析。
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)和进程相比,多线程是多任务操作中十分“节俭”的方式。
在Linux操作系统中,开启新进程来达到多任务工作的目的是十分"昂贵"的,因为必须给新进程分配独立的地址空间以及用来维护代码段的众多数据表、堆栈段、数据段。
而多个线程共享相同的内存空间和大部分数据,因此启动一个线程跟启动一个进程在所花费的空间上有很大的差别,同时,在启动需要的时间上线程要远远小于进程。
(2)通信机制。
由于进程具有独立的数据空间,因此进程间只能通过通信的方式进行数据传递,显然这种方式是耗时又不方便的。
由于线程共享数据空间的特性,因此线程与线程通信更加方便。
当然共享特性也带了一定的数据不一致的风险,但可以通过锁机制来解决。
4.1.2内存池
申请内存空间几乎是每个系统必须涉及到的,而直接使用系统函数malloc和free进行内存分配和释放会产生额外的开销并且频繁使用还会产生大量内存碎片从而降低程序运行效率,同时还容易造成内存泄漏。
内存池很好的解决了直接调用系统函数所带来的问题。
也就说使用内存池进行内存申请、释放要比使用malloc和free方式快,系统开销小;不会造成内存碎片或有很少的内存碎片同时内存池很好的避免了内存泄漏。
4.1.3正则表达式
在本说明书所叙述的网络爬虫系统中在提取网页中链接、提取网页标题等功能函数中使用了正则表达式。
正则表达式是Linux系统中一种非常重要的字符串搜索模式,是一组规则字符的集合。
这些规则字符能够组成我们所需要的搜索规则,效率高、功能强,可以极大地简化处理字符串时的复杂度。
虽然标准C是不支持正则表达式的,但是可以在POSIX函数库中的regex系列函数的辅助下在程序中运用它们。
4.1.4SSL协议
SSL的全称是SecureSocketsLayer,它是一个为基于TCP的应用层协议提供安全连接的安全协议,为网络上数据的传输提供安全性保证,因而被广泛应用于网上银行、电子商务等金融领域。
SSL提供的安全连接(如https)可以实现:
(1)连接的私密性:
传输的数据是利用对称密钥进行加密,并利用RSA加密传输对称密钥算法中使用的密钥。
(2)身份验证:
对服务器和客户端进行身份验证的方法是基于证书利用数字签名实现的。
SSL服务器和客户端通过公钥基础设施提供的机制从认证机构获取证书。
(3)连接的可靠性:
使用基于密钥的消息验证码来检验传输消息的完整性。
消息验证码是将密钥和随机数转换为定长数据的一种算法。
SSL协议本身可以分为两层:
底层为SSL记录协议(SSLrecordprotocol);上层为SSL握手协议(SSLhandshakeprotocol)、SSL密码变化协议(SSLchangecipherspecprotocol)和SSL警告协议(SSLalertprotocol)。
4.2系统功能模块的实现
(一)主模块
(1)主要事件流:
1调用内存池模块创建内存池返回指向内存池的指针并在程序结尾销毁内存池。
2初始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(cache);
(二)内存池模块
(1)主要事件流:
1创建内存池。
2销毁内存池。
3分配内存对象。
4回收内存对象。
5释放内存对象。
(2)异常事件流:
1申请大块内存失败。
2分配内存对象失败。
3释放内存块失败。
(3)模块重要函数接口:
1intobject_cache_init(object