网络爬虫项目概要

发布时间:2019-08-12 23:18:22   来源:文档文库   
字号:

Linux实训项目网络爬虫系统概要

1、 什么是爬虫

是一个软件机器人,是可控的,可以可以从互联网上抓取我们所需的资源。爬虫是搜索引擎后台的第一个子系统,数据入口之一。

2、 爬虫能做什么

搜索引擎的基础应用

抓取大数据的一种手段

网页下载器

网店秒杀

3、 关于项目

时间安排:4

关于需求、设计、编码、测试、集成

需求:

设计:分为业务设计和技术设计。

业务设计是业务层的方案。

对我们软件设计师来讲,业务就是我们的系统想要完成一个工作,要经过哪些步骤或流程。

技术设计:关于框架和处理流程,注意要采用面向对象的思维方式。

编码:使用基本的技术细节进行系统实现

测试:对是对我们系统可靠性的一个监测

集成:将每个程序员开发的模块或子系统合成为一个完成的系统

思维方式:线性思维方式与发散思维方式。

软件开发要掌握的思想:

模块思维

渐进式开发

4、 需求:

自动抓取网络资源的软件。

1、 资源是什么?网页、图片、音乐、视频等

2、 自动化是什么样子?一旦运行就不需要更多的干预。

生成需求说明文档。

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

功能点、附加要求、性能要求等

5、 设计

业务设计:

如何思考并完成设计?

注意:从顶层开始思考并设计,避免过早的陷入细节。

系统最粗浅的数据流

设计处理流程:

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列表数据结构

6、 控制器设计

配置文件解析模块

配置文件是以文件形式保存程序运行时必要的参数,减少输入时的繁琐过程。

文件类型是文本文件,内容一般以键值对形式出现。

概要设计:

配置文件内容:

key=value形式

注释规则:注释字符串前以“#”标记。

配置项设置:

模块详细设计:

操作:

1、 读取配置文件

2、 得到配置文件选项的值(键值)

3、 初始化

//类设计伪代码

classConfigParser

{

public://共有成员函数(外部接口)

ConfigParser();

load();

对应key的操作();

操作1()

操作2()

….

ptivate://私有成员变量

job_num

seed

deeps

log_level

Module_path

Module_name

file_type

//单体:

};

技术点:

1、 按行读取fgets

2、 分割字符串

3、 消除注释

4、 消除空格

实现:(略)

URL维护模块

分析:

url格式:

=>ip

结构:域名或IP地址,路径,文件名

设计URL的数据结构

http协议请求页面时的流程:

1、 输入网址

2、 DNS发送解析请求

3、 DNS返回给我们一个对应的IP地址

4、 通过IP地址向资源所在的主机发送请求

5、 如果资源存在,主机返回200状态,同时返回数据部分

6、 本地http客户端(一般来说是浏览器)接收数据

7、 得到资源

页面抓取的处理流程:

1、 得到一个新的URL

2、 URL进入抓取队列等待抓取

3、 从队列中得到一个URL,把其分配给一个下载器的实例

4、 得到下载器的处理状态(URL处理状态需要被改写,得到当前URL深度,得到当前资源类型假如下载成功)

5、 得到当前页面中存在的下一级URL列表

URL维护模块

URL维护模块操作(对外接口):

1、添加新URL

2、使URL进入抓取队列

3、从抓取队列中移除一个URL

4、修改URL库中某一个URL的值

5、添加新URL的列表

classUrl

{

public:

//初始化

//set…

//get…

private:

//

url

protocal

Sitename

Path

Filename

state

Deep

Filetype

}

classUrlManager

{

public://外部接口

addUrl();

addUrlList();

getUrlForQuque();

removeUrlForQuque();

//setUrlValue();

private://内部接口

findUrl();

private:

listUrls;

mapUrlMap;

ququeUrlquque;

}

任务调度模块

程序的主框架流程。

要求:

1可以控制程序按照普通程序模式还是按照守护进程模式运行

2可以通过参数提供帮助

3提供一个运行框架,可以支持多任务管理

4包含程序的主流程

尽可能把可拆分的功能封装成独立函数进行调用。

定义主程序框架的处理流程:

1程序运行时先处理命令行参数,根据参数跳转到相应分支或调用对应的函数

2检测是否按照守护进程模式运行(控制选项从命令行参数中得到)

3初始化环境

a读取配置文件,提取配置文件中的参数

b根据守护进程模式的标记将当前进程转变为守护进程

c载入程序模块的动态库

4开始程序的主处理流程

a检测种子是否存在,把种子交给URL管理器

b分析种子,得到种子urlIP地址(DNS解析)

c根据种子URL得到第一个页面

d对页面进行处理(复杂流程,由其他模块实现细节)

eURL管理器中取出一个URL

f启动一个处理任务(先检测是否达到最大任务数量,功能封装到一个独立函数中)

g监控任务处理数量,如果任务维护池中有空闲任务,那么重复e步骤

h回收资源,准备结束程序或当前任务

继续分解复杂步骤:

1对页面进行处理:

a对页面进行解析,提取内部的下级url

b生成url列表,把url列表传给URL管理器

c对页面进行持久化操作

2处理任务

aurl管理器得到一个未处理的URL

b通过调用epoll框架产生一个新任务

c调用页面处理过程(复杂步骤1

d释放处理过程中产生的临时资源(socket句柄,文件操作句柄,临时申请的内存等)

其他辅助功能:

1输出帮助信息

多路复用框架:

1、为什么不用select而是用epoll

EPOLL相关技术要点:

EPOLL两种模式:

EPOLL应用场景:

日志工具

为什么需要日志工具:

1方便调试

2方便代码维护

日志输出信息设计:

日志信息等级+日期时间+调试信息

日志输出等级设计(5个等级)

0调试[debug]:仅仅用于调试

1普通信息[info]:可以让使用者了解的一些信息

2警告信息[warn]:意味着程序中出现了错误,但是并不严重

4错误信息[error]:意味着程序中发生了严重错误,根据实际情况可选择使程序继续运行或使程序终止

5程序崩溃[crash]:程序无法继续运行了。

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

日志调用接口设计:

SPIDER_LOG(日志等级标记,日志输出信息);

注意,配置文件中的日志输出登等级段和接口中的日志等级标记不是一个概念

日志等级标记,纯粹是一个标记,体现在输出的日志字符串中

配置文件中的日志输出等级字段用来控制那些日志被输出

接口内部的处理流程:

1得到控制日志输出等级的标记,用来控制当前日志是否要输出

2得到调用日志接口的时间

3得到日志输出信息并进行日志字符串的拼接

4把日志信息输出到指定的设备

插件框架设计

为什么要有插件模式?

1、 升级和扩充功能

2、 维护方便

3、 动态修改

设计:

1、 动态载入.so文件

2、 维护.so文件中的接口函数

设计原则:

1、 一个功能一个模块

2、 可以自我维护

a) 维护版本号

b) 知道自己的名称

c) 维护本模块内部的接口

d) 可以对模块进行初始化

设计模块的描述结构:

设计入口函数指针原型

int(*handle)(void*);

设计初始化函数指针原型

int(*init)(Module*);

模块管理器设计:

1载入模块的操作

IntLoad(char*path,char*name);

Module*getModule(char*name);

载入模块操作的处理流程:

1通过路径找到模块文件(.so)

2调用dlopen打开动态库(.so

3使用动态库

4关闭动态库文件

7、 下载器设计

下载器模块分为socket功能封装与Http功能模块

http协议对资源请求的操作get指令

HTTP头描述:

http头以文本形式体现在http协议包中

HTTP包的内容由HTTP头进行描述,描述的格式:一条数据一行,每条描述以描述字段名称开头,

Socket功能框架设计:

1初始化socket

2向服务器发送请求

3接受服务器反馈的数据

4设置socket模式

socket句柄注册到epoll处理事件中。(在主流程中)

HTTP协议处理模块

1解析头

2组装头

提取HTTP数据内容(单独一个模块)

设计两个模块:文本处理模块(html格式),二进制处理模块(image/jpg/png等各式),还可以继续添加其他文件处理模块(PDF、流媒体等)

注意:

需要了解的相关知识:

1http协议(可以通过查询RFC协议文档了解更多)RFC文档是用来解释网络协议的一种文档集合

GET指令

请求头的结构

反馈头的结构

2http协议传输文件的模式

http协议描述

8页面解析器设计

html文档,是一种标记性语言

对页面解析的目的:

得到页面中存在的下级URL

URL保存在标签的href属性中

可以通过正则表达式提取页面中的URL

注意提取到的URL深度。

页面解析的处理流程:

1得到下载的页面

2得到页面对应的URL结构体(用于得到当前页面的深度)(注意判断是否已经达到最大深度)

3使用正则表达式得到页面中所有的URL列表

4处理URL中的相对路径

5一个细节:把当前页面深度加一,生成并填充URL结构体6把得到的URL列表回写到URL管理器中(生成列表数据,以返回值形式回传给上层代码)

9持久化器设计

仍然以模块形式生成

分为网页保存模块和图片保存模块

注意,如果涉及到网页编码需要进行转码操作(本系统不对此进行操作)

处理流程

1得到页面的数据流或在内存缓冲区的数据

2得到当前页面的URL描述结构体

3生成保存目录(目录已存在和未存在的处理情况)

4把文件按照指定模式写入磁盘系统

5向主处理流程发送一个反馈,表示当前页面处理的进度

系统的核心代码:

1、 系统主处理框架

2、 Epoll框架的调用

3、 插件框架的完整实现

4、 Soket功能封装

5、 http协议头解析

6、 html解析并提取URL列表

7、 URL管理器实现

后续工作:如何进行单元测试cunit

把软件做成系统服务,需要shell脚本。

集成测试。

本文来源:https://www.2haoxitong.net/k/doc/e7db8c8feef9aef8941ea76e58fafab068dc4424.html

《网络爬虫项目概要.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式