資源簡介
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個文件信息
評論
共有 條評論