




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、摘要網(wǎng)絡(luò)爬蟲(Web Crawler),通常被稱為爬蟲,是搜索引擎的重要組成部分。隨著信息技術(shù)的飛速進(jìn)步,作為搜索引擎的一個組成部分網(wǎng)絡(luò)爬蟲,一直是研究的熱點(diǎn),它的好壞會直接決定搜索引擎的未來。目前,網(wǎng)絡(luò)爬蟲的研究包括Web搜索策略研究的研究和網(wǎng)絡(luò)分析的算法,兩個方向,其中在Web爬蟲網(wǎng)絡(luò)搜索主題是一個研究方向,根據(jù)一些網(wǎng)站的分析算法,過濾不相關(guān)的鏈接,連接到合格的網(wǎng)頁,并放置在一個隊(duì)列被抓取。把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站某一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈
2、接地址尋找下一個網(wǎng)頁,這樣一直循環(huán)下去,直到把這個網(wǎng)站所有的網(wǎng)頁都抓取完為止。如果把整個互聯(lián)網(wǎng)當(dāng)成一個網(wǎng)站,那么網(wǎng)絡(luò)爬蟲就可以用這個原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁都抓取下來。關(guān)鍵詞:網(wǎng)絡(luò)爬蟲;Linux Socket;C/C+;多線程;互斥鎖AbstractWeb Crawler, usually called Crawler for short, is an important part of search engine. With the high-speed development of information, Web Crawler- the search engine can not l
3、ack of- which is a hot research topic those years. The quality of a search engine is mostly depended on the quality of a Web Crawler. Nowadays, the direction of researching Web Crawler mainly divides into two parts: one is the searching strategy to web pages; the other is the algorithm of analysis U
4、RLs. Among them, the research of Topic-Focused Web Crawler is the trend. It uses some webpage analysis strategy to filter topic-less URLs and add fit URLs into URL-WAIT queue.The metaphor of a spider web internet, then Spider spider is crawling around on the Internet. Web spider through web link add
5、ress to find pages, starting from a one page website (usually home), read the contents of the page, find the address of the other links on the page, and then look for the next Web page addresses through these links, so has been the cycle continues, until all the pages of this site are crawled exhaus
6、ted. If the entire Internet as a site, then you can use this Web crawler principle all the pages on the Internet are crawling down.Keywords:Web crawler;Linux Socket;C/C+; Multithreading;Mutex目 錄摘要I第一章 概 述11.1 課題背景11.2 網(wǎng)絡(luò)爬蟲的歷史和分類11.2.1 網(wǎng)絡(luò)爬蟲的歷史11.2.2 網(wǎng)絡(luò)爬蟲的分類21.3 網(wǎng)絡(luò)爬蟲的發(fā)展趨勢31.4 系統(tǒng)開發(fā)的必要性31.5 本文的組織結(jié)構(gòu)3第二章
7、相關(guān)技術(shù)和工具綜述52.1 網(wǎng)絡(luò)爬蟲的定義52.2 網(wǎng)頁搜索策略介紹52.2.1 廣度優(yōu)先搜索策略52.3 相關(guān)工具介紹62.3.1 操作系統(tǒng)62.3.2 軟件配置6第三章 網(wǎng)絡(luò)爬蟲模型的分析和概要設(shè)計(jì)83.1 網(wǎng)絡(luò)爬蟲的模型分析83.2 網(wǎng)絡(luò)爬蟲的搜索策略83.3 網(wǎng)絡(luò)爬蟲的概要設(shè)計(jì)10第四章 網(wǎng)絡(luò)爬蟲模型的設(shè)計(jì)與實(shí)現(xiàn)124.1 網(wǎng)絡(luò)爬蟲的總體設(shè)計(jì)124.2 網(wǎng)絡(luò)爬蟲的具體設(shè)計(jì)124.2.1 URL類設(shè)計(jì)及標(biāo)準(zhǔn)化URL124.2.2 爬取網(wǎng)頁134.2.3 網(wǎng)頁分析144.2.4 網(wǎng)頁存儲144.2.5 Linux socket通信164.2.6 EPOLL模型及其使用204.2.7 POS
8、IX多線程及其使用22第五章 程序運(yùn)行及結(jié)果分析255.1 Makefile及編譯255.2 運(yùn)行及結(jié)果分析26第六章 總結(jié)與展望30致 謝31參考文獻(xiàn)32第一章 概 述1.1 課題背景網(wǎng)絡(luò)爬蟲,是一種按照一定的規(guī)則,自動的抓取萬維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻,自動索引,模擬程序或者蠕蟲。網(wǎng)絡(luò)檢索功能起于互聯(lián)網(wǎng)內(nèi)容爆炸性發(fā)展所帶來的對內(nèi)容檢索的需求。搜索引擎不斷的發(fā)展,人們的需求也在不斷的提高,網(wǎng)絡(luò)信息搜索已經(jīng)成為人們每天都要進(jìn)行的內(nèi)容.如何使搜索引擎能時(shí)刻滿足人們的需求。最初的檢索功能通過索引站的方式實(shí)現(xiàn),而有了網(wǎng)絡(luò)機(jī)器人,即網(wǎng)絡(luò)爬蟲這個技術(shù)之后,搜索引擎的時(shí)代便開始
9、一發(fā)不可收拾了。1.2 網(wǎng)絡(luò)爬蟲的歷史和分類 網(wǎng)絡(luò)爬蟲的歷史在互聯(lián)網(wǎng)發(fā)展初期,網(wǎng)站相對較少,信息查找比較容易。然而伴隨互聯(lián)網(wǎng)爆炸性的發(fā)展,普通網(wǎng)絡(luò)用戶想找到所需的資料簡直如同大海撈針,這時(shí)為滿足大眾信息檢索需求的專業(yè)搜索網(wǎng)站便應(yīng)運(yùn)而生了?,F(xiàn)代意義上的搜索引擎的祖先,是1990年由蒙特利爾大學(xué)學(xué)生Alan Emtage發(fā)明的Archie。雖然當(dāng)時(shí)World Wide Web還未出現(xiàn),但網(wǎng)絡(luò)中文件傳輸還是相當(dāng)頻繁的,而且由于大量的文件散布在各個分散的FTP主機(jī)中,查詢起來非常不便,因此Alan Archie工作原理與現(xiàn)在的搜索引擎已經(jīng)很接近,它依靠腳本程序自動搜索網(wǎng)上的文件,然后對有關(guān)信息進(jìn)行索引
10、,供使用者以一定的表達(dá)式查詢。由于 Archie深受用戶歡迎,受其啟發(fā),美國內(nèi)華達(dá)System Computing Services大學(xué)于1993年開發(fā)了另一個與之非常相似的搜索工具,不過此時(shí)的搜索工具除了索引文件外,已能檢索網(wǎng)頁。當(dāng)時(shí),“機(jī)器人”一詞在編程者中十分流行。電腦“機(jī)器人”(Computer Robot)是指某個能以人類無法達(dá)到的速度不間斷地執(zhí)行某項(xiàng)任務(wù)的軟件程序。由于專門用于檢索信息的“機(jī)器人”程序象蜘蛛一樣在網(wǎng)絡(luò)間爬來爬去,因此, 搜索引擎的“機(jī)器人”程序就被稱為“蜘蛛”程序。世界上第一個用于監(jiān)測互聯(lián)網(wǎng)發(fā)展規(guī)模的“機(jī)器人”程序是Matthew Gray開發(fā)的World wide
11、 Web Wanderer。剛開始它只用來統(tǒng)計(jì)互聯(lián)網(wǎng)上的服務(wù)器數(shù)量,后來則發(fā)展為能夠檢索網(wǎng)站域名。與Wanderer相對應(yīng),Martin Koster于1993年10月創(chuàng)建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“機(jī)器人”程序,而是靠網(wǎng)站主動提交信息來建立 自己的鏈接索引,類似于現(xiàn)在我們熟知的Yahoo。隨著互聯(lián)網(wǎng)的迅速發(fā)展,使得檢索所有新出現(xiàn)的網(wǎng)頁變得越來越困難,因此,在Matthew Gray的Wanderer基礎(chǔ)上,一些編程者將傳統(tǒng)的“蜘蛛”程序工作原理作了些改進(jìn)。其設(shè)想是,既然所有網(wǎng)頁都可能有連向其他網(wǎng)站的鏈接,那么從跟蹤一個網(wǎng)站的鏈接開始,就有可能檢索整個互
12、聯(lián)網(wǎng)。到1993年底,一些基于此原理的搜索引擎開始紛紛涌現(xiàn),其中以Jump Station、The World Wide Web Worm(GoTo的前身,也就是今天Overture),和Repository-Based Software Engineering (RBSE) spider最負(fù)盛名。然而Jump Station和WWW Worm只是以搜索工具在數(shù)據(jù)庫中找到匹配信息的先后次序排列搜索結(jié)果,因此毫無信息關(guān)聯(lián)度可言。而RBSE是第一個在搜索結(jié)果排列中引入關(guān)鍵字串匹配程 度概念的引擎 最早現(xiàn)代意義上的搜索引擎出現(xiàn)于1994年7月。當(dāng)時(shí)Michael Mauldin將John Leavi
13、tt的蜘蛛程序接入到其索引程序中,創(chuàng)建了大家現(xiàn)在熟知的Lycos。同年4月,斯坦福(Stanford)大學(xué)的兩名博士生,David File和美籍華人楊致遠(yuǎn)(Gerry Yang)共同創(chuàng)辦了超級目錄索引Yahoo,并成功地使搜索引擎的概念深入人心。從此搜索引擎進(jìn)入了高速發(fā)展時(shí)期。目前,互聯(lián)網(wǎng)上有名有姓的搜索引擎已達(dá)數(shù)百家,其檢索的信息量也與從前不可同日而語。比如最近風(fēng)頭正勁的Google,其數(shù)據(jù)庫中存放的網(wǎng)頁已達(dá)30億之巨。隨著互聯(lián)網(wǎng)規(guī)模的急劇膨脹,一家搜索引擎光靠自己單打獨(dú)斗已無法適應(yīng)目前的市場狀況,因此現(xiàn)在搜索引擎之間開始出現(xiàn)了分工協(xié)作,并有了專業(yè)的搜索引擎技術(shù)和搜索數(shù)據(jù)庫服務(wù)提供商。像國
14、外Inktomi,它本身并不是直接面向用戶的搜索引擎,但向包括Overture(原GoTo)、 LookSmart、MSN、HotBot等在內(nèi)的其他搜索引擎提供全文網(wǎng)頁搜索服務(wù)。國內(nèi)的百度也屬于這一類(注),搜狐和新浪用的就是它的技術(shù)。因此 從這個意義上說,它們是搜索引擎的搜索引擎。1.2.2 網(wǎng)絡(luò)爬蟲的分類網(wǎng)絡(luò)爬蟲種類繁多,如果按照部署在哪里分,可以分成:(1)服務(wù)器側(cè):一般是一個多線程程序,同時(shí)下載多個目標(biāo)HTML,可以用PHP, Java, Python等做,一般綜合搜索引擎的爬蟲這樣做。但是,如果對方討厭爬蟲,很可能封掉服務(wù)器的IP,服務(wù)器IP又不容易改,另外耗用的帶寬也是較貴。(2)
15、客戶端:很適合部署定題爬蟲,或者叫聚焦爬蟲。做一個與Google,百度等競爭的綜合搜索引擎成功的機(jī)會微乎其微,而垂直搜索或者比價(jià)服務(wù)或者推薦引擎,機(jī)會要多得多,這類爬蟲不是什么頁面都取的,而是只取關(guān)心的頁面,而且只取頁面上關(guān)心的內(nèi)容,例如提取黃頁信息,商品價(jià)格信息,還有提取競爭對手 廣告信息的。這類爬蟲可以部署很多,而且可以很有侵略性??梢缘统杀敬罅坎渴穑捎诳蛻舳薎P地址是動態(tài)的,所以很難被目標(biāo)網(wǎng)站封鎖。1.3 網(wǎng)絡(luò)爬蟲的發(fā)展趨勢目前,大多數(shù)的搜索引擎都是基于關(guān)鍵詞的搜索引擎。基于關(guān)鍵字匹配的搜索技術(shù)有較大的局限性:首先,它不能區(qū)分同形異義。其次,不能聯(lián)想到關(guān)鍵字的同義詞。Web商業(yè)化至今,
16、搜索引擎始終保持著網(wǎng)絡(luò)上被使用最多的服務(wù)項(xiàng)目的地位,然而,隨著網(wǎng)上內(nèi)容的爆炸式增長和內(nèi)容形式花樣的不斷翻新,搜索引擎越來越不能滿足挑剔的網(wǎng)民們的各種信息需求。搜索引擎的發(fā)展面臨著兩大難題:一是如何跟上Internet的發(fā)展速度,二是如何為用戶提供更精確的查詢結(jié)果。所以,傳統(tǒng)的引擎不能適應(yīng)信息 技術(shù)的高速發(fā)展,新一代智能搜索引擎作為一種高效搜索引擎技術(shù)的在當(dāng)今的網(wǎng)絡(luò)信息時(shí)代日益引起業(yè)界人士的關(guān)注。搜索引擎己成為一個新的研究、開發(fā)領(lǐng)域。因 為它要用到信息檢索、人工智能、計(jì)算機(jī)網(wǎng)絡(luò)、分布式處理、數(shù)據(jù)庫、數(shù)據(jù)挖掘、數(shù)字圖書館、自然語言處理等多領(lǐng)域的理論和技術(shù),所以具有綜合性和挑戰(zhàn)性。又 由于搜索引擎有
17、大量的用戶,有很好的經(jīng)濟(jì)價(jià)值,所以引起了世界各國計(jì)算機(jī)科學(xué)界和信息產(chǎn)業(yè)界的高度關(guān)注,目前的研究、開發(fā)十分活躍,并出現(xiàn)了很多值得注意的動向。1.4 系統(tǒng)開發(fā)的必要性爬蟲程序是一個自動獲取網(wǎng)頁的程序。它為搜索引擎從互聯(lián)網(wǎng)上下載網(wǎng)頁,是搜索引擎的重要組成部分。爬蟲程序的實(shí)現(xiàn)策略,運(yùn)行效率直接影響搜索引擎的搜索結(jié)果。不同的搜索引擎,會根據(jù)對搜索結(jié)果的不同需求,選擇最合適的爬行策略來搜集互聯(lián)網(wǎng)上的信息。高效,優(yōu)秀的爬蟲程序可以使人們在互聯(lián)網(wǎng)上尋找到更及時(shí),更準(zhǔn)確的信息。而現(xiàn)在Linux平臺下開源的搜索引擎資料較少,作為實(shí)現(xiàn)最終開發(fā)目標(biāo)搜索引擎的一部分,本爬蟲程序可以為搜索引擎提供良好的網(wǎng)頁獲取能力,并可
18、以為在Linux下開發(fā)網(wǎng)絡(luò)爬蟲的后來者提供參考。1.5 本文的組織結(jié)構(gòu)本文主要根據(jù)網(wǎng)絡(luò)爬蟲的特點(diǎn),結(jié)合搜索引擎關(guān)鍵技術(shù),linux網(wǎng)絡(luò)編程,對爬蟲程序的關(guān)鍵技術(shù)做了詳細(xì)的分析和研究。然后設(shè)計(jì)并實(shí)現(xiàn)了一個以抓取相關(guān)關(guān)鍵字內(nèi)容并實(shí)現(xiàn)離線瀏覽功能的網(wǎng)絡(luò)爬蟲系統(tǒng)。本文主要分為6個章節(jié),結(jié)構(gòu)安排如下:(1)緒論,對課題的背景研究意義和爬蟲的研究現(xiàn)狀做了簡單介紹。(2)相關(guān)技術(shù)和工具介紹。對網(wǎng)絡(luò)爬蟲的定義、評價(jià)指標(biāo)分類、工作原理并對開發(fā)環(huán)境和工具進(jìn)行了簡單介紹。并以此引出網(wǎng)絡(luò)爬蟲系統(tǒng)的相關(guān)知識介紹。(3)網(wǎng)絡(luò)爬蟲的模型分析 。對網(wǎng)絡(luò)爬蟲視線中的主要思想以及關(guān)鍵技術(shù)進(jìn)行了具體的分析。(4)網(wǎng)絡(luò)爬蟲的模型設(shè)計(jì)
19、 根據(jù)第三章內(nèi)容。對爬蟲系統(tǒng)進(jìn)行了詳細(xì)設(shè)計(jì),并對本爬蟲系統(tǒng)的模型實(shí)現(xiàn)進(jìn)行具體分析。同時(shí)也對使用的技術(shù)進(jìn)行簡單的介紹。(5)程序運(yùn)行和結(jié)果分析對程序的編譯運(yùn)行進(jìn)行簡單介紹。并對測試結(jié)果進(jìn)行了簡單分析。(6)總結(jié)和展望。第二章 相關(guān)技術(shù)和工具綜述2.1 網(wǎng)絡(luò)爬蟲的定義定義1:網(wǎng)絡(luò)爬蟲是一個自動提取網(wǎng)頁的程序,它為搜索引擎從Web上下載網(wǎng)頁,是搜索引擎的重要組成部分。通用網(wǎng)絡(luò)爬蟲從一個或若干初始網(wǎng)頁的URL開始,獲得初始網(wǎng)頁上的URL列表;在抓取網(wǎng)頁的過程中,不斷從當(dāng)前頁面上抽取新的URL放入待爬行隊(duì)列,直到滿足系統(tǒng)的停止條件。定義2:網(wǎng)絡(luò)爬蟲就是根據(jù)一定的網(wǎng)頁分析算法過濾與主題無關(guān)的鏈接,保留相關(guān)
20、的鏈接并將其放入待抓取的URL隊(duì)列中;然后根據(jù)一定的搜索策略從隊(duì)列中選擇下一步要抓取的網(wǎng)頁URL,并重復(fù)上述過程,直到達(dá)到系統(tǒng)的某一條件時(shí)停止。所有被網(wǎng)絡(luò)爬蟲抓取的網(wǎng)頁將會被系統(tǒng)存儲,進(jìn)行一定的分析、過濾,并建立索引,對于網(wǎng)絡(luò)爬蟲來說,這一過程所得到的分析結(jié)果還可能對后續(xù)的抓取過程進(jìn)行反饋和指導(dǎo)。定義3:如果網(wǎng)頁p中包含超鏈接l,則p稱為鏈接l的父網(wǎng)頁。定義4:如果超鏈接l指向網(wǎng)頁t,則網(wǎng)頁t稱為子網(wǎng)頁,又稱為目標(biāo)網(wǎng)頁。網(wǎng)絡(luò)爬蟲的基本思路就是按照事先給出的主題,分超鏈接和已經(jīng)下載的網(wǎng)頁內(nèi)容,預(yù)測下一個待抓取的URL及當(dāng)前網(wǎng)頁的相關(guān)度,保證盡可能多地爬行、下載相關(guān)的網(wǎng)頁,盡可能少地下載無關(guān)網(wǎng)頁。
21、2.2 網(wǎng)頁搜索策略介紹網(wǎng)頁的抓取策略可以分為深度優(yōu)先、廣度優(yōu)先和最佳優(yōu)先三種。深度優(yōu)先在很多情況下會導(dǎo)致爬蟲的陷入(trapped)問題,目前常見的是廣度優(yōu)先和最佳優(yōu)先方法。2.2.1 廣度優(yōu)先搜索策略廣度優(yōu)先搜索策略是指在抓取過程中,在完成當(dāng)前層次的搜索后,才進(jìn)行下一層次的搜索。該算法的設(shè)計(jì)和實(shí)現(xiàn)相對簡單。在目前為覆蓋盡可能多的網(wǎng)頁,一般使用廣度優(yōu)先搜索方法。也有很多研究將廣度優(yōu)先搜索策略應(yīng)用于聚焦爬蟲中。其基本思想是認(rèn)為與初始URL在一定鏈接距離內(nèi)的網(wǎng)頁具有主題相關(guān)性的概率很大。另外一種方法是將廣度優(yōu)先搜索與網(wǎng)頁過濾技術(shù)結(jié)合使用,先用廣度優(yōu)先策略抓取網(wǎng)頁,再將其中無關(guān)的網(wǎng)頁過濾掉。這些方
22、法的缺點(diǎn)在于,隨著抓取網(wǎng)頁的增多,大量的無關(guān)網(wǎng)頁將被下載并過濾,算法的效率將變低。2.3 相關(guān)工具介紹2.3.1 操作系統(tǒng)本網(wǎng)絡(luò)爬蟲程序開發(fā)環(huán)境為Linux CentOS操作系統(tǒng),并且目標(biāo)是在Linux下運(yùn)行,而在其他平臺上會出現(xiàn)各種無法正常運(yùn)行的問題,所以在此有必要介紹一下該程序的運(yùn)行環(huán)境,Linux操作系統(tǒng)。Linux是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng),是一個基于POSIX和UNIX的多用戶、多任務(wù)、支持多線程和多CPU的操作系統(tǒng)。它能運(yùn)行主要的UNIX工具軟件、應(yīng)用程序和網(wǎng)絡(luò)協(xié)議。它支持32位和64位硬件。Linux繼承了Unix以網(wǎng)絡(luò)為核心的設(shè)計(jì)思想,是一個性能穩(wěn)定的多用戶網(wǎng)
23、絡(luò)操作系統(tǒng)。而Linux主要作為Linux發(fā)布版(通常被稱為"distro")的一部分而使用。Linux發(fā)布版指的就是通常所說的“Linux操作系統(tǒng)”,它可能是由一個組織,公司或者個人發(fā)布的。通常來講,一個Linux發(fā)布版包括Linux內(nèi)核,將整個軟件安裝到計(jì)算機(jī)上的一套安裝工具,各種GNU軟件,其他的一些自由軟件,在一些特定的Linux發(fā)布版中也有一些專有軟件。發(fā)布版為許多不同的目的而制作,包括對不同計(jì)算機(jī)硬件結(jié)構(gòu)的支持,對一個具體區(qū)域或語言的本地化,實(shí)時(shí)應(yīng)用,和嵌入式系統(tǒng)。目前,超過三百個發(fā)布版被積極的開發(fā),最普遍被使用的發(fā)布版有大約十二個。較為知名的有Fedora,U
24、buntu,Mageia,紅旗Linux,CentOS等。本程序所使用的開發(fā)操作系統(tǒng)是Linux中比較知名的CentOS。2.3.2 軟件配置在CentOS Linux中,本文主要用的開發(fā)軟件是Vim。一般Linux的發(fā)行版都自帶Vim,Vim是個可配置性極強(qiáng)的文本編輯器,可以進(jìn)行高效的文本編輯。 Vim常被稱作“程序員的編輯器”,其功能如此強(qiáng)大以致許多人認(rèn)為它就是個完整的IDE。當(dāng)然,它并不僅僅為程序員而生。面對各種文本編輯,無論是撰寫email還是編輯配置文件,Vim都臻于完美。但是只有你自己配置之后才能變成適合于你自己的開發(fā)工具。所以需要修改Vim的配置文件,常用的有(以下為簡
25、單配置):“不要使用vi的鍵盤模式,而是vim自己的:set nocompatiblehistory文件中需要記錄的行數(shù):set history=100“語法高亮:syntax on“為C程序提供自動縮進(jìn):set smartindent“使用C樣式的縮進(jìn):set cindent“制表符為4:set tabstop=4“統(tǒng)一縮進(jìn)為4:set softtabstop=4 set shiftwidth=4還有一點(diǎn)不能忽視,那就是安裝GCC編譯器,因?yàn)楸疚膶懙乃写a都是C/C+格式的。雖說基本上每個發(fā)行版都已經(jīng)安裝了GCC編譯器,但不是很全,為了以防萬一,在終端下執(zhí)行了以下命令:$ yum y in
26、stall gcc$ yum y install gcc-c+$ yum install make-或者執(zhí)行$ yum groupinstall “Development Tools”-或者執(zhí)行$ yum install gcc gcc-c+ kernel -develGCC下編譯.c文件:gcc o xx xx.c,編譯.cpp文件只需把gcc改為g+即可。在多文件編譯的情況下,這樣的命令會很繁瑣,通常會寫一個或多個Makefile文件來解決這個問題,在本文的最后會講到。第三章 網(wǎng)絡(luò)爬蟲模型的分析和概要設(shè)計(jì)3.1 網(wǎng)絡(luò)爬蟲的模型分析網(wǎng)絡(luò)爬蟲框架參考的是一個叫l(wèi)arbin的開源爬蟲,它是由法國
27、的年輕人Sebastien Ailleret獨(dú)立開發(fā),用C+語言實(shí)現(xiàn),其代碼可以直接在網(wǎng)上可以下載到。以下是本程序爬蟲使用的框架,看起來更像是主題爬蟲的框架。如圖3.1所示。圖 3-1 網(wǎng)絡(luò)爬蟲的基本框架圖首先建立URL任務(wù)列表隊(duì)列,即開始要爬取的URL。由URL任務(wù)列表開始,根據(jù)預(yù)先設(shè)定的深度爬取網(wǎng)頁,同時(shí)判斷URL是否重復(fù),按照一定算法和排序方式搜索頁面,然后對頁面按照一定算法進(jìn)行分析,并提取相關(guān)URL,最后將所得URL返回任務(wù)列表隊(duì)列。之后將任務(wù)列表中URL重新開始爬取,從而使網(wǎng)絡(luò)爬蟲進(jìn)行循環(huán)工作。3.2 網(wǎng)絡(luò)爬蟲的搜索策略本文的搜索策略為廣度優(yōu)先搜索策略。如下圖3-2所示。搜索過程為a
28、bcdefghijklmnop這樣一個順序。圖3-2 廣度優(yōu)先搜索策略示意圖(1)定義一個狀態(tài)結(jié)點(diǎn)采用廣度優(yōu)先搜索算法解答問題時(shí),需要構(gòu)造一個表明狀態(tài)特征和不同狀態(tài)之間關(guān)系的數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)稱為結(jié)點(diǎn)。不同的問題需要用不同的數(shù)據(jù)結(jié)構(gòu)描述。(2)確定結(jié)點(diǎn)的擴(kuò)展規(guī)則根據(jù)問題所給定的條件,從一個結(jié)點(diǎn)出發(fā),可以生成一個或多個新的結(jié)點(diǎn),這個過程通常稱為擴(kuò)展。結(jié)點(diǎn)之間的關(guān)系一般可以表示成一棵樹,它被稱為解答樹。搜索算法的搜索過程實(shí)際上就是根據(jù)初始條件和擴(kuò)展規(guī)則構(gòu)造一棵解答樹并尋找符合目標(biāo)狀態(tài)的結(jié)點(diǎn)的過程。廣度優(yōu)先搜索算法中,解答樹上結(jié)點(diǎn)的擴(kuò)展是沿結(jié)點(diǎn)深度的“斷層”進(jìn)行,也就是說,結(jié)點(diǎn)的擴(kuò)展是按它們接近
29、起始結(jié)點(diǎn)的程度依次進(jìn)行的。首先生成第一層結(jié)點(diǎn),同時(shí)檢查目標(biāo)結(jié)點(diǎn)是否在所生成的結(jié)點(diǎn)中,如果不在,則將所有的第一層結(jié)點(diǎn)逐一擴(kuò)展,得到第二層結(jié)點(diǎn),并檢查第二層結(jié)點(diǎn)是否包含目標(biāo)結(jié)點(diǎn) 對長度為n+1的任一結(jié)點(diǎn)進(jìn)行擴(kuò)展之前,必須先考慮長度為n的結(jié)點(diǎn)的每種可能的狀態(tài)。因此,對于同一層結(jié)點(diǎn)來說,求解問題的價(jià)值是相同的,我們可以按任意順序來擴(kuò)展它們。這里采用的原則是先生成的結(jié)點(diǎn)先擴(kuò)展。結(jié)點(diǎn)的擴(kuò)展規(guī)則也就是如何從現(xiàn)有的結(jié)點(diǎn)生成新結(jié)點(diǎn)。對不同的問題,結(jié)點(diǎn)的擴(kuò)展規(guī)則也不相同,需要按照問題的要求確定。(3)搜索策略為了便于進(jìn)行搜索,要設(shè)置一個表存儲所有的結(jié)點(diǎn)。因?yàn)樵趶V度優(yōu)先搜索算法中,要滿足先生成的結(jié)點(diǎn)先擴(kuò)展的原則,所
30、以存儲結(jié)點(diǎn)的表一般設(shè)計(jì)成隊(duì)列的數(shù)據(jù)結(jié)構(gòu)。搜索的步驟一般是:(1)從隊(duì)列頭取出一個結(jié)點(diǎn),檢查它按照擴(kuò)展規(guī)則是否能夠擴(kuò)展,如果能則產(chǎn)生一個新結(jié)點(diǎn)。(2)檢查新生成的結(jié)點(diǎn),看它是否已在隊(duì)列中存在,如果新結(jié)點(diǎn)已經(jīng)在隊(duì)列中出現(xiàn)過,就放棄這個結(jié)點(diǎn),然后回到第(1)步。否則,如果新結(jié)點(diǎn)未曾在隊(duì)列中出現(xiàn)過,則將它加入到隊(duì)列尾。(3)檢查新結(jié)點(diǎn)是否目標(biāo)結(jié)點(diǎn)。如果新結(jié)點(diǎn)是目標(biāo)結(jié)點(diǎn),則搜索成功,程序結(jié)束;若新結(jié)點(diǎn)不是目標(biāo)結(jié)點(diǎn),則回到第(1)步,再從隊(duì)列頭取出結(jié)點(diǎn)進(jìn)行擴(kuò)展。最終可能產(chǎn)生兩種結(jié)果:找到目標(biāo)結(jié)點(diǎn),或擴(kuò)展完所有結(jié)點(diǎn)而沒有找到目標(biāo)結(jié)點(diǎn)。3.3 網(wǎng)絡(luò)爬蟲的概要設(shè)計(jì)本網(wǎng)絡(luò)爬蟲的開發(fā)目的,通過網(wǎng)絡(luò)爬蟲技術(shù)一個自動提
31、取網(wǎng)頁的程序,實(shí)現(xiàn)搜索引擎從自己想要訪問的網(wǎng)上下載網(wǎng)頁,再根據(jù)已下載的網(wǎng)頁上繼續(xù)訪問其它的網(wǎng)頁,并將其下載直到滿足用戶的需求。根據(jù)現(xiàn)實(shí)中不同用戶的實(shí)際上的各種需求,本項(xiàng)目簡單實(shí)現(xiàn)主題爬蟲,本網(wǎng)絡(luò)爬蟲需要達(dá)到如下幾個目標(biāo):(1)設(shè)計(jì)基于多線程的網(wǎng)絡(luò)爬蟲,客戶端向服務(wù)器發(fā)送自己設(shè)定好請求。如圖3-3所示。圖3-3 多線程網(wǎng)絡(luò)爬蟲概要設(shè)計(jì)圖模型(2)通過 http將Web服務(wù)器上協(xié)議站點(diǎn)的網(wǎng)頁代碼提取出來。(3)根據(jù)一定的正則表達(dá)式提取出客戶端所需要的信息。(4)廣度優(yōu)先搜索可從網(wǎng)頁中某個鏈接出發(fā),訪問該鏈接網(wǎng)頁上的所有鏈接,訪問完成后,再通過遞歸算法實(shí)現(xiàn)下一層的訪問。本網(wǎng)絡(luò)爬蟲最終將設(shè)計(jì)成一個能夠
32、自動讀寫配置文件并且在后臺自動執(zhí)行的網(wǎng)絡(luò)爬蟲程序。網(wǎng)絡(luò)爬蟲工作流程圖如圖3-4所示。圖3-4 網(wǎng)絡(luò)爬蟲工作流程圖第四章 網(wǎng)絡(luò)爬蟲模型的設(shè)計(jì)與實(shí)現(xiàn)4.1 網(wǎng)絡(luò)爬蟲的總體設(shè)計(jì)根據(jù)本網(wǎng)絡(luò)爬蟲的概要設(shè)計(jì)本網(wǎng)絡(luò)爬蟲是一個自動提取網(wǎng)頁的程序,根據(jù)設(shè)定的主題判斷是否與主題相關(guān),再根據(jù)已下載的網(wǎng)頁上繼續(xù)訪問其它的網(wǎng)頁,并將其下載直到滿足用戶的需求。(1)設(shè)計(jì)基于多線程的網(wǎng)絡(luò)爬蟲。(2)通過 http協(xié)議將待爬取URL列表對應(yīng)的URL的網(wǎng)頁代碼提取出來。(3)提取出所需要的信息并且通過算法判斷網(wǎng)頁是否和設(shè)定的主題相關(guān)。(4)廣度優(yōu)先搜索,從網(wǎng)頁中某個鏈接出發(fā),訪問該鏈接網(wǎng)頁上的所有鏈接,訪問完成后,再通過遞歸算
33、法實(shí)現(xiàn)下一層的訪問,重復(fù)以上步驟??偟膩碚f爬蟲程序根據(jù)輸入獲得URL任務(wù)列表,即初始URL種子,把初始種子保存在臨界區(qū)中,按照廣度搜索運(yùn)算法搜索抓取網(wǎng)頁并提取URL返回到臨界區(qū)中,通過判斷主題相關(guān)度算法判斷相關(guān)度,取出不相關(guān)網(wǎng)頁,從而使整個爬蟲程序循環(huán)運(yùn)行下去。4.2 網(wǎng)絡(luò)爬蟲的具體設(shè)計(jì)4.2.1 URL類設(shè)計(jì)及標(biāo)準(zhǔn)化URLURL 的一般形式是:<URL的訪問方式>:/<主機(jī)>:<端口>/<路徑>。為了方便處理,設(shè)計(jì)了一個名叫URL的類,它包含Host(主機(jī)名),Port(端口),F(xiàn)ile(文件路徑),F(xiàn)name(給這張網(wǎng)頁取的名字)。以下代碼是
34、class URL的成員及其成員函數(shù)(摘自web.h):class URLpublic:URL() void SetHost(const string& host) Host = host; string GetHost() return Host; void SetPort(int port) Port = port; int GetPort() return Port; void SetFile(const string& file) File = file; string GetFile() return File; void SetFname(const string&
35、amp; fname) Fname = fname; string GetFname() return Fname; URL() private:string Host;int Port;string File;string Fname;對URL的處理:此外,注意到在網(wǎng)頁源代碼中,URL有些是絕對路徑,有些是相對路徑,還有一些URL中存在字符#,多個/等等。因此,需要對這些URL進(jìn)行處理,分別得到每個URL的Host,Port,F(xiàn)ile。以下是本文對URL的設(shè)定:(1)URL的File成員不能以/結(jié)尾,若有則以0填充;若該File成員沒有路徑,則設(shè)定其路徑為/。這樣做的目的是為了便于URL排重
36、。(2)URL的File成員中若有#字符,則刪除它及它以后的字符,剩余的字符串作為File的值。(3)若URL中沒有顯式表明端口,則默認(rèn)Port成員的值為80。(4)若URL沒有主機(jī)屬性,則默認(rèn)Host成員的值為初始URL的主機(jī)名。4.2.2 爬取網(wǎng)頁在分析網(wǎng)頁之前,首先網(wǎng)頁需要被抓取下來,分析一下數(shù)據(jù)從服務(wù)器保存到本地的過程。第一部分:分析之前,首先要明確的是:當(dāng)從sockfd讀取數(shù)據(jù)時(shí),最前面一部分是和網(wǎng)頁本身無關(guān)的信息,比如有些網(wǎng)頁未找到,就會返回404 not found等服務(wù)信息,類似的,每種情況會返回對應(yīng)的信息,因此,對于一些服務(wù)信息,應(yīng)該不予記錄。當(dāng)讀到>字符時(shí)才開始正式記
37、錄網(wǎng)頁內(nèi)容。第二部分:定義一個tmp的字符數(shù)組,用來臨時(shí)存放抓取的的網(wǎng)頁,抓取方法與第一部分相同同,都是用read函數(shù),不同的是這里是一塊一塊抓取,效率上能比每次抓取一個字節(jié)要高。有人可能會問,為什么不直接存放到文件中,而要保存到臨時(shí)數(shù)組中呢?解釋是:因?yàn)橄乱徊椒治鼍W(wǎng)頁時(shí),有個URL重定向的過程,程序還會繼續(xù)修改tmp數(shù)組。如果直接保存到文件,那么還得再次打開文件分析網(wǎng)頁,這樣會降低效率,因?yàn)樵诖疟P執(zhí)行讀寫操作總是比在內(nèi)存讀寫慢得多。4.2.3 網(wǎng)頁分析(1)URL提取考慮到網(wǎng)頁中的鏈接格式主要是:<a herf=”xxx”>title</a>,因此本文通過string
38、自身封裝的find函數(shù)來找到每一個”herf”的位置,接下來的情況稍微有些復(fù)雜,分為三種情況。第一種:URL用雙引號引起來;第二種:以單引號引起來;第三種:URL沒有被引起來。在此使用了一個標(biāo)記變量(flag)來區(qū)分以上三種情況。(2)URL的重定向考慮到本文的要求不僅僅是抓取網(wǎng)頁本身,還要實(shí)現(xiàn)一個離線瀏覽網(wǎng)頁的功能,原有的鏈接不再有效,因此,URL的重定向這一步不可缺少。之前,爬蟲已經(jīng)抓取了一些網(wǎng)頁并存放在了一個名為Pages的文件夾中,而且其中的每個網(wǎng)頁都進(jìn)行了重命名處理(本文直接以url.Fname的字符串哈希值作文保存網(wǎng)頁的文件名)。那么在本地的URL無論在路徑和文件名上都和原來網(wǎng)頁上
39、的鏈接都是不對應(yīng)的,要想實(shí)現(xiàn)和原來一樣的網(wǎng)頁跳轉(zhuǎn),必須修改每個鏈接的herf值。對于原來的鏈接<a herf=”xxx.html”>title</a>,假設(shè)現(xiàn)在重命名該網(wǎng)頁為new.html,那么如何處理怎么才能轉(zhuǎn)化成新的鏈接呢?方法有很多,比如可以通過覆蓋和移動,使得兩個引號直接的內(nèi)容為new.html。本文采用的方法如下:現(xiàn)已知第一個引號的位置為pos_1,因此可以調(diào)用string類的insert方法。調(diào)用后的效果如下:<a herf=”new.html” ”xxx.html”>title</a>這樣處理不僅屏蔽了”xxx.html”,也避免
40、了刪除原有鏈接等不必要操作,一定程度上提高了代碼的效率。(3) URL判重抓取網(wǎng)頁時(shí)有一個非常棘手的問題,那就是重復(fù)抓取問題。大家知道,一個網(wǎng)站中的鏈接非常多,抽象出來就是一個巨大的蜘蛛網(wǎng),類似與圖論中的無向圖。如果不對爬蟲進(jìn)行設(shè)置,它就像一只無頭蒼蠅一樣,到處亂撞。這樣待抓取隊(duì)列里的URL越來越多,并且好多都是重復(fù)的。那么如何才能跳出這個怪圈呢?C+已經(jīng)為大家提供了一個叫set的容器(當(dāng)然也可以使用hash來判重)。在cplusplus這樣介紹:set是一種存放唯一性元素的關(guān)聯(lián)容器,它里面的每一個元素都稱為關(guān)鍵字,它由二叉搜索樹實(shí)現(xiàn)。由于它的唯一性,高效性,把它選擇作為URL判重的一種類似h
41、ash的工具。本文代碼如下:定義:set<unsigned int>Set;使用:Set.insert(hashVal);4.2.4 網(wǎng)頁存儲前面爬蟲已經(jīng)抓取到了一張網(wǎng)頁,并且進(jìn)行了重定向處理。那么接下來要做的事就是把它保存到磁盤里,在這一步需要用到文件操作(摘自http.cpp)。chdir("Pages");int fd = open(url_t.GetFname().c_str(), O_CREAT|O_EXCL|O_RDWR, 00770);/* check whether needs re-fetch */if(fd < 0) if(errno
42、= EEXIST) stat(url_t.GetFname().c_str(), &buf);int len = buf.st_size;if(len >= flen) goto NEXT;else fd = open(url_t.GetFname().c_str(), O_RDWR|O_TRUNC, 00770);if(fd < 0) perror("file open error"); goto NEXT; else perror("file open error");goto NEXT;write(fd, HtmFile.c_s
43、tr(), HtmFile.length();NEXT:close(fd);/ todo next以上代碼主要功能是保存已抓取網(wǎng)頁的內(nèi)容到磁盤。有時(shí)候在網(wǎng)絡(luò)狀況不理想的情況下,爬蟲抓取有些網(wǎng)頁時(shí)會導(dǎo)致請求超時(shí),或抓取內(nèi)容不全,因此為了完善抓取內(nèi)容,可以進(jìn)行下一次重復(fù)抓取,其抓取條件為:該文件不存在,則直接進(jìn)行抓?。辉撐募呀?jīng)存在且當(dāng)前抓取的內(nèi)容多與上次抓取的,則覆蓋上次保存的文件;其它情況,放棄。第一行代碼使用O_CREAT | O_EXCL | O_RDWR模式打開,當(dāng)該文件已經(jīng)存在時(shí)返回-1,錯誤代碼存放在error中,錯誤代號為EEXIST。代碼中使用stat函數(shù)來讀取參數(shù)為文件名的文件
44、信息,其中我們需要的就是st_size這個成員的內(nèi)容,它以字節(jié)形式記錄了文件的大小。這樣就可以與當(dāng)前抓取網(wǎng)頁大?。ù娣庞谧兞縡len中)比較,從而判斷是否需要覆蓋原有文件。本文以上代碼雖然使用了不推薦的goto語句,因?yàn)槌绦蛐枰^write函數(shù)。不過使用goto語句在沒有給程序帶來混亂的情況下實(shí)現(xiàn)了一條break語句實(shí)現(xiàn)不了的功能,因此更具實(shí)用性。4.2.5 Linux socket通信本文中的socket通信基于TCP,因此有必要提一下TCP的連接和斷開過程。TCP的可靠連接得益于它的三次握手原理,下圖形象的表示了TCP三次握手建立連接和兩次半關(guān)閉斷開連接的具體過程。在連接和斷開連接之間,
45、客戶端和服務(wù)器即可進(jìn)行雙向的信息通信。圖4-1 TCP三次握手與兩次半關(guān)閉過程在了解各個Socket函數(shù)之前,首先來看一個經(jīng)典的流程圖,幾乎每次網(wǎng)絡(luò)通信都需要走以下流程,它詳細(xì)地顯示了TCP客戶端和TCP服務(wù)器之間的Socket通信流程:圖4-2 基于TCP客戶/服務(wù)器程序的套接字函數(shù)及通信流程在程序中,每一個URL對應(yīng)的網(wǎng)頁,在客戶端都需要完成Socket(),Connect(),Write(),Read(),Close()這一過程。要注意的是,如果不及時(shí)關(guān)閉Socket文件描述符,有時(shí)會出現(xiàn)“open too many files”的系統(tǒng)錯誤,這是由于系統(tǒng)對用戶同時(shí)打開多個文件的限制(這里
46、的文件不僅僅指通常意義上的文件,Linux會把任何東西都當(dāng)做文件,包括目錄、各類描述符等)。而且,以上情況在多線程情況下特別容易出現(xiàn)。(1)socket() 函數(shù)要進(jìn)行網(wǎng)絡(luò)I/O操作,第一件要做的事就是調(diào)用socket()函數(shù)。該函數(shù)用來產(chǎn)生一個int類型的socket文件描述符,函數(shù)原型:#include <sys/socket.h>int socket(int family, int type, int protocal);返回:若成功則返回非負(fù)描述符,否則返回-1。參數(shù): family指明協(xié)議族,有AF_INET,AF_INET6等。type指明套接字類型,有SOCK_STR
47、EAM,SOCK_DGRAM等。protocol指明某個協(xié)議類型,常設(shè)為0。例(摘自http.cpp):if(sockfd = socket(PF_INET, SOCK_STREAM, 0) = -1) return -1;至于本文為什么采用PF_INET而不是AF_INET,是因?yàn)镻OSIX下對應(yīng)PF_INET,BSD中對應(yīng)AF_INET。兩者版本不同,但差別微小。(2)connect() 函數(shù)TCP客戶端用connect()函數(shù)來建立與TCP服務(wù)器的連接,在連接之前,需要對該函數(shù)第二個參數(shù)進(jìn)行初始化操作。函數(shù)原型7:#include <sys/socket.h>int conn
48、ect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);返回:成功返回0,反之返回-1參數(shù):sockfd是由socket函數(shù)返回的套接字描述符第二、第三個參數(shù)分別是一個指向套接字地址結(jié)構(gòu)的指針和該結(jié)構(gòu)的大小,其初始化代碼如下(摘自http.cpp):struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr);server_addr.sin_family = AF_INET;server_addr.sin_port = hton
49、s(80); server_addr.sin_addr = *(struct in_addr *)Host->h_addr); 在本例子中,沒有在調(diào)用connect函數(shù)之前調(diào)用bind函數(shù)(用來綁定端口等地址信息),因?yàn)樵诳蛻舳讼鲁遣皇翘厥馇闆r,無須調(diào)用。例(摘自http.cpp)if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr) = -1) perror("connect error");return -1;(3)write(), read() 函數(shù)本文
50、使用這兩個函數(shù)來讀寫套接字操作,read函數(shù)從參數(shù)fd讀取內(nèi)容放到參數(shù)buf中;相反,write函數(shù)把參數(shù)buf的內(nèi)容寫入到參數(shù)fd中。#include <unistd.h>ssize_t read(int fd, void * buf , size_t count);返回:返回實(shí)際讀到的字節(jié)數(shù),出錯返回-1,錯誤信息存放在errno中。參數(shù):fd為文件描述符;第二個指定要讀入的buf指針指向的內(nèi)存,第三個參數(shù)表明要讀取的字節(jié)數(shù)。#include<unistd.h>ssize_t write (int fd, const void * buf, size_t count
51、);返回:返回實(shí)際寫入的字節(jié)數(shù),出錯返回-1,錯誤信息存放在errno中。參數(shù):與read函數(shù)參數(shù)具有相同意義。在本文中,write函數(shù)的使用是在爬蟲向服務(wù)器發(fā)送請求這一環(huán)節(jié),這里順便了解一下請求的具體內(nèi)容,詳見以下代碼(摘自http.cpp):string Uagent = UAGENT, Conn = CONN, Accept = ACCEPT;string request = "GET /"+ url_t.GetFile() + " HTTP/1.1rnHost: "+ url_t.GetHost() + "rnUser-Agent: &
52、quot; + Uagent + "rnAccept: " + Accept + "rnConnection: " + Conn + "rnrn" int d, total = request.length(), send = 0;while(send < total) if(d = write(sockfd, request.c_str()+send, total-send) < 0) return -1;send += d;其中的宏定義如下(摘自http.h):#define UAGENT "Wget/1.1
53、0.2"#define ACCEPT "*/*"#define CONN "keep-alive"其中request的請求內(nèi)容是有一定格式限制的,開頭必須是“GET /” + 要抓取的網(wǎng)頁路徑 + HTTP協(xié)議 + 主機(jī)名 + 等,有些選項(xiàng)是可選的。其中的Uagent也可以不指定,雖然不推薦這樣做。因?yàn)榫W(wǎng)站開發(fā)人員若不希望一些爬蟲來訪問他的網(wǎng)頁,他們可以在robot.txt中添加限制某些爬蟲不允許訪問的條件;但這樣問題又來了,使用爬蟲的人希望抓取更多的網(wǎng)頁,因此不希望被服務(wù)器拒絕。這樣的矛盾一直存在,只不過從道德層面上來講,還是加上用戶代理這個
54、選項(xiàng)。常見的用戶代理(User Agent)有Mozilla/4.0,Opera/9.80等。其中需要注意格式的要求,比如空格,回車換行等,最后四個字符(兩個回車,兩個換行)表示命令的結(jié)束。(4)close() 函數(shù)該函數(shù)用來關(guān)閉套接字,并終止TCP連接。函數(shù)原型:#include <unistd.h>int close(int sockfd);參數(shù):sockfd為socket函數(shù)返回的套接字描述符。返回:成功返回0,反之返回-1。(5)其它重要函數(shù)前文提到了gethostbyname函數(shù),它通過傳入hostname來返回主機(jī)名,結(jié)果指向一個struct hostent類型的結(jié)構(gòu)體
55、。函數(shù)原型:#include <netdb.h>struct hostent *gethostbyname(const char *hostname);參數(shù):hostname為用戶指定的域名。返回:成功返回非空指針,反之則為NULL。/ 例子(摘自http.cpp)if(Host = gethostbyname(hname.c_str() = NULL) return -1;在文本使用的爬蟲中,gethostbyname函數(shù)只需調(diào)用一次,因?yàn)楸疚那疤崾窃谕挥蛎伦ト【W(wǎng)頁。當(dāng)然如果抓取范圍沒有限制,則需對不同域名的網(wǎng)站多次調(diào)用該函數(shù)。/ SetNoblocking函數(shù)(摘自http
56、.cpp)int SetNoblocking(const int& sockfd) int opts = fcntl(sockfd, F_GETFL);/ get file_flag and access modelif (opts < 0) return -1;opts |= O_NONBLOCK;/ set nonblockingif (fcntl(sockfd, F_SETFL, opts) < 0) return -1;SetNonblocking函數(shù)不是系統(tǒng)函數(shù),本文把它單獨(dú)提出來是因?yàn)樗菍?shí)現(xiàn)非阻塞讀寫、connect等操作的開關(guān)。4.2.6 EPOLL模型及其使用(1)EPOLL模型介紹在Linux網(wǎng)絡(luò)編程中,大家常用的是多路復(fù)用IO接口select/poll來觸發(fā)事件,在這里介紹它的增強(qiáng)版epoll。與select/poll相比,epoll最大的好處是不會隨著fd的增加而降低效率,因?yàn)閟elect/poll是通過輪詢來處理事件的,因此會隨著fd 的增加效率降低。在epoll中,首先需要了解的有三個函數(shù):int epoll_create(int size);該函數(shù)用來創(chuàng)建一個epoll的文件描述符。參數(shù) size:能夠最大監(jiān)聽的socket
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高中化學(xué)新教材同步 必修第一冊 第3章 第2節(jié) 實(shí)驗(yàn)活動2 鐵及其化合物的性質(zhì)
- 【四川卷】四川省德陽市高中2022級(2025屆)高三質(zhì)量監(jiān)測考試(二)(德陽二診)(2.21-2.23)英語試卷答案
- 傾廢航行數(shù)據(jù)記錄儀戰(zhàn)略市場規(guī)劃報(bào)告
- 鎳精礦戰(zhàn)略市場規(guī)劃報(bào)告
- 信鴿教練合同范本
- 加盟 轉(zhuǎn)讓合同范本
- 值守合同范本
- 中國學(xué)生發(fā)展核心素養(yǎng)心得體會
- 臺車出售合同范本
- 水利工程師水力學(xué)試題(附參考答案)
- 2025天津市安全員-B證考試題庫附答案
- 二年級下冊數(shù)學(xué)口算題-可打印
- 新風(fēng)施工合同
- 2025-2030年園藝修剪機(jī)器人行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報(bào)告
- 人教版四年級數(shù)學(xué)下冊第四單元測試卷(含答案)
- 北師大版二年級數(shù)學(xué)下冊各單元測試卷
- 教科版 二年級下冊科學(xué)教學(xué)計(jì)劃
- 工序標(biāo)準(zhǔn)工時(shí)及產(chǎn)能計(jì)算表
- 人教版體育與健康四年級-《障礙跑》教學(xué)設(shè)計(jì)
- DB32-T 2860-2015散裝液體化學(xué)品槽車裝卸安全作業(yè)規(guī)范-(高清現(xiàn)行)
- 福利院裝修改造工程施工組織設(shè)計(jì)(225頁)
評論
0/150
提交評論