-
大小: 4.85MB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2024-01-27
- 語言: C/C++
- 標簽: C/C++??網(wǎng)絡爬蟲??
資源簡介
WEBCRAWLER 網(wǎng)絡爬蟲實訓項目 1
WEBCRAWLER
網(wǎng) 絡 爬 蟲 實 訓 項 目
文檔版本: 1.0.0.1
編寫單位: 達內(nèi)IT培訓集團 C++教學研發(fā)部
編寫人員: 閔衛(wèi)
定稿日期: 2015年11月20日 星期五WEBCRAWLER 網(wǎng)絡爬蟲實訓項目 2
1. 項目概述
互聯(lián)網(wǎng)產(chǎn)品形形色色,有產(chǎn)品導向的,有營銷導向的,也有技術導向的,但是
以技術見長的互聯(lián)網(wǎng)產(chǎn)品比例相對小些。搜索引擎是目前互聯(lián)網(wǎng)產(chǎn)品中最具技
術含量的產(chǎn)品,如果不是唯一,至少也是其中之一。
經(jīng)過十幾年的發(fā)展,搜索引擎已經(jīng)成為互聯(lián)網(wǎng)的重要入口之一,Twitter聯(lián)合創(chuàng)
始人埃文?威廉姆斯提出了“域名已死論”,好記的域名不再重要,因為人們會
通過搜索進入網(wǎng)站。搜索引擎排名對于中小網(wǎng)站流量來說至關重要。了解搜索
引擎簡單界面背后的技術原理其實對每一個希望在互聯(lián)網(wǎng)行業(yè)有所建樹的信息
技術人員都很重要。
1.1. 搜索引擎
作為互聯(lián)網(wǎng)應用中最具技術含量的應用之一,優(yōu)秀的搜索引擎需要復雜的架構
和算法,以此來支撐對海量數(shù)據(jù)的獲取、 存儲,以及對用戶查詢的快速而準確
地響應。 從架構層面,搜索引擎需要能夠對以百億計的海量網(wǎng)頁進行獲取、 存
儲、 處理的能力,同時要保證搜索結果的質量。 如何獲取、 存儲并計算如此海WEBCRAWLER 網(wǎng)絡爬蟲實訓項目 3
量的數(shù)據(jù)?如何快速響應用戶的查詢?如何使得搜索結果盡可能滿足用戶對信
息的需求?這些都是搜索引擎的設計者不得不面對的技術挑戰(zhàn)。
下圖展示了一個通用搜索引擎的基本結構。商業(yè)級別的搜索引擎通常由很多相
互獨立的模塊組成,各個模塊只負責搜索引擎的一部分功能,相互配合組成完
整的搜索引擎:
搜索引擎的信息源來自于互聯(lián)網(wǎng)網(wǎng)頁,通過“網(wǎng)絡爬蟲” 將整個“互聯(lián)網(wǎng)” 的
信息獲取到本地,因為互聯(lián)網(wǎng)頁面中有相當大比例的內(nèi)容是完全相同或者近似
重復的,“網(wǎng)頁去重”模塊會對此做出檢測,并去除重復內(nèi)容。
在此之后,搜索引擎會對網(wǎng)頁進行解析,抽取網(wǎng)頁主體內(nèi)容,以及頁面中包含
的指向其它頁面的所謂超鏈接。 為了加快用戶查詢的響應速度,網(wǎng)頁內(nèi)容通過
“倒排索引”這種高效查詢數(shù)據(jù)結構來保存,而網(wǎng)頁之間的鏈接關系也會予以
保存。之所以要保存鏈接關系,是因為這種關系在網(wǎng)頁相關性排序階段是可利
用的,通過“鏈接分析”可以判斷頁面的相對重要性,對于為用戶提供準確的
搜索結果幫助很大。
由于網(wǎng)頁數(shù)量太多,搜索引擎不僅需要保存網(wǎng)頁的原始信息,還要保存一些中
間處理結果,使用單臺或者少量的計算機明顯是不現(xiàn)實的。 Google等商業(yè)搜索
引擎提供商,為此開發(fā)了一整套云存儲與云計算平臺,使用數(shù)以萬計的普通PCWEBCRAWLER 網(wǎng)絡爬蟲實訓項目 4
搭建了海量信息的可靠存儲與計算架構,以此作為搜索引擎及其相關應用的基
礎支撐。優(yōu)秀的云存儲與云計算平臺已經(jīng)成為大型商業(yè)搜索引擎的核心競爭
力。
以上所述是搜索引擎如何獲取并存儲海量的網(wǎng)頁相關信息。這些功能因為不需
要實時計算,所以可以被看作是搜索引擎的后臺計算系統(tǒng)。搜索引擎的首要目
標當然是為用戶提供準確而全面的搜索結果,因此響應用戶查詢并實時提供準
確結果便構成了搜索引擎的前臺計算系統(tǒng)。
當搜索引擎接收到用戶的查詢請求后,首先需要對查詢詞進行分析,通過與用
戶信息的結合,正確推導出用戶的真實搜索意圖。 此后,先在“Cache系統(tǒng)”
所維護的緩存中查找。搜索引擎的緩存存儲了不同的搜索意圖及其相對應的搜
索結果。如果在緩存中找到滿足用戶需求的信息,則直接將搜索結果返回給用
戶。這樣既省掉了重復計算對資源的消耗,又加快了整個搜索過程的響應速
度。而如果在緩存中沒有找到滿足用戶需求的信息,則需要通過“網(wǎng)頁排
序”,根據(jù)用戶的搜索意圖,實時計算哪些網(wǎng)頁是滿足用戶需求的,并排序輸
出作為搜索結果。 而網(wǎng)頁排序最重要的兩個參考因素,一個是“內(nèi)容相似
性”,即哪些網(wǎng)頁是和用戶的搜索意圖密切相關的;一個是網(wǎng)頁重要性,即哪
些網(wǎng)頁是質量較好或相對重要的,而這往往可以從“鏈接分析”的結果中獲
得。綜合以上兩種考慮,前臺系統(tǒng)對網(wǎng)頁進行排序,作為搜索的最終結果。
除了上述功能模塊,搜索引擎的“反作弊”模塊近年來越來越受到重視。搜索
引擎作為互聯(lián)網(wǎng)用戶上網(wǎng)的入口,對于網(wǎng)絡流量的引導和分流至關重要,甚至
可以說起著決定性的作用。因此,各種“作弊”方式也逐漸流行起來,通過各
種手段將網(wǎng)頁的搜索排名提前到與其網(wǎng)頁質量不相稱的位置,這會嚴重影響用
戶的搜索體驗。所以,如何自動發(fā)現(xiàn)作弊網(wǎng)頁并對其給于相應的懲罰,就成了
搜索引擎非常重要的功能之一。
1.2. 網(wǎng)絡爬蟲
通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁,截至目前的網(wǎng)頁數(shù)量數(shù)以百萬計,所
以搜索引擎首先面臨的問題就是如何能夠設計出高效的下載系統(tǒng),將如此海量
的網(wǎng)頁數(shù)據(jù)傳送到本地,在本地形成互聯(lián)

代碼片段和文件信息
///?@file?DomainLimit.cpp
///?@brief?實現(xiàn)#DomainLimit類
///?@author?閔衛(wèi)
///?@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
//?根據(jù)域名限制插件的功能實現(xiàn)基類中的虛函數(shù)
bool?DomainLimit::init?(
WebCrawler*?app?//?[輸入/輸出]?應用程序對象
)?{
//?以統(tǒng)一資源定位符插件的身份
//?注冊到應用程序對象的插件管理器中
(g_app?=?app)->m_pluginMngr.registerUrlPlugin?(this);
//?拆分配置器中的包含前綴字符串,以逗號為分隔符,不限拆分次數(shù)
m_includePrefixes?=?StrKit::split?(
g_app->m_cfg.m_includePrefixes?““?0);
//?拆分配置器中的排除前綴字符串,以逗號為分隔符,不限拆分次數(shù)
m_excludePrefixes?=?StrKit::split?(
g_app->m_cfg.m_excludePrefixes?““?0);;
//?返回成功
return?true;
}
//?插件處理
//?成功返回true,失敗返回false
//?根據(jù)域名限制插件的功能實現(xiàn)基類中的虛函數(shù)
bool?DomainLimit::handler?(
void*?arg?//?[輸入/輸出]?插件參數(shù)
)?{
//?原始統(tǒng)一資源定位符
RawUrl*?rawUrl?=?static_cast?(arg);
//?若是種子鏈接(鏈接深度為0)或非超文本標記語言
if?(!?rawUrl->m_depth?||?rawUrl->m_type?!=?RawUrl::ETYPE_HTML)
//?返回成功,抓取該統(tǒng)一資源定位符
return?true;
//?字符串向量只讀迭代器
vector::const_iterator?it;
//?統(tǒng)一資源定位符字符串以哪個包含前綴開頭
for?(it?=?m_includePrefixes.begin?();
it?!=?m_includePrefixes.end?()?&&
rawUrl->m_strUrl.find?(*it?0);?++it);
//?若沒有與統(tǒng)一資源定位符字符串匹配的包含前綴
if?(!?m_includePrefixes.empty?()?&&
it?==?m_includePrefixes.end?())?{
//?記錄警告日志
g_app->m_log.printf?(Log::LEVEL_WAR?__FILE__?__LINE__
“不抓不在包含集\“%s\“中的統(tǒng)一資源定位符\“%s\““
g_app->m_cfg.m_includePrefixes.c_str?()
rawUrl->m_strUrl.c_str?());
//?返回失敗,不抓該統(tǒng)一資源定位符
return?false;
}
//?統(tǒng)一資源定位符字符串以哪個排除前綴開頭
for?(it?=?m_excludePrefixes.begin?();
it?!=?m_excludePrefixes.end?()?&&
rawUrl->m_strUrl.find?(*it?0);?++it);
//?若存在與統(tǒng)一資源定位符字符串匹配的排除前綴
if?(it?!=?m_excludePrefixes.end?())?{
//?記錄警告日志
g_app->m_log.printf?(Log::LEVEL_WAR?__FILE__?__LINE__
“不抓排除集\“%s\“中的統(tǒng)一資源定位符\“%s\““
g_app->m_cfg.m_excludePrefixes.c_str?()
rawUrl->m_strUrl.c_str?());
//?返回失敗,不抓該統(tǒng)一資源定位符
return?false;
}
//?返回成功,抓取該統(tǒng)一資源定位符
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個文件信息
評論
共有 條評論