资源描述
网络爬虫设计和实现
摘 要
网络爬虫将下载网页和搜集到网页信息存放在当地数据库中以供搜索引擎使用,它是一个专门从万维网上下载网页并分析网页程序。伴随网络快速发展,大家对搜索引擎要求也越来越高,而网络爬虫效率直接影响着搜索引擎质量。
本课题研究是通用网络爬虫,它是从一个或若干个初始网页链接开始进而得到一个链接队列。伴伴随网页抓取又不停从抓取到网页中抽取新链接放入到链接队列中,直到爬虫系统满足了停止条件。该课题关键包含到了缓冲池技术,多线程技术,套接字技术,HTTP和SSL协议,正则表示式,Linux网络编程技术,PHP+Apache使用等相关技术。
本说明书叙述网络爬虫是以Linux C实现,加以PHP语言编写界面使用户愈加方面操作,利用Shell脚本和Apache服务器使得爬虫系统和界面很好结合在一起。
关键词:网络爬虫 缓冲池 正则表示式 SSL协议 多线程
目 次
1 引言 1
1.1 课题选题背景 1
1.2 课题研究意义 2
2 需求分析 3
2.1 功效需求分析 3
2.2 系统性能分析 4
3 系统设计 5
3.1 系统工作步骤图 5
3.2 数据结构设计 6
3.3 系统各功效步骤图 7
4 系统实现 10
4.1 相关技术分析 10
4.2 系统功效模块实现 11
5 测试和结果 17
结论 23
致 谢 24
参 考 文 献 25
1 引言
伴随网络技术日新月异发展,互联网俨然已成为信息最大载体。为了能够在浩瀚信息海洋中正确地查询用户所需要信息,搜索引擎技术应运而生。现在比较流行搜索引擎是谷歌和baidu,她们拥有着庞大用户数量。
作为搜索引擎关键组成部分,网络爬虫设计直接影响着搜索引擎质量。
网络爬虫是一个专门从万维网上下载网页并分析网页程序。它将下载网页和采集到网页信息存放在当地数据库中以供搜索引擎使用。网络爬虫工作原理是从一个或若干初始网页链接开始进而得到一个链接队列。伴伴随网页抓取又不停从抓取到网页里抽取新链接放入到链接队列中,直到爬虫程序满足系统某一条件时停止。
本说明书对课题背景进行简单介绍同时,又对研究网络爬虫意义进行了叙述,在此基础上,具体介绍来了利用C语言在linux系统上开发出多线程网络爬虫设计步骤。
1.1 课题选题背景
搜索引擎是用户在网上冲浪时常常使用一个工具,毫无疑问,每个用户全部能够经过搜索引擎得到自己所需要网络资源。搜索引擎一词在互联网领域得到广泛应用,不过每个地域对它又有着不一样了解。在部分欧美国家搜索引擎常常是基于因特网,它们经过网络爬虫程序采集网页,而且索引网页每个词语,也就是全文检索。而在部分亚洲国家,搜索引擎通常是基于网站目录搜索服务。
总来说:搜索引擎只是一个检索信息工具。它检索方法分为以下两种:一个是目录型方法,爬虫程序把网络资源采集在一起,再依据资源类型不一样而分成不一样目录,然后继续一层层地进行分类,大家查询信息时就是按分类一层层进入,最终得到自己所需求信息。另一个是用户常常使用关键字方法,
搜索引擎依据用户输入关键词检索用户所需资源地址,然后把这些地址反馈给用户。
1.2 课题研究意义
网络在我们生活中越来越关键,网络信息量也越来越大,研究该课题能够愈加好了解网络爬虫在搜索引擎中作用和网络爬虫原理。现实中,通常服务器大多是linux系统该课题愈加好配合了linux系统上运行爬虫程序,加上界面更轻易操作。二十一世纪是一个讲究信息安全时代,于是网站上出现了越来越多https(超文本传输安全协议)协议链接,该课题很好利用了SSL协议处理了下载https协议链接问题。设备内存是珍贵,怎样愈加合理有效地利用内存提升内存利用率是值得研究,该课题为了处理内存利用使用了内存池来提升内存使用率。
2 需求分析
网络爬虫是一个专门从万维网上下载网页并分析网页程序。它将下载网页和搜集到信息存放在当地数据库中以供搜索引擎使用。网络爬虫工作原理是从一个或若干初始网页链接开始进而得到一个链接队列。伴伴随网页抓取又不停从抓取到网页里抽取新链接放入到链接队列中,直到爬虫程序满足系统某一条件时停止。它是搜索引擎关键组成部分。
2.1 功效需求分析
(1) 网页下载功效
① 能够下载任何http协议和https协议链接网页。
② 结构HTTP请求中GET请求。
③ 分析HTTP响应请求。
(2) 网页分析功效
① 提取网页标题。
② 提取网页关键字。
③ 提取网页摘要。
④ 提取网页链接并统计数量。
⑤ 把新链接加入到URL队列。
(3) 内存池功效
① 能够分配固定大小内存。
② 能够回收内存对象。
③ 能够释放内存对象。
④ 能够销毁内存池。
⑤ 能够分配固定大小内存。
(4) 保留功效
① 能够正确保留网页和网页信息到文件。
② 功效把系统运行中异常写入日志文件。
(5) 界面
① 能够配置参数和运行后台爬虫系统。
② 能够查看运行结果。
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 -http 1-- 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 主模块步骤图
需要说明问题:
① 指向内存池是一个全局变量指针。
② 初始URL必需从文件中读取,然后调用函数get_host()解析出URLhost, page, dir, port。
③ 必需要有全局变量指向URL队列头。
(2) 功效模块步骤图图3-6:
图3-5 下载模块步骤图
需要说明问题:
① 开启线程下载。
② 对于GET请求不变动部分使用宏定义。
③ 在链接服务器前需要建立socket套接字并进行域名解析。
④ 注意HTTP报文头接收。
(3) 功效模块步骤图图3-7:
图3-6 解析模块步骤图
需要说明问题:
1) 利用系统函数把网页读入内存。
2) 利用正则表示式提取相关信息。
3) 把一个网页URL写入文件保留。
(4) 功效模块步骤图图3-8:
图3-7 界面步骤图
需要说明问题:
① 配置界面配置爬行深度参数必需大于0。
② 每个界面必需有返回按钮和返回首页按钮。
③ 配置界面输入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.4 SSL协议
SSL全称是Secure Sockets Layer,它是一个为基于TCP应用层协议提供安全连接安全协议,为网络上数据传输提供安全性确保,所以被广泛应用于网上银行、电子商务等金融领域。SSL提供安全连接(如https)能够实现:
(1) 连接私密性:传输数据是利用对称密钥进行加密,并利用RSA加密传输对称密钥算法中使用密钥。
(2) 身份验证:对服务器和用户端进行身份验证方法是基于证书利用数字署名实现。SSL服务器和用户端经过公钥基础设施提供机制从认证机构获取证书。
(3) 连接可靠性:使用基于密钥消息验证码来检验传输消息完整性。消息验证码是将密钥和随机数转换为定长数据一个算法。
SSL协议本身能够分为两层:底层为SSL统计协议(SSL record protocol);上层为SSL握手协议(SSL handshake protocol)、SSL密码改变协议(SSL change cipher spec protocol)和SSL警告协议(SSL alert protocol)。
4.2 系统功效模块实现
(一) 主模块
(1) 关键事件流:
① 调用内存池模块创建内存池返回指向内存池指针并在程序结尾销毁内存池。
② 初始URL队列。
③ 调用下载模块和分析模块。
(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) 关键事件流:
① 创建内存池。
② 销毁内存池。
③ 分配内存对象。
④ 回收内存对象。
⑤ 释放内存对象。
(2) 异常事件流:
① 申请大块内存失败。
② 分配内存对象失败。
③ 释放内存块失败。
(3) 模块关键函数接口:
① int object_cache_init( object_cache_t *cache, size_t unit_size, unsigned count );接口功效: 初始化对象缓存。 针对已经有缓存结构进行初始化;若count为0,则初始化后缓存中不包含可用对象在第一次申请时创建OBJECT_CACHE_DEFAULT_COUNT数目标对象。
② void object_cache_free( object_cache_t *cache );接口功效:释放对象缓存内部存放。
③ object_cache_t *object_cache_create( size_t unit_size, unsigned count );接口功效: 创建对象缓存池 。unit_size 单个对象大小; count 初始对象数目,一样作为自动扩大数目。
④ void object_cache_destroy( object_cache_t *cache );接口功效:销毁对象缓存池,同时销毁缓存中全部对象。
⑤ void *object_new( object_cache_t *cache );接口功效:从缓存中获取一个新对象
⑥ int object_del( object_cache_t *cache, void *object );接口功效:将对象释放到缓存中。
(三) 下载模块
(1) 关键事件流:
① 结构GET请求。
② 链接服务器。
③ 发送GET请求。
④ 接收网站返回数据。
(2) 异常事件流:
① 链接网站服务器失败。
② 发送请失败。
③ 接收网站返回数据失败
(3) 关键代码实现:
static int get_https_page(int sockfd, WEBNODE *node, char *request)
{
SSL_library_init();
OpenSSL_add_all_algorithms();
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) 关键事件流:
① 把网页读入内存。
② 提取网页标题。
③ 提取网页关键字。
④ 提取网页类型和编码。
⑤ 提取网页链接。
⑥ 检验链接是否处理过。
(2) 异常事件流:
① 向URL队列添加链接。
② 网页读入内存失败。
③ 打开文件失败。
(3) 关键代码实现:
struct node_t *getinfo (const char *page, const char *pattern[])
{
nodearr = malloc (maxnode * sizeof (struct node_t));
for ( i=0; pattern[i]; i++ )
{
regcomp (®, pattern[i], REG_EXTENDED | REG_ICASE);
p = page;
while (1)
{
ret = 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 (®);
}
nodearr[nnode].begin = -1;
nodearr[nnode].end = -1;
qsort (nodearr, nnode, sizeof (struct node_t), nodecmp);
}
(五) 界面
(1) 关键事件流:
① 能够设置参数和添加网页链接。
② 能够显示参数和链接并能够对她们进行基础操作。
③ 能够实施后台爬虫系统。
④ 能够显示实施结果。
(2) 异常事件流:
① 添加不正当数据。
(六) 其它功效模块
(1) 关键事件流:
① 读取现在时间。
② 保留立即数据。
(2) 异常事件流:
① 打开文件失败。
5 测试和结果
对界面测试:能够经过界面把数据写入文件并能够从文件中读出在页面上显示。返回和实施按钮能够正常使用。数据修改和删除功效能够正常使用。但对于异常数据没有进行判定以致不正当数据也能够写入配置文件。
对爬虫程序测试:输入不正当URL。能够把错误类型写入日志文件。输入多种类型URL,只对http和https链接处理其它链接被视为异常。对系统速度测试:经过数次运行计算平均数值。得到系统运行效率不是很高。平均每秒大约下载3个网页。测试移植性:把系统移植到其它linux系统上运行大多是缺乏openssl库而致使系统犯错。总来说系统没有出现系统无响应,处于死机状态,需要其它人工修复系统才可复原这么严重错误。经过多测试和修改系统现已能够正常运行。配置界面和效果图以下:
图5-1 使用linux命令行运行系统效果图
图5-2 配置界面图
说明:
① 设置参数把参数写进了set.conf文件。
② 添加网址把网址写进了init_url文件。
③ 实施爬虫程序按钮是触发系统运行。
图5-3 运行以后效果图
说明:
① 点击查看日志按钮出现效果图为图5-4。
② 点击查看网页信息出现效果图为图5-5。
③ 点击查看网页中链接出现效果图为图5-6.
④ 点击打开网页出现效果图为图5-7。
图5-4 显示日志文件效果图
图5-5 网页信息效果图
图5-6 网页链接信息效果图
图5-7 显示网页效果图
Linux 下数据文件存放格式图5-8
图5-8 linux下数据文件效果图
说明:
① page_db 文件夹中存放文件图5-9。
② page_info 文件夹中存放文件图5-10。
③ page_url 文件夹中存放问价图5-11。
图5-9 网页文件效果图
图5-10 网页信息文件效果图
图5-11 网页中链接效果图
结论
该系统关键实现了一下功效:
① http和https协议链接网页下载并把网页中链接解析出来存放在文件中,
② 把网页中标题,关键字,摘要解析出来存放在文件中。
③ 把链接存放在URL队列中。
④ 该系统现已能够顺利运行,有很好健壮性,可连续性。
即使系统能够正常运行,不过因为本人经验不足和时间有限,和对部分相关技术、思想、理论掌握还不够透彻,所以本系统中还存在很多不足、很多待完善地方:
① 现有网络爬虫系统对除了http和https协议链接能够下载外,对其它协议链接均按异常情况处理。
② 对于后缀是.shtm和.shml网页不能够下载。
这些不足之处,会在以后学习中不停完善和维护,期望能够达成愈加好效果。
参 考 文 献
[1] 万源,万方,王大震.一个并行Crawler系统中URL分配算法设计口.计算机工程和应用,
[2] 蒋宗礼,赵钦,肖华,等.高性能并行爬行器.计算机工程和设计 ,
[3] 张三峰,吴国新.一个面向动态异构网络容错非对称DHT方 法.计算机研究和发展,
[4] 余锦,史树明.分布式网页排序算法及其传输模式分析.计算机工程和应用,
[5] 沈贺丹,潘亚楠.相关搜索引擎研究综述.计算机技术和发展,
[6] 张敏,高剑峰,马少平.基于链接描述文本及其上下文Web信息检索.计算机研究和发展,
[7] 贺广宜,罗莉.分布式搜索引擎设计和实现.计算机应用,
[8] 周雪忠,吴朝晖.文本知识发觉:基于信息抽取文本挖掘.计算机科学,
[9] 陈华,罗昶,王建勇.基于Web百万级FTP搜索引擎设计 和实现口.计算机应用,
[10] 吴功宜,计算机网络(第三版).北京:清华大学出版社,
[11] 张海藩,软件工程导论(第五版).北京:清华大学出版社,
[12] Winter,汉字搜索引擎技术解密:网络蜘蛛 人民邮电出版社,
[13] Sergey 等,The Anatomy of a Large-Scale Hypertextual Web Search Engine清华大学出版社,1998
[14] Wisenut,WiseNut Search Engine white paper 中国电力出版社,
[15](美)Gary R.Wright W.Richard Stevens,TCP-IP协议详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议 机械工业出版社,
[16] (美)维尼|译者:李明//贾晓楠,登上谷歌之巅——SEO技巧和技术 机械工业
[17] Ronald J.Norman.Object-Oriented System Analysis and Design.清华大学出版社,
[18] Mark Wutka,Alan Moffet,Kunal Mittal.Sams Teach Yourself JAVAServerPages 2.0 with Apache Tomcat in 24 Hours.Sams Publishing,
[19] Kong Michael. An environment for secure SQL/Server computing.Oxford University Press Inc.1993
[20] Tsui,Frank F. JSP EM DASH A RESEARCH SIGNAL PROCESSOR IN JOSEPHSON TECHNOLOGY. IBM Journal of Research and Development,Vol24, No2,1980
展开阅读全文