资源简介
WEBCRAWLER 网络爬虫实训项目 1
WEBCRAWLER
网 络 爬 虫 实 训 项 目
文档版本: 1.0.0.1
编写单位: 达内IT培训集团 C++教学研发部
编写人员: 闵卫
定稿日期: 2015年11月20日 星期五WEBCRAWLER 网络爬虫实训项目 2
1. 项目概述
互联网产品形形色色,有产品导向的,有营销导向的,也有技术导向的,但是
以技术见长的互联网产品比例相对小些。搜索引擎是目前互联网产品中最具技
术含量的产品,如果不是唯一,至少也是其中之一。
经过十几年的发展,搜索引擎已经成为互联网的重要入口之一,Twitter联合创
始人埃文•威廉姆斯提出了“域名已死论”,好记的域名不再重要,因为人们会
通过搜索进入网站。搜索引擎排名对于中小网站流量来说至关重要。了解搜索
引擎简单界面背后的技术原理其实对每一个希望在互联网行业有所建树的信息
技术人员都很重要。
1.1. 搜索引擎
作为互联网应用中最具技术含量的应用之一,优秀的搜索引擎需要复杂的架构
和算法,以此来支撑对海量数据的获取、 存储,以及对用户查询的快速而准确
地响应。 从架构层面,搜索引擎需要能够对以百亿计的海量网页进行获取、 存
储、 处理的能力,同时要保证搜索结果的质量。 如何获取、 存储并计算如此海WEBCRAWLER 网络爬虫实训项目 3
量的数据?如何快速响应用户的查询?如何使得搜索结果尽可能满足用户对信
息的需求?这些都是搜索引擎的设计者不得不面对的技术挑战。
下图展示了一个通用搜索引擎的基本结构。商业级别的搜索引擎通常由很多相
互独立的模块组成,各个模块只负责搜索引擎的一部分功能,相互配合组成完
整的搜索引擎:
搜索引擎的信息源来自于互联网网页,通过“网络爬虫” 将整个“互联网” 的
信息获取到本地,因为互联网页面中有相当大比例的内容是完全相同或者近似
重复的,“网页去重”模块会对此做出检测,并去除重复内容。
在此之后,搜索引擎会对网页进行解析,抽取网页主体内容,以及页面中包含
的指向其它页面的所谓超链接。 为了加快用户查询的响应速度,网页内容通过
“倒排索引”这种高效查询数据结构来保存,而网页之间的链接关系也会予以
保存。之所以要保存链接关系,是因为这种关系在网页相关性排序阶段是可利
用的,通过“链接分析”可以判断页面的相对重要性,对于为用户提供准确的
搜索结果帮助很大。
由于网页数量太多,搜索引擎不仅需要保存网页的原始信息,还要保存一些中
间处理结果,使用单台或者少量的计算机明显是不现实的。 Google等商业搜索
引擎提供商,为此开发了一整套云存储与云计算平台,使用数以万计的普通PCWEBCRAWLER 网络爬虫实训项目 4
搭建了海量信息的可靠存储与计算架构,以此作为搜索引擎及其相关应用的基
础支撑。优秀的云存储与云计算平台已经成为大型商业搜索引擎的核心竞争
力。
以上所述是搜索引擎如何获取并存储海量的网页相关信息。这些功能因为不需
要实时计算,所以可以被看作是搜索引擎的后台计算系统。搜索引擎的首要目
标当然是为用户提供准确而全面的搜索结果,因此响应用户查询并实时提供准
确结果便构成了搜索引擎的前台计算系统。
当搜索引擎接收到用户的查询请求后,首先需要对查询词进行分析,通过与用
户信息的结合,正确推导出用户的真实搜索意图。 此后,先在“Cache系统”
所维护的缓存中查找。搜索引擎的缓存存储了不同的搜索意图及其相对应的搜
索结果。如果在缓存中找到满足用户需求的信息,则直接将搜索结果返回给用
户。这样既省掉了重复计算对资源的消耗,又加快了整个搜索过程的响应速
度。而如果在缓存中没有找到满足用户需求的信息,则需要通过“网页排
序”,根据用户的搜索意图,实时计算哪些网页是满足用户需求的,并排序输
出作为搜索结果。 而网页排序最重要的两个参考因素,一个是“内容相似
性”,即哪些网页是和用户的搜索意图密切相关的;一个是网页重要性,即哪
些网页是质量较好或相对重要的,而这往往可以从“链接分析”的结果中获
得。综合以上两种考虑,前台系统对网页进行排序,作为搜索的最终结果。
除了上述功能模块,搜索引擎的“反作弊”模块近年来越来越受到重视。搜索
引擎作为互联网用户上网的入口,对于网络流量的引导和分流至关重要,甚至
可以说起着决定性的作用。因此,各种“作弊”方式也逐渐流行起来,通过各
种手段将网页的搜索排名提前到与其网页质量不相称的位置,这会严重影响用
户的搜索体验。所以,如何自动发现作弊网页并对其给于相应的惩罚,就成了
搜索引擎非常重要的功能之一。
1.2. 网络爬虫
通用搜索引擎的处理对象是互联网网页,截至目前的网页数量数以百万计,所
以搜索引擎首先面临的问题就是如何能够设计出高效的下载系统,将如此海量
的网页数据传送到本地,在本地形成互联
代码片段和文件信息
/// @file DomainLimit.cpp
/// @brief 实现#DomainLimit类
/// @author 闵卫
/// @date 2015年11月20日
/// @version 1.0.0.1
#include “Precompile.h“
#include “WebCrawler.h“
#include “DomainLimit.h“
#include “PluginMngr.h“
#include “StrKit.h“
DomainLimit g_pluginDomainLimit; // 域名限制插件对象
WebCrawler* g_app; // 应用程序对象
// 插件初始化
// 成功返回true,失败返回false
// 根据域名限制插件的功能实现基类中的虚函数
bool DomainLimit::init (
WebCrawler* app // [输入/输出] 应用程序对象
) {
// 以统一资源定位符插件的身份
// 注册到应用程序对象的插件管理器中
(g_app = app)->m_pluginMngr.registerUrlPlugin (this);
// 拆分配置器中的包含前缀字符串,以逗号为分隔符,不限拆分次数
m_includePrefixes = StrKit::split (
g_app->m_cfg.m_includePrefixes ““ 0);
// 拆分配置器中的排除前缀字符串,以逗号为分隔符,不限拆分次数
m_excludePrefixes = StrKit::split (
g_app->m_cfg.m_excludePrefixes ““ 0);;
// 返回成功
return true;
}
// 插件处理
// 成功返回true,失败返回false
// 根据域名限制插件的功能实现基类中的虚函数
bool DomainLimit::handler (
void* arg // [输入/输出] 插件参数
) {
// 原始统一资源定位符
RawUrl* rawUrl = static_cast (arg);
// 若是种子链接(链接深度为0)或非超文本标记语言
if (! rawUrl->m_depth || rawUrl->m_type != RawUrl::ETYPE_HTML)
// 返回成功,抓取该统一资源定位符
return true;
// 字符串向量只读迭代器
vector::const_iterator it;
// 统一资源定位符字符串以哪个包含前缀开头
for (it = m_includePrefixes.begin ();
it != m_includePrefixes.end () &&
rawUrl->m_strUrl.find (*it 0); ++it);
// 若没有与统一资源定位符字符串匹配的包含前缀
if (! m_includePrefixes.empty () &&
it == m_includePrefixes.end ()) {
// 记录警告日志
g_app->m_log.printf (Log::LEVEL_WAR __FILE__ __LINE__
“不抓不在包含集\“%s\“中的统一资源定位符\“%s\““
g_app->m_cfg.m_includePrefixes.c_str ()
rawUrl->m_strUrl.c_str ());
// 返回失败,不抓该统一资源定位符
return false;
}
// 统一资源定位符字符串以哪个排除前缀开头
for (it = m_excludePrefixes.begin ();
it != m_excludePrefixes.end () &&
rawUrl->m_strUrl.find (*it 0); ++it);
// 若存在与统一资源定位符字符串匹配的排除前缀
if (it != m_excludePrefixes.end ()) {
// 记录警告日志
g_app->m_log.printf (Log::LEVEL_WAR __FILE__ __LINE__
“不抓排除集\“%s\“中的统一资源定位符\“%s\““
g_app->m_cfg.m_excludePrefixes.c_str ()
rawUrl->m_strUrl.c_str ());
// 返回失败,不抓该统一资源定位符
return false;
}
// 返回成功,抓取该统一资源定位符
return true;
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 138568 2016-10-30 13:45 WebCrawler\bin\WebCrawler
文件 598 2016-10-28 06:31 WebCrawler\bin\WebCrawler.cfg
文件 886 2015-12-01 01:22 WebCrawler\bin\WebCrawler.scr
文件 472251 2011-11-07 15:31 WebCrawler\docs\cpp_ref.chm
文件 59508 2016-12-24 22:51 WebCrawler\docs\cpp_ref.chw
文件 124881 2011-11-08 01:56 WebCrawler\docs\cpp_ref_ch.chm
文件 467595 2016-10-29 22:23 WebCrawler\makefile.pdf
文件 2908 2016-10-28 01:02 WebCrawler\plugins\DomainLimit.cpp
文件 877 2016-10-27 10:51 WebCrawler\plugins\DomainLimit.h
文件 246 2016-10-27 10:51 WebCrawler\plugins\DomainLimit.mak
文件 55864 2016-10-30 13:45 WebCrawler\plugins\DomainLimit.o
文件 43211 2016-10-30 13:45 WebCrawler\plugins\DomainLimit.so
文件 2511 2016-10-28 01:15 WebCrawler\plugins\HeaderFilter.cpp
文件 822 2016-10-27 10:51 WebCrawler\plugins\HeaderFilter.h
文件 248 2016-10-27 10:51 WebCrawler\plugins\HeaderFilter.mak
文件 16832 2016-10-30 13:45 WebCrawler\plugins\HeaderFilter.o
文件 19791 2016-10-30 13:45 WebCrawler\plugins\HeaderFilter.so
文件 1531 2016-10-28 01:21 WebCrawler\plugins\MaxDepth.cpp
文件 708 2016-10-27 10:51 WebCrawler\plugins\MaxDepth.h
文件 738 2016-10-27 10:51 WebCrawler\plugins\MaxDepth.mak
文件 9056 2016-10-30 13:45 WebCrawler\plugins\MaxDepth.o
文件 198653 2016-10-30 13:45 WebCrawler\plugins\MaxDepth.so
文件 305 2016-10-27 10:53 WebCrawler\plugins\mkall
文件 2443 2016-10-28 01:41 WebCrawler\plugins\SaveHTMLToFile.cpp
文件 807 2016-10-27 10:51 WebCrawler\plugins\SaveHTMLToFile.h
文件 252 2016-10-27 10:51 WebCrawler\plugins\SaveHTMLToFile.mak
文件 12096 2016-10-30 13:45 WebCrawler\plugins\SaveHTMLToFile.o
文件 19199 2016-10-30 13:45 WebCrawler\plugins\SaveHTMLToFile.so
文件 5083 2016-10-29 12:05 WebCrawler\plugins\SaveImageToFile.cpp
文件 768 2016-10-27 10:51 WebCrawler\plugins\SaveImageToFile.h
............此处省略66个文件信息
相关资源
- 泡泡堂(炸弹人)小游戏C/C++完整源码
- 使用C/C++读取BITMAP的内容
- VC图像处理-用Canny算子提取边缘
- C/C++视频教程
- 个人总结的一些C/C++编码规范
- 高斯消去法求解线性方程组C/C++程序输
- celrityC/C++源码查看工具
- 网络编程MFC 实验四 FTP客户端功能实现
- C/C++语言大作业、小游戏
- 完整的C/C++时序的B+树数据库系统实现
- Eclipse C/C++ 自动补全的cdt补丁
- MongoDB C/C++开发使用案例Demo
- C/C++使用WinIO读取CMOS数据代码
- Diab C/C++ Compiler for PowerPC
- 台球游戏源代码
- Borland C/C++ 3.1精简版
- 基于UDP的简单可视化界面聊天程序c
- MinGW Windows 下gnu C/C++编译器
- 基于linux C/C++和Qt的聊天程序
- 使用Python分析社交网络数据+中文PDF版
- C++ 排课程序源代码
- c/c++查询纯真ip数据库类源代码
- 用过最好用的C/C++/STLchm格式的帮助文
- 吃豆人C/c++实现
- C/C++文件系统树状结构
- 人事管理系统(MFCC++实现)
- C/C++深层探索 PDF清晰版
- Borland C++ 5.5 编译器
- uml状态图的实用C/C++设计 中英文非扫
- C++ 网络爬虫代码
评论
共有 条评论