网络爬虫计划项目概要.doc

收藏

编号:2727925    类型:共享资源    大小:522.28KB    格式:DOC    上传时间:2020-05-01
8
金币
关 键 词:
网络 爬虫 计划 规划 项目 概要
资源描述:
/* 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 形式 注释规则:注释字符串前以“#”标记。 配置项设置: 项目 字段 并发任务数 job_num url种子 seed 抓取深度 deeps 输出日志的等级 log_level 模块存放路径(唯一) Module_path 模块名称(模块文件名,可以多个) Module_name 允许抓取的资源类型(多个,文件后缀) file_type 模块详细设计: 操作: 1、 读取配置文件 2、 得到配置文件选项的值(键值) 3、 初始化 //类设计伪代码 class ConfigParser { 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格式:http://192.168.40.150/docs/linuxdev.html www.baidu.com => ip 结构:域名或IP地址,路径,文件名 设计URL的数据结构 项目 字段名称 完整的URL url 协议类型 protocal 域名 Sitename 资源路径 Path 文件名 Filename 当前url处理状态(0-未抓取;1-抓取成功; -1 – 抓取失败) state 当前url深度 Deep 当前资源类型 Filetype 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的列表 class Url { public: //初始化 //set… //get… private: // url protocal Sitename Path Filename state Deep Filetype } class UrlManager { public: //外部接口 addUrl(); addUrlList(); getUrlForQuque(); removeUrlForQuque(); //setUrlValue(); private: //内部接口 findUrl(); private: list< Url> Urls; map UrlMap; quque Urlquque; } 任务调度模块 程序的主框架流程。 要求: 1可以控制程序按照普通程序模式还是按照守护进程模式运行 2可以通过参数提供帮助 3提供一个运行框架,可以支持多任务管理 4包含程序的主流程 尽可能把可拆分的功能封装成独立函数进行调用。 定义主程序框架的处理流程: 1程序运行时先处理命令行参数,根据参数跳转到相应分支或调用对应的函数 2检测是否按照守护进程模式运行(控制选项从命令行参数中得到) 3初始化环境 a读取配置文件,提取配置文件中的参数 b根据守护进程模式的标记将当前进程转变为守护进程 c载入程序模块的动态库 4开始程序的主处理流程 a检测种子是否存在,把种子交给URL管理器 b分析种子,得到种子url的IP地址(DNS解析) c根据种子URL得到第一个页面 d对页面进行处理(复杂流程,由其他模块实现细节) e从URL管理器中取出一个URL f启动一个处理任务(先检测是否达到最大任务数量,功能封装到一个独立函数中) g监控任务处理数量,如果任务维护池中有空闲任务,那么重复e步骤 h回收资源,准备结束程序或当前任务 继续分解复杂步骤: 1对页面进行处理: a对页面进行解析,提取内部的下级url b生成url列表,把url列表传给URL管理器 c对页面进行持久化操作 2处理任务 a从url管理器得到一个未处理的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) 可以对模块进行初始化 设计模块的描述结构: 字段 名称 主版本号 version 次版本号 subver 模块名称 name 入口函数指针 int(*handle)(void*); 初始化函数指针 int(*init)(Module*); 设计入口函数指针原型 int(*handle)(void*); 设计初始化函数指针原型 int(*init)(Module*); 模块管理器设计: 1载入模块的操作 Int Load (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、流媒体等) 注意: 需要了解的相关知识: 1 http协议 (可以通过查询RFC协议文档了解更多)RFC文档是用来解释网络协议的一种文档集合 l GET指令 l 请求头的结构 l 反馈头的结构 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脚本。 集成测试。
展开阅读全文
提示  淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

收起
展开