云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 网络爬虫地设计与实现(完整版)分解 - 图文

网络爬虫地设计与实现(完整版)分解 - 图文

  • 62 次阅读
  • 3 次下载
  • 2025/6/3 15:32:53

标准文档

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, \crawl_deep = atoi(buf); rfp = fopen(FILE_PATH, \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();

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

标准文档 4 系统实现 4.1 相关技术分析 4.1.1 多线程 操作系统能够运行多线程还不到40年,但线程的出现带来了很多正面影响,使用多线程具有以下好处: (1) 和进程相比,多线程是多任务操作中十分“节俭”的方式。在Linux操作系统中,开启新进程来达到多任务工作的目的是十分\昂贵\的,因为必须给新进程分配独立的地址空间以及用来维护代码段的众多数据表、堆栈段、数据段。而多个线程共享相同的内存空间和大部分数据,因此启动一个线程跟启动一个进程在所花费的空间上有很大的差别,同时,在启动需要的时间上线程要远远小于进程。 (2) 通信机制。由于进程具有独立的数据空间,因此进程间只能通过通信的方式进行数据传递,显然这种方式是耗时又不方便的。由于线程共享数

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com