C++网络爬虫

注意:这篇文章主要是关于怎样设计C++爬虫代码框架,具体实现还是得自己去开发,希望大家能有所收获。
1.关于项目
需求、设计、编码、测试、集成

2.软件开发要掌握的思想
模块思维
渐进式开发

3.需求:
自动抓取网络资源的软件
1.资源是什么?网页、图片、音乐、图片…
2.自动化?一旦运行就不需要更多的干预。

生成需求说明文档。
内容:对于需求中不明确或不完善的说明进行解释

4.设计:
业务设计:从顶层开始思考设计,避免过早的陷入细节
在这里插入图片描述
设计处理流程:
1.得到爬取种子(URL)
2.根据爬取种子下载资源(页面)
3.解析页面,提取更多的URL
4.对页面做持久化操作
5.根据提取的URL再进行下载操作
6.重复第2步到第5步

系统设计:
在这里插入图片描述
控制器:
在这里插入图片描述
控制器由三个模块组成:
1、配置文件处理模块:从配置文件中读取配置项,提供配置香的提取接口

2、URL维护模块:负责维护URL库,提供如下功能
a>输入新的URL
b>输出未抓取的URL
c>负责维护URL的抓取状态

3、任务调度模块
a>负责协调控制器的流程
b>负责调用其他系统模块完成工作

4、维护URL列表数据结构

下载器:
在这里插入图片描述
解析器:
在这里插入图片描述
持久化器:
在这里插入图片描述

控制器:
配置文件处理模块设计:
概要设计:
配置文件设计
key=value 形式
注释:以”#“标记

项目 字段
并发任务数 job_num
url种子 seed
抓取深度 deeps
模块存放路径 Module_path
模块名称 Module_name
允许抓取的资源类型 file_type
输出日记的等级 log_level

详细设计:

操作:
1.读取配置文件
2.得到配置文件选项的值(键值)
3.初始化

class ConfigParser
{
public:
//设计为单例模式
ConfigParser();
load();
getValue();
private:
job_num;
seed;

};

配置文件读取
1、按行读取fgets
2、分隔字符串
3、消除注释
4、消除空格

URL维护模块:
分析:
url格式:http://192.168.247.16/docs/linuxdev.html
结构:域名或IP地址,路径,文件名

设计URL的数据结构
项目名称 字段名称
完整URL url
协议类型 protocal
域名 Sitename
资源路径 Path
文件名 filename
当前url处理状态(0,1,-1) state
当前url深度 deep
当前资源类型 type

http协议请求页面时的流程
1.输入网址
2.向DNS发送解析请求
3.DNS返回给我们一个对应的IP地址
4.通过IP地址向资源所在的主机发送请求
5.如果资源存在,主机返回200状态,同时返回http数据部分
6.本地http客户端接收数据

页面抓取的处理流程:
1.得到URL
2.URL进入抓取队列等待抓取
3.从队列中得到一个URL,把其分配给下载器的实例
4.得到下载器的处理状态(URL的数据结构后三项)
5.得到当前页面中存在的下一级URL列表

URL维护模块操作:
1.添加新URL
2.使URL进入抓取队列
3.从抓取队列中移除一个URL
4.修改URL库中某一个URL值
5.添加新的URL的列表
在这里插入图片描述
class url
{
public:
初始化
set();
get();
private:
URL的数据结构;

};

class UrlManager
{
public:
addUrl();
addUrlList();
getUrlForQuque();
removeUrlForQueue();
setUrlValue();
private:
findUrl();
list Urls;
map<url*>UrlMap;
quque<Url*>Urlquque;
};

任务调度模块:
程序的主框架流程
要求:
1.可以控制程序按照普通程序模式还是按守护进程模式运行
2.可以通过参数提供帮助
3.提供一个运行框架,可以支持多任务管理
4.包含程序的主流程

处理流程:
1.程序运行时先处理命令行参数,根据参数跳转到相应分支或调用的相应函数
2.检测是否按照守护进程模式运行
3.初始化环境
a 读取配置文件,提取配置文件中的参数
b 根据守护进程模式的标记将当前进程转变为守护进程
c 载入程序模块的动态库
4.开始程序的主处理流程
a 检测种子是否存在
b 分析种子,得到种子url的IP地址(DNS解析)
c 根据种子的url得到第一个页面
d 对页面进行处理
e 从URL管理器中取出一个URL
f 启动一个处理任务
g 监控任务处理数量,如果任务维护池中有空闲任务,重复e
h 回收资源,准备结束任务

分解其中步骤:
d
1 对页面进行解析,提取内部的下级url
2 生成url列表,把url列表传给url管理器
3 对页面进行持久化处理
f
1 从url管理器得到一个未处理的url
2 通过调用epoll框架产生一个新任务
3 调用页面处理过程d
4 释放处理过程中产生的临时资源

日记工具:
规则:日记等级+日期时间+调试信息
日记等级:DEBUG(调试),INFO(普通信息),WARN(警告信息),ERROR(错误信息),CRIT(崩溃信息)

需要控制日记信息输出到终端还是输出到日记文件中

日记调用接口设计:
SPIDER_LOG(日记等级标记,日记输出信息);
接口内部的处理流程:
1.得到控制日记输出等级的标记,用来控制当前日记是否要输出
2.得到调用日记接口的时间
3.得到日记输出信息并进行日记字符串的拼接
4.把日记信息输出到指定的设备

插件框架设计:
为什么需要插件模式?
1.升级和扩充功能
2.维护方便
3.动态修改

设计:
1.动态载入.so文件
2.维护.so文件中的接口函数

设计原则:
1.一个功能一个模块
2.可以自我维护
模块详细结构:
主版本号 version
次版本号 subver
模块名称 name
入口函数指针 int(handle)(void);
初始化函数指针 int(init)(Moudle);
模块管理器:
1.载入模块操作
LoadModule(charpath,charname);
Module*getMoudle(char *name);
在这里插入图片描述
载入模块操作的处理流程:
1.通过路径找到模块文件.so
2.调用dlopen打开动态库(.so)
3.使用动态库
4.关闭动态库

下载器与解析器:
下载器模块分为socket功能封装和http功能模块

Socket功能框架设计:
1.初始化socket
2.向服务器发送请求
3.接受服务器反馈的数据
4.设置socket模式

HTTP协议处理模块
1.解析头
2.组装头

页面解析的处理流程:
1.得到下载的页面
2.得到页面对应的URL结构体
3.使用正则得到页面中所有的url列表
4.处理url的相对路径
6.把得到的url列表返回

持久化器:

处理流程:
1.得到页面数据
2.得到当前页面的url描述结构体
3.生成保存目录
4.把文件按照指定格式写入磁盘系统
5.向主流程发送一个反馈,表示当前页面处理的进度

系统核心代码:
1.系统主处理框架
2.Epoll框架的调用
3.插件框架的完整实现
4.Soket功能封装
5.http协议头解析
6.html解析并提取url列表
7.url管理器实现

项目中用到一个开源库
libevent

怎样采用开源库
1、开源库一定要成熟
a.判断成熟度?
release版,成熟的
beta版测试版
rc版发布预览版
2、使用libevent的dns解析功能

系统中可以被开源库替换的部分
下载器:
wget curl

对代码进行单元测试:
断言:#include <assert.h>
assert();
测试工具:cunit

  • 17
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值