您的位置  > 互联网

网络爬虫实训项目网络爬虫实训项目文档版本

如此大量的数据如何获取、存储和计算? 如何快速回复用户咨询? 如何让搜索结果尽可能满足用户的信息需求? 这些都是搜索引擎设计者必须面对的技术挑战。 下图展示了通用搜索引擎的基本结构。 商业级搜索引擎通常由许多独立的模块组成。 每个模块只负责搜索引擎的部分功能,相互配合组成一个完整的搜索引擎:搜索引擎的信息来源来自互联网网页,使用整个“网络爬虫”。 “互联网”信息是在本地获得的,因为互联网页面中的大部分内容是完全相同或几乎重复的。 “网页重复数据删除”模块将检测到这一点并删除重复的内容。 之后,搜索引擎会对网页进行解析,提取网页的主要内容以及页面中包含的指向其他页面的所谓超链接。 为了加快对用户查询的响应速度,通过一种称为“倒排索引”的高效查询数据结构来保存网页内容,同时也保存网页之间的链接关系。 之所以保存链接关系,是因为这种关系在网页相关性排名阶段是可用的。 通过“链接分析”,可以判断页面的相对重要性,这对于为用户提供准确的搜索结果非常有帮助。 由于网页数量太多,搜索引擎不仅需要保存网页的原始信息,还需要保存一些中间处理结果。 使用单台或少量计算机显然是不现实的。

等商业搜索引擎提供商为此开发了一套完整的云存储和云计算平台,利用数以万计的普通网络爬虫训练项目4构建了海量信息的可靠存储和计算架构,作为搜索引擎和对其相关应用的基本支持。 优秀的云存储和云计算平台已成为大型商业搜索引擎的核心竞争力。 以上就是搜索引擎如何获取并存储海量网络相关信息的。 由于这些函数不需要实时计算,因此可以将其视为搜索引擎的后台计算系统。 当然,搜索引擎的首要目标是为用户提供准确、全面的搜索结果。 因此,实时响应用户查询并提供准确结果就构成了搜索引擎的前端计算系统。 当搜索引擎收到用户的查询请求时,首先需要对查询词进行分析,并结合用户的信息正确推断出用户的真实搜索意图。 之后,首先在“缓存系统”维护的缓存中进行搜索。 搜索引擎缓存存储不同的搜索意图及其对应的搜索结果。 如果在缓存中找到满足用户需求的信息,则将搜索结果直接返回给用户。 这不仅消除了重复计算的资源消耗,而且加快了整个搜索过程的响应速度。 如果缓存中没有找到满足用户需求的信息,就需要利用“网页排序”,根据用户的搜索意图,实时计算出哪些网页满足用户的需求,并排序输出为搜索结果。

网页排名最重要的两个参考因素是“内容相似度”,即哪些网页与用户的搜索意图密切相关; 另一个是网页重要性,即哪些网页质量好或者比较重要。 而这往往可以从“链接分析”的结果中得到。 基于以上两点考虑,前端系统对网页进行排序,作为最终的搜索结果。 除了上述功能模块外,搜索引擎的“反作弊”模块近年来也受到越来越多的关注。 搜索引擎作为网民访问互联网的入口,对于网络流量的引导和分流至关重要。 甚至可以说起到了决定性的作用。 因此,各种“作弊”手段逐渐盛行,通过各种手段将网页的搜索排名提升到与网页质量不相称的位置,这将严重影响用户的搜索体验。 因此,如何自动检测作弊网页并进行相应的惩罚就成为搜索引擎最重要的功能之一。 1.2. 网络爬虫一般搜索引擎的处理对象是互联网网页。 到目前为止,网页数量已达数百万个。 因此,搜索引擎面临的第一个问题就是如何设计一个高效的下载系统,将如此大量的网页数据传输到本地,形成互联网网页的本地镜像备份。 网络爬虫就扮演了这个角色。 它是搜索引擎的重要组成部分。 网络爬虫训练项目5 网络爬虫的一般工作原理如下图所示:  从互联网网页中选择某些网页的链接作为“种子URL”,放入“待爬取URL队列”;  爬虫从“待爬取URL队列”开始,从“URL队列”中依次“读取URL”;  爬虫通过“DNS解析”将读取的URL转换为网站服务器的IP地址;  爬虫将网站服务器的IP地址、通信端口、网页路径等信息交给“网页下载”设备;  “网页下载”设备负责从“网页下载”设备下载网页内容”;  对于已经下载到本地的网页内容,一方面将其存储在“下载页面库”中,等待索引等后续处理,另一方面将其URL放入“已爬取的URL队列”,后者显然是为了避免网页被重复抓取;  对于刚刚下载到本地的网页内容,还需要从中“提取URL”;  在“检查是否提取的URL已在“已抓取URL队列”中被抓取;  如果提取的 URL 尚未被抓取,则将其排队到“待抓取 URL 队列”的末尾以供后续抓取。调度时重复步骤 ,下载该 URL 对应的网页。

这样,就形成了网络爬虫训练项目的6个循环,直到“待爬取的URL队列”为空,这意味着爬虫已经爬取了所有可以爬取的网页,完成了一次完整的爬行过程。 以上只是网络爬虫的一般原理。 具体实现过程中还有很大的优化空间,比如以多线程(进程或线程)并发的方式实现“网页下载”,甚至“DNS解析”。 处理是一个并发的过程,避免爬虫系统的I/O吞吐率受到网站服务器和域名解析服务器的限制。 对于“爬取的URL队列”,可以利用Bloom队列进行优化,降低其时间和空间复杂度。 2、总体架构 本项目总体架构如下图所示: 配置器 超文本传输​​协议 响应日志 日志 主线程 主多输入输出 插件管理器 字符串工具包 统一资源定位器队列 网络爬虫 原始统一资源定位器 超文本传输​​协议响应头域名解析线程解析统一资源定位器接收线程布隆过滤器哈希器哈希最大深度插件域名限制插件超文本传输​​协议响应头过滤插件超文本标记语言文件存储插件图像文件存储插件发送线程网络爬虫训练项目72.1。 基础设施 2.1.1。 ()常用字符串处理函数。

2.1.2. 日志分级并打印格式化日志文件。 2.1.3. () 从指定的配置文件中加载配置信息。 2.1.4. 多路输入输出()封装了epoll多路I/O系统调用,提供了增删改等待操作的接口。 2.1.5。 插件管理器()加载插件并接受其注册,维护插件对象容器并提供调用其处理函数的外部接口。 2.2. 网络通讯 2.2.1. Hash封装了各种哈希算法函数。 2.2.2. Bloom ()基于Bloom算法,对原有的统一资源定位符加入队列进行过滤,防止已经爬取的URL再次进入队列,减少冗余开销,避免无限循环。 2.2.3. 原始统一资源定位器()提供了原始统一资源定位器字符串的简单包装,以及标准化等辅助支持。 2.2.4. Parse ()将原始的 字符串解析为服务器域名、资源路径、服务器IP地址,甚至服务器通信端口。 网络爬虫培训项目82.2.5。 统一资源定位器队列( Queue)封装了原始统一资源定位器队列和解析后的统一资源定位器队列,提供线程安全的入队和出队操作,并通过统一资源定位器过滤器进行排队。 它还支持基于正则表达式的统一资源定位器提取功能。

2.2.6. ()发送/接收超文本传输​​协议请求/响应。 如果发送成功,描述符就会被添加到多通道I/O中。 如果接收成功,则提取统一资源定位符并推入队列。 2.2.7. 超文本传输​​协议响应头()状态码和内容类型等关键信息。 2.2.8. 超文本传输​​协议()对服务器统一资源定位符和超文本传输​​协议头、体和长度进行简单封装。 2.3. 过程控制2.3.1。 域名解析线程()从原来的统一资源定位器队列中弹出对象,借助域名解析系统(DNS)获取服务器的IP地址,构造该对象并推入解析统一资源定位器队列。 2.3.2. 发送线程()通过该对象启动一个新的爬取任务,从解析统一资源定位器队列中弹出该对象,向HTTP服务器发送HTTP请求,并将描述符放入该对象中。 2.3.3. 接收线程()是当套接字描述符可从对象中读取时由该对象动态创建的,并通过该对象接收超文本传输​​协议响应。 网络爬虫培训项目92.3.4。 网络爬虫()代表整个应用程序的逻辑对象,构建和维护日志、配置器、多通道I/O、插件管理器、统一资源定位器队列、域名解析线程等多个底层设施,包括初始化、执行多个输入输出循环、启动爬取任务等对外接口。

2.3.5。 主线程(main)主函数处理命令行参数,初始化应用程序对象,并进入多通道I/O循环。 2.4. 2.4.1. 外围扩展最大深度插件()根据配置文件的配置项限制捕获的超链接的最大递归深度。 2.4.2. 域名限制插件()根据配置文件和配置项对捕获的超链接的前缀进行限制。 2.4.3. 超文本传输​​协议响应头过滤插件()根据配置文件中的配置项限制超文本传输​​协议响应的内容类型。 2.4.4. 超文本标记语言文件存储插件()将超文本标记语言描述的页面内容保存到磁盘文件中。 2.4.5。 图片文件存储插件()将页面内容中引用的图片资源保存到磁盘文件中。 3. 工作流程 3.1. 主事件流流程入口函数进行必要的命令行参数处理和系统初始化后,进入网络爬虫的多路输入输出循环。 一旦发现与服务器连接的有可读数据,即在网络爬​​虫训练项目10中创建一个接收线程。后者负责爬取页面内容,而前者则继续等待I/ O 多通道输入和输出循环中其他套接字上的事件。

3.2. 解析事件流的独立域名解析线程实时监控原始统一资源定位器队列的变化,并借助域名解析系统将每个新增的原始统一资源定位器转换为已解析的统一资源定位器,并压缩它。 进入解析统一资源定位器队列。 3.3. 发送事件流不断从解析统一资源定位器队列中弹出解析统一资源定位器,创建套接字,根据服务器的IP地址和通信端口发起连接请求,建立TCP连接,发送超文本传输​​协议请求包,并将放入多路输入输出对象中,主事件流等待其数据到达事件。 3.4. 接收事件流。 每个超文本传输​​线程通过有明确要读取数据的套接字接收来自服务器的超文本传输​​协议响应,并将其传递到统一资源定位器队列以进行超链接提取和布隆过滤。 直到原来的统一资源定位符被推入队列。 在将原始统一资源定位符压入队列之前,接收到超文本传输​​协议头和包体后,统一资源定位器插件、超文本传输​​协议头插件和超文本标记语言插件的处理过程如下: in 分别执行。 上述四个事件流需要并行、独立地并发运行,并在共享资源和执行节奏上保持适当的同步。 4、目录结构 本项目的目录结构如下: /├── bin/│ ├── │ ├── .cfg│ └── .scr├── docs/│ ├── 概要设计。 网络爬虫实现实训项目11│ └── 详细设计.pdf├── /├── /│ ├── .cpp│ ├── .h│ ├── .mak│ ├── .so│ ├── .cpp │ ├── .h ├── .mak ├── .so ├── .cpp ├── .h ├── .mak ├── .so ├── .cpp │ ├── ─ .h│ ├── .mak│ ├── .so│ ├── .cpp│ ├── .h│ ├── .mak│ ├── .so│ └── mkall└── src/├──.cpp├──.h├──.cpp├──.h├──.cpp├──.h├──Hash.cpp├──Hash.h├──Http.h ├── Log.cpp├── Log.h├── Main.cpp├── ├── .cpp├── .h├── .h├── .cpp├── .h├── . h├── ─ .cpp├── .h├── .cpp├── .h├── .cpp├── . 网络爬虫训练项目12├── .cpp├── .h├── .cpp├── ─ .h├── Url.cpp├── Url.h├── .h├── .cpp├── .h├── .cpp└── .h bin目录存放可执行程序文件、启动画面文件和配置文件,docs目录存放项目文档,该目录存放爬虫下载的网页文件和图片文件,该目录存放扩展插件的源代码和共享库文件,src目录存放项目主体部分的源代码文件。

在教学环境中,上述目录结构可以放在两个子目录中。 目录包含完整的程序源代码和资料文档,供学生开发时参考。 该目录中的源代码不完整。 有些类或函数的实现只提供了基本框架,但代码中的注释与目录中相应部分完全相同。 缺失的内容需要学生理解整体设计思路并根据上下文逻辑完成。 需要学生参与完成的源代码文件详情请参见开发计划。 5、开发计划 本项目计划在四个工作日内完成: 工作日模块 子模块 代码文件 第一天 基础设施 预编译头 .h 字符串工具包 ..cpp 日志 .hLog.cpp 配置器 .. 网络爬虫培训项目 13多个输入输出..cpp插件接口.h插件管理器..cpp第二天网络通信.hHash.cpp统一资源定位器过滤器接口.h布隆过滤器..cpp Raw统一资源定位器.h解析统一资源 Url.cpp 统一资源定位器队列..cpp ..cpp 超文本传输​​协议响应头 Http.h 超文本传输​​协议响应 Day 3 流程控制线程..cpp 域名解析线程..cpp 发送线程..网络爬虫训练项目14接收线程..cpp网络爬虫..cpp主线程.cpp构建脚本天四外围扩展最大深度插件...mak域名限制插件it...mak超文本传输​​协议响应头过滤插件lter...mak超文本标记语言文件存储插件...mak图像文件存储插件...cpp构建脚本,其中高亮代码文件包含需要同学添加的内容,注意中的注释源文件的形式为“//在此处添加代码”。

网络爬虫训练项目 156.知识拓展 为了进一步加强学生在实训过程中独立思考、独立解决问题的能力,本项目有意涵盖了一些以往课程中未涉及到或只是大致了解的知识和技能。 具体包括: 预编译头文件 std:: 变长参数列表 基于 epoll 的多通道 I/O 哈希算法和 Bloom 表 URL、DNS、HTTP 和 HTML 正则表达式 线程封装 Elf 进程和I/O重定向  对于以上内容,建议项目指导老师在项目正式上线前,根据学生的接受能力以及在项目中的具体应用进行简单的介绍,同时为进一步的工作提供线索详细的学习和研究。 包括手册、参考书、互联网链接或其他媒体资源,尽量让学生通过自己的实践和探索找到问题的解决方案。 这就是项目培训的意义!