




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
中國礦業(yè)大學(xué)計算機(jī)學(xué)院2014級本科生課程報告課程名稱應(yīng)用軟件開發(fā)實踐報告時間學(xué)生姓名朱少杰、胥鐵馨學(xué)號08143334、08143336專業(yè)14級計科6班任課教師徐慧任課教師評語任課教師評語(①對課程基礎(chǔ)理論的掌握;②對課程知識應(yīng)用能力的評價;③對課程報告相關(guān)實驗、作品、軟件等成果的評價;④課程學(xué)習(xí)態(tài)度和上課紀(jì)律;⑤課程成果和報告工作量;⑥總體評價和成績;⑦存在問題等):成績:任課教師簽字:年月日摘要網(wǎng)絡(luò)爬蟲(WebCrawler),通常被稱為爬蟲,是搜索引擎的重要組成部分。隨著信息技術(shù)的飛速進(jìn)步,作為搜索引擎的一個組成部分——網(wǎng)絡(luò)爬蟲,一直是研究的熱點,它的好壞會直接決定搜索引擎的未來。目前,網(wǎng)絡(luò)爬蟲的研究包括Web搜索策略研究的研究和網(wǎng)絡(luò)分析的算法,兩個方向,其中在Web爬蟲網(wǎng)絡(luò)搜索主題是一個研究方向,根據(jù)一些網(wǎng)站的分析算法,過濾不相關(guān)的鏈接,連接到合格的網(wǎng)頁,并放置在一個隊列被抓取。把互聯(lián)網(wǎng)比喻成一個蜘蛛網(wǎng),那么Spider就是在網(wǎng)上爬來爬去的蜘蛛。網(wǎng)絡(luò)蜘蛛是通過網(wǎng)頁的鏈接地址來尋找網(wǎng)頁,從網(wǎng)站某一個頁面(通常是首頁)開始,讀取網(wǎng)頁的內(nèi)容,找到在網(wǎng)頁中的其它鏈接地址,然后通過這些鏈接地址尋找下一個網(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ò)爬蟲;Java;多線程;MySQL;Webmagic;CsdnblogABSTRACTWebCrawler,usuallycalledCrawlerforshort,isanimportantpartofsearchengine.Withthehigh-speeddevelopmentofinformation,WebCrawler--thesearchenginecannotlackof--whichisahotresearchtopicthoseyears.ThequalityofasearchengineismostlydependedonthequalityofaWebCrawler.Nowadays,thedirectionofresearchingWebCrawlermainlydividesintotwoparts:oneisthesearchingstrategytowebpages;theotheristhealgorithmofanalysisURLs.Amongthem,theresearchofTopic-FocusedWebCrawleristhetrend.Itusessomewebpageanalysisstrategytofiltertopic-lessURLsandaddfitURLsintoURL-WAITqueue.Themetaphorofaspiderwebinternet,thenSpiderspideriscrawlingaroundontheInternet.Webspiderthroughweblinkaddresstofindpages,startingfromaonepagewebsite(usuallyhome),readthecontentsofthepage,findtheaddressoftheotherlinksonthepage,andthenlookforthenextWebpageaddressesthroughtheselinks,sohasbeenthecyclecontinues,untilallthepagesofthissitearecrawledexhausted.IftheentireInternetasasite,thenyoucanusethisWebcrawlerprincipleallthepagesontheInternetarecrawlingdown..Keywords:Webcrawler;Java;Multithreading;MySQL;Webmagic;Csdnblog 目錄 一.網(wǎng)絡(luò)爬蟲的簡介 11.1定義 11.2產(chǎn)生背景 11.3組成 11.4分類 21.4.1通用網(wǎng)絡(luò)爬蟲 21.4.2焦網(wǎng)絡(luò)爬蟲 21.4.3增量式網(wǎng)絡(luò)爬蟲 21.4.4DeepWeb爬蟲 21.5發(fā)展趨勢 3二.環(huán)境需求及配置 32.1Java版本及配置 32.2Eclipse配置 52.3Maven配置 6三.網(wǎng)絡(luò)爬蟲模型的具體設(shè)計 93.1框架webmagic 93.1.1WebMagic概覽 93.1.2Webmagic總體架構(gòu) 93.1.3Webmagic項目組成 103.2網(wǎng)頁搜索策略 113.2.1拓?fù)浞治鏊惴?113.2.2網(wǎng)頁內(nèi)容分析算法 123.3爬行策略 133.4爬蟲的配置 173.5頁面元素的抽取 213.5.1XPath 213.5.2CSS選擇器 223.5.3正則表達(dá)式 223.6鏈接的發(fā)現(xiàn) 223.7具體代碼實現(xiàn) 223.7.1CsdnblogPageProcessor.java 223.7.2App.java 26四.導(dǎo)入MySQL數(shù)據(jù)庫 274.1MySQL簡介 274.2MySQL的安裝及配置 284.3安裝MySQLWorkbench 314.4編寫鏈接數(shù)據(jù)庫文件 35一.網(wǎng)絡(luò)爬蟲的簡介1.1定義網(wǎng)絡(luò)爬蟲(又被稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。1.2產(chǎn)生背景隨著網(wǎng)絡(luò)的迅速發(fā)展,萬維網(wǎng)成為大量信息的載體,如何有效地提取并利用這些信息成為一個巨大的挑戰(zhàn)。搜索引擎(SearchEngine),例如傳統(tǒng)的通用搜索引擎AltaVista,Yahoo!和Google等,作為一個輔助人們檢索信息的工具成為用戶訪問萬維網(wǎng)的入口和指南。但是,這些通用性搜索引擎也存在著一定的局限性,如:(1)不同領(lǐng)域、不同背景的用戶往往具有不同的檢索目的和需求,通用搜索引擎所返回的結(jié)果包含大量用戶不關(guān)心的網(wǎng)頁。(2)通用搜索引擎的目標(biāo)是盡可能大的網(wǎng)絡(luò)覆蓋率,有限的搜索引擎服務(wù)器資源與無限的網(wǎng)絡(luò)數(shù)據(jù)資源之間的矛盾將進(jìn)一步加深。(3)萬維網(wǎng)數(shù)據(jù)形式的豐富和網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,圖片、數(shù)據(jù)庫、音頻、視頻多媒體等不同數(shù)據(jù)大量出現(xiàn),通用搜索引擎往往對這些信息含量密集且具有一定結(jié)構(gòu)的數(shù)據(jù)無能為力,不能很好地發(fā)現(xiàn)和獲取。(4)通用搜索引擎大多提供基于關(guān)鍵字的檢索,難以支持根據(jù)語義信息提出的查詢。為了解決上述問題,定向抓取相關(guān)網(wǎng)頁資源的聚焦爬蟲應(yīng)運(yùn)而生。聚焦爬蟲是一個自動下載網(wǎng)頁的程序,它根據(jù)既定的抓取目標(biāo),有選擇的訪問萬維網(wǎng)上的網(wǎng)頁與相關(guān)的鏈接,獲取所需要的信息。與通用爬蟲(generalpurposewebcrawler)不同,聚焦爬蟲并不追求大的覆蓋,而將目標(biāo)定為抓取與某一特定主題內(nèi)容相關(guān)的網(wǎng)頁,為面向主題的用戶查詢準(zhǔn)備數(shù)據(jù)資源。1.3組成在網(wǎng)絡(luò)爬蟲的系統(tǒng)框架中,主過程由控制器,解析器,資源庫三部分組成。控制器的主要工作是負(fù)責(zé)給多線程中的各個爬蟲線程分配工作任務(wù)。解析器的主要工作是下載網(wǎng)頁,進(jìn)行頁面的處理,主要是將一些JS腳本標(biāo)簽、CSS代碼內(nèi)容、空格字符、HTML標(biāo)簽等內(nèi)容處理掉,爬蟲的基本工作是由解析器完成。資源庫是用來存放下載到的網(wǎng)頁資源,一般都采用大型的數(shù)據(jù)庫存儲,如Oracle數(shù)據(jù)庫,并對其建立索引。控制器控制器是網(wǎng)絡(luò)爬蟲的中央控制器,它主要是負(fù)責(zé)根據(jù)系統(tǒng)傳過來的URL鏈接,分配一線程,然后啟動線程調(diào)用爬蟲爬取網(wǎng)頁的過程。解析器解析器是負(fù)責(zé)網(wǎng)絡(luò)爬蟲的主要部分,其負(fù)責(zé)的工作主要有:下載網(wǎng)頁的功能,對網(wǎng)頁的文本進(jìn)行處理,如過濾功能,抽取特殊HTML標(biāo)簽的功能,分析數(shù)據(jù)功能。資源庫主要是用來存儲網(wǎng)頁中下載下來的數(shù)據(jù)記錄的容器,并提供生成索引的目標(biāo)源。中大型的數(shù)據(jù)庫產(chǎn)品有:Oracle、SqlServer等。1.4分類1.4.1通用網(wǎng)絡(luò)爬蟲通用網(wǎng)絡(luò)爬蟲又稱全網(wǎng)爬蟲(ScalableWebCrawler),爬行對象從一些種子URL擴(kuò)充到整個Web,主要為門戶站點搜索引擎和大型Web服務(wù)提供商采集數(shù)據(jù)。由于商業(yè)原因,它們的技術(shù)細(xì)節(jié)很少公布出來。這類網(wǎng)絡(luò)爬蟲的爬行范圍和數(shù)量巨大,對于爬行速度和存儲空間要求較高,對于爬行頁面的順序要求相對較低,同時由于待刷新的頁面太多,通常采用并行工作方式,但需要較長時間才能刷新一次頁面。雖然存在一定缺陷,通用網(wǎng)絡(luò)爬蟲適用于為搜索引擎搜索廣泛的主題,有較強(qiáng)的應(yīng)用價值。1.4.2焦網(wǎng)絡(luò)爬蟲聚焦網(wǎng)絡(luò)爬蟲(FocusedCrawler),又稱主題網(wǎng)絡(luò)爬蟲(TopicalCrawler),是指選擇性地爬行那些與預(yù)先定義好的主題相關(guān)頁面的網(wǎng)絡(luò)爬蟲[8]。和通用網(wǎng)絡(luò)爬蟲相比,聚焦爬蟲只需要爬行與主題相關(guān)的頁面,極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,保存的頁面也由于數(shù)量少而更新快,還可以很好地滿足一些特定人群對特定領(lǐng)域信息的需求。1.4.3增量式網(wǎng)絡(luò)爬蟲增量式網(wǎng)絡(luò)爬蟲(IncrementalWebCrawler)是指對已下載網(wǎng)頁采取增量式更新和只爬行新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁的爬蟲,它能夠在一定程度上保證所爬行的頁面是盡可能新的頁面。和周期性爬行和刷新頁面的網(wǎng)絡(luò)爬蟲相比,增量式爬蟲只會在需要的時候爬行新產(chǎn)生或發(fā)生更新的頁面,并不重新下載沒有發(fā)生變化的頁面,可有效減少數(shù)據(jù)下載量,及時更新已爬行的網(wǎng)頁,減小時間和空間上的耗費(fèi),但是增加了爬行算法的復(fù)雜度和實現(xiàn)難度。增量式網(wǎng)絡(luò)爬蟲的體系結(jié)構(gòu)[包含爬行模塊、排序模塊、更新模塊、本地頁面集、待爬行URL集以及本地頁面URL集。1.4.4DeepWeb爬蟲Web頁面按存在方式可以分為表層網(wǎng)頁(SurfaceWeb)和深層網(wǎng)頁(DeepWeb,也稱InvisibleWebPages或HiddenWeb)。表層網(wǎng)頁是指傳統(tǒng)搜索引擎可以索引的頁面,以超鏈接可以到達(dá)的靜態(tài)網(wǎng)頁為主構(gòu)成的Web頁面。DeepWeb是那些大部分內(nèi)容不能通過靜態(tài)鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關(guān)鍵詞才能獲得的Web頁面。例如那些用戶注冊后內(nèi)容才可見的網(wǎng)頁就屬于DeepWeb。2000年BrightPlanet指出:DeepWeb中可訪問信息容量是SurfaceWeb的幾百倍,是互聯(lián)網(wǎng)上最大、發(fā)展最快的新型信息資源。1.5發(fā)展趨勢目前,大多數(shù)的搜索引擎都是基于關(guān)鍵詞的搜索引擎。基于關(guān)鍵字匹配的搜索技術(shù)有較大的局限性:首先,它不能區(qū)分同形異義。其次,不能聯(lián)想到關(guān)鍵字的同義詞。Web商業(yè)化至今,搜索引擎始終保持著網(wǎng)絡(luò)上被使用最多的服務(wù)項目的地位,然而,隨著網(wǎng)上內(nèi)容的爆炸式增長和內(nèi)容形式花樣的不斷翻新,搜索引擎越來越不能滿足挑剔的網(wǎng)民們的各種信息需求。搜索引擎的發(fā)展面臨著兩大難題:一是如何跟上Internet的發(fā)展速度,二是如何為用戶提供更精確的查詢結(jié)果。所以,傳統(tǒng)的引擎不能適應(yīng)信息技術(shù)的高速發(fā)展,新一代智能搜索引擎作為一種高效搜索引擎技術(shù)的在當(dāng)今的網(wǎng)絡(luò)信息時代日益引起業(yè)界人士的關(guān)注。搜索引擎己成為一個新的研究、開發(fā)領(lǐng)域。因為它要用到信息檢索、人工智能、計算機(jī)網(wǎng)絡(luò)、分布式處理、數(shù)據(jù)庫、數(shù)據(jù)挖掘、數(shù)字圖書館、自然語言處理等多領(lǐng)域的理論和技術(shù),所以具有綜合性和挑戰(zhàn)性。又由于搜索引擎有大量的用戶,有很好的經(jīng)濟(jì)價值,所以引起了世界各國計算機(jī)科學(xué)界和信息產(chǎn)業(yè)界的高度關(guān)注,目前的研究、開發(fā)十分活躍,并出現(xiàn)了很多值得注意的動向。二.環(huán)境需求及配置2.1Java版本及配置圖1Java版本號圖2Java配置一圖3Java配置二圖4Java配置三2.2Eclipse配置下載Eclipse壓縮包,并將Eclipse壓縮包解壓圖5解壓后2.3Maven配置下載maven的bin,在apache官方網(wǎng)站可以下載。版本類型下載下來之后,解壓,找個路徑放進(jìn)去,把bin的位置設(shè)在環(huán)境變量里,新建環(huán)境變量MAVEN_HOME圖6環(huán)境變量配置一在PATH里加入maven的bin的路徑圖7環(huán)境變量配置二配置完畢后,在Windows命令提示符下,輸入mvn-v測試一下,配置成功顯示如圖:圖8配置成功配置成功后開始在Eclipse中配置Maven,點擊eclipse菜單欄Help->EclipseMarketplace搜索關(guān)鍵字maven到插件MavenIntegrationforEclipse并點擊安裝即可,如下圖:圖9在Eclipse中配置maven重啟后,為了使得Eclipse中安裝的Maven插件,同windows中安裝的那個相同,需要讓eclipse中的maven重新定位一下,點擊Window->Preference->Maven->Installation->Add進(jìn)行設(shè)置圖10配置二三.網(wǎng)絡(luò)爬蟲模型的具體設(shè)計3.1框架webmagicWebMagic概覽WebMagic項目代碼分為核心和擴(kuò)展兩部分。核心部分(webmagic-core)是一個精簡的、模塊化的爬蟲實現(xiàn),而擴(kuò)展部分則包括一些便利的、實用性的功能。WebMagic的架構(gòu)設(shè)計參照了Scrapy,目標(biāo)是盡量的模塊化,并體現(xiàn)爬蟲的功能特點。Webmagic總體架構(gòu)WebMagic的結(jié)構(gòu)分為Downloader、PageProcessor、Scheduler、Pipeline四大組件,并由Spider將它們彼此組織起來。這四大組件對應(yīng)爬蟲生命周期中的下載、處理、管理和持久化等功能。WebMagic的設(shè)計參考了Scapy,但是實現(xiàn)方式更Java化一些。而Spider則將這幾個組件組織起來,讓它們可以互相交互,流程化的執(zhí)行,可以認(rèn)為Spider是一個大的容器,它也是WebMagic邏輯的核心。WebMagic總體架構(gòu)圖如下:圖11WebMagic總體架構(gòu)Webmagic項目組成WebMagic項目代碼包括幾個部分,在根目錄下以不同目錄名分開。它們都是獨(dú)立的Maven項目。主要部分WebMagic主要包括兩個包,這兩個包經(jīng)過廣泛實用,已經(jīng)比較成熟:webmagic-corewebmagic-core是WebMagic核心部分,只包含爬蟲基本模塊和基本抽取器。WebMagic-core的目標(biāo)是成為網(wǎng)頁爬蟲的一個教科書般的實現(xiàn)。webmagic-extensionwebmagic-extension是WebMagic的主要擴(kuò)展模塊,提供一些更方便的編寫爬蟲的工具。包括注解格式定義爬蟲、JSON、分布式等支持。外圍功能除此之外,WebMagic項目里還有幾個包,這些都是一些實驗性的功能,目的只是提供一些與外圍工具整合的樣例。因為精力有限,這些包沒有經(jīng)過廣泛的使用和測試,推薦使用方式是自行下載源碼,遇到問題后再修改。webmagic-samples這里是作者早期編寫的一些爬蟲的例子。因為時間有限,這些例子有些使用的仍然是老版本的API,也可能有一些因為目標(biāo)頁面的結(jié)構(gòu)變化不再可用了。最新的、精選過的例子,請看webmaigc-core的包和webmaigc-core的us.co包webmagic-scriptsWebMagic對于爬蟲規(guī)則腳本化的一些嘗試,目標(biāo)是讓開發(fā)者脫離Java語言,來進(jìn)行簡單、快速的開發(fā)。同時強(qiáng)調(diào)腳本的共享。webmagic-seleniumWebmMgic與Selenium結(jié)合的模塊。Selenium是一個模擬瀏覽器進(jìn)行頁面渲染的工具,WebMagic依賴Selenium進(jìn)行動態(tài)頁面的抓取。webmagic-saxonWebMagic與Saxon結(jié)合的模塊。Saxon是一個XPath、XSLT的解析工具,webmagic依賴Saxon來進(jìn)行XPath2.0語法解析支持。webmagic-avalonwebmagic-avalon是一個特殊的項目,它想基于WebMagic實現(xiàn)一個產(chǎn)品化的工具,涵蓋爬蟲的創(chuàng)建、爬蟲的管理等后臺工具。3.2網(wǎng)頁搜索策略廣度優(yōu)先搜索策略是指在抓取過程中,在完成當(dāng)前層次的搜索后,才進(jìn)行下一層次的搜索。該算法的設(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)頁過濾掉。這些方法的缺點在于,隨著抓取網(wǎng)頁的增多,大量的無關(guān)網(wǎng)頁將被下載并過濾,算法的效率將變低。拓?fù)浞治鏊惴ɑ诰W(wǎng)頁之間的鏈接,通過已知的網(wǎng)頁或數(shù)據(jù),來對與其有直接或間接鏈接關(guān)系的對象(可以是網(wǎng)頁或網(wǎng)站等)作出評價的算法。又分為網(wǎng)頁粒度、網(wǎng)站粒度和網(wǎng)頁塊粒度這三種。1網(wǎng)頁(Webpage)粒度的分析算法PageRank和HITS算法是最常見的鏈接分析算法,兩者都是通過對網(wǎng)頁間鏈接度的遞歸和規(guī)范化計算,得到每個網(wǎng)頁的重要度評價。PageRank算法雖然考慮了用戶訪問行為的隨機(jī)性和Sink網(wǎng)頁的存在,但忽略了絕大多數(shù)用戶訪問時帶有目的性,即網(wǎng)頁和鏈接與查詢主題的相關(guān)性。針對這個問題,HITS算法提出了兩個關(guān)鍵的概念:權(quán)威型網(wǎng)頁(authority)和中心型網(wǎng)頁(hub)。基于鏈接的抓取的問題是相關(guān)頁面主題團(tuán)之間的隧道現(xiàn)象,即很多在抓取路徑上偏離主題的網(wǎng)頁也指向目標(biāo)網(wǎng)頁,局部評價策略中斷了在當(dāng)前路徑上的抓取行為。文獻(xiàn)[21]提出了一種基于反向鏈接(BackLink)的分層式上下文模型(ContextModel),用于描述指向目標(biāo)網(wǎng)頁一定物理跳數(shù)半徑內(nèi)的網(wǎng)頁拓?fù)鋱D的中心Layer0為目標(biāo)網(wǎng)頁,將網(wǎng)頁依據(jù)指向目標(biāo)網(wǎng)頁的物理跳數(shù)進(jìn)行層次劃分,從外層網(wǎng)頁指向內(nèi)層網(wǎng)頁的鏈接稱為反向鏈接。2網(wǎng)站粒度的分析算法網(wǎng)站粒度的資源發(fā)現(xiàn)和管理策略也比網(wǎng)頁粒度的更簡單有效。網(wǎng)站粒度的爬蟲抓取的關(guān)鍵之處在于站點的劃分和站點等級(SiteRank)的計算。SiteRank的計算方法與PageRank類似,但是需要對網(wǎng)站之間的鏈接作一定程度抽象,并在一定的模型下計算鏈接的權(quán)重。網(wǎng)站劃分情況分為按域名劃分和按IP地址劃分兩種。文獻(xiàn)[18]討論了在分布式情況下,通過對同一個域名下不同主機(jī)、服務(wù)器的IP地址進(jìn)行站點劃分,構(gòu)造站點圖,利用類似PageRank的方法評價SiteRank。同時,根據(jù)不同文件在各個站點上的分布情況,構(gòu)造文檔圖,結(jié)合SiteRank分布式計算得到DocRank。文獻(xiàn)[18]證明,利用分布式的SiteRank計算,不僅大大降低了單機(jī)站點的算法代價,而且克服了單獨(dú)站點對整個網(wǎng)絡(luò)覆蓋率有限的缺點。附帶的一個優(yōu)點是,常見PageRank造假難以對SiteRank進(jìn)行欺騙。3網(wǎng)頁塊粒度的分析算法在一個頁面中,往往含有多個指向其他頁面的鏈接,這些鏈接中只有一部分是指向主題相關(guān)網(wǎng)頁的,或根據(jù)網(wǎng)頁的鏈接錨文本表明其具有較高重要性。但是,在PageRank和HITS算法中,沒有對這些鏈接作區(qū)分,因此常常給網(wǎng)頁分析帶來廣告等噪聲鏈接的干擾。在網(wǎng)頁塊級別(Blocklevel)進(jìn)行鏈接分析的算法的基本思想是通過VIPS網(wǎng)頁分割算法將網(wǎng)頁分為不同的網(wǎng)頁塊(pageblock),然后對這些網(wǎng)頁塊建立pagetoblock和blocktopage的鏈接矩陣,分別記為Z和X。于是,在pagetopage圖上的網(wǎng)頁塊級別的PageRank為?Wp=X×Z;在blocktoblock圖上的BlockRank為Wb=Z×X。已經(jīng)有人實現(xiàn)了塊級別的PageRank和HITS算法,并通過實驗證明,效率和準(zhǔn)確率都比傳統(tǒng)的對應(yīng)算法要好。3.2.2網(wǎng)頁內(nèi)容分析算法基于網(wǎng)頁內(nèi)容的分析算法指的是利用網(wǎng)頁內(nèi)容(文本、數(shù)據(jù)等資源)特征進(jìn)行的網(wǎng)頁評價。網(wǎng)頁的內(nèi)容從原來的以超文本為主,發(fā)展到后來動態(tài)頁面(或稱為HiddenWeb)數(shù)據(jù)為主,后者的數(shù)據(jù)量約為直接可見頁面數(shù)據(jù)(PIW,PubliclyIndexableWeb)的400~500倍。另一方面,多媒體數(shù)據(jù)、WebService等各種網(wǎng)絡(luò)資源形式也日益豐富。因此,基于網(wǎng)頁內(nèi)容的分析算法也從原來的較為單純的文本檢索方法,發(fā)展為涵蓋網(wǎng)頁數(shù)據(jù)抽取、機(jī)器學(xué)習(xí)、數(shù)據(jù)挖掘、語義理解等多種方法的綜合應(yīng)用。本節(jié)根據(jù)網(wǎng)頁數(shù)據(jù)形式的不同,將基于網(wǎng)頁內(nèi)容的分析算法,歸納以下三類:第一種針對以文本和超鏈接為主的無結(jié)構(gòu)或結(jié)構(gòu)很簡單的網(wǎng)頁;第二種針對從結(jié)構(gòu)化的數(shù)據(jù)源(如RDBMS)動態(tài)生成的頁面,其數(shù)據(jù)不能直接批量訪問;第三種針對的數(shù)據(jù)界于第一和第二類數(shù)據(jù)之間,具有較好的結(jié)構(gòu),顯示遵循一定模式或風(fēng)格,且可以直接訪問。基于文本的網(wǎng)頁分析算法1)純文本分類與聚類算法很大程度上借用了文本檢索的技術(shù)。文本分析算法可以快速有效的對網(wǎng)頁進(jìn)行分類和聚類,但是由于忽略了網(wǎng)頁間和網(wǎng)頁內(nèi)部的結(jié)構(gòu)信息,很少單獨(dú)使用。2)超文本分類和聚類算法根據(jù)網(wǎng)頁鏈接網(wǎng)頁的相關(guān)類型對網(wǎng)頁進(jìn)行分類,依靠相關(guān)聯(lián)的網(wǎng)頁推測該網(wǎng)頁的類型3.3爬行策略下述的三種網(wǎng)絡(luò)特征,造成了設(shè)計網(wǎng)頁爬蟲抓取策略變得很難:它巨大的數(shù)據(jù)量;它快速的更新頻率;
動態(tài)頁面的產(chǎn)生它們?nèi)齻€特征一起產(chǎn)生了很多種類的爬蟲抓取鏈接。巨大的數(shù)據(jù)量暗示了爬蟲,在給定的時間內(nèi),只可以抓取所下載網(wǎng)絡(luò)的一部分,所以,它需要對它的抓取頁面設(shè)置優(yōu)先級;快速的更新頻率說明在爬蟲抓取下載某網(wǎng)站一個網(wǎng)頁的時候,很有可能在這個站點又有新的網(wǎng)頁被添加進(jìn)來,或者這個頁面被更新或者刪除了。最近新增的很多頁面都是通過服務(wù)器端腳本語言產(chǎn)生的,無窮的參數(shù)組合也增加了爬蟲抓取的難度,只有一小部分這種組合會返回一些獨(dú)特的內(nèi)容。例如,一個很小照片存儲庫僅僅通過get方式可能提供就給用戶三種操作方式。如果這里存著四種分類方式,三種縮略圖方式,兩種文件格式,和一個禁止用戶提供內(nèi)容的選項,那么,同樣的內(nèi)容就可以通過48種方式訪問。這種數(shù)學(xué)組合給網(wǎng)絡(luò)爬蟲創(chuàng)造的難處就是,為了獲取不同的內(nèi)容,他們必須篩選無窮僅有微小變化的組合。正如愛德華等人所說的:“用于檢索的帶寬不是無限的,也不是免費(fèi)的;所以,如果引入衡量爬蟲抓取質(zhì)量或者新鮮度的有效指標(biāo)的話,不但伸縮性,連有效性都將變得十分必要”(愛德華等人,2001年)。一個爬蟲就必須小心的選擇下一步要訪問什么頁面。網(wǎng)頁爬蟲的行為通常是四種策略組合的結(jié)果。?選擇策略,決定所要下載的頁面;?重新訪問策略,決定什么時候檢查頁面的更新變化;?平衡禮貌策略,指出怎樣避免站點超載;?并行策略,指出怎么協(xié)同達(dá)到分布式抓取的效果;選擇策略:就現(xiàn)在網(wǎng)絡(luò)資源的大小而言,即使很大的搜索引擎也只能獲取網(wǎng)絡(luò)上可得到資源的一小部分。由勞倫斯河蓋爾斯共同做的一項研究指出,沒有一個搜索引擎抓取的內(nèi)容達(dá)到網(wǎng)絡(luò)的16%(勞倫斯河蓋爾斯,2001)。網(wǎng)絡(luò)爬蟲通常僅僅下載網(wǎng)頁內(nèi)容的一部分,但是大家都還是強(qiáng)烈要求下載的部分包括最多的相關(guān)頁面,而不僅僅是一個隨機(jī)的簡單的站點。這就要求一個公共標(biāo)準(zhǔn)來區(qū)分網(wǎng)頁的重要程度,一個頁面的重要程度與他自身的質(zhì)量有關(guān),與按照鏈接數(shù)、訪問數(shù)得出的受歡迎程度有關(guān),甚至與他本身的網(wǎng)址(后來出現(xiàn)的把搜索放在一個頂級域名或者一個固定頁面上的垂直搜索)有關(guān)。設(shè)計一個好的搜索策略還有額外的困難,它必須在不完全信息下工作,因為整個頁面的集合在抓取時是未知的。Cho等人(Choetal,1998)做了第一份抓取策略的研究。他們的數(shù)據(jù)是斯坦福大學(xué)網(wǎng)站中的18萬個頁面,使用不同的策略分別模仿抓取。排序的方法使用了廣度優(yōu)先,后鏈計數(shù),和部分pagerank算法。計算顯示,如果你想要優(yōu)先下載pagerank高的頁面,那么,部分PageRank策略是比較好的,其次是廣度優(yōu)先和后鏈計數(shù)。并且,這樣的結(jié)果僅僅是針對一個站點的。Najork和Wiener(NajorkandWiener,2001)采用實際的爬蟲,對3.28億個網(wǎng)頁,采用廣度優(yōu)先研究。他們發(fā)現(xiàn)廣度優(yōu)先會較早的抓到PageRank高的頁面(但是他們沒有采用其他策略進(jìn)行研究)。作者給出的解釋是:“最重要的頁面會有很多的主機(jī)連接到他們,并且那些鏈接會較早的發(fā)現(xiàn),而不用考慮從哪一個主機(jī)開始。”Abiteboul(Abiteboul等人,2003),設(shè)計了一種基于OPIC(在線頁面重要指數(shù))的抓取戰(zhàn)略。在OPIC中,每一個頁面都有一個相等的初始權(quán)值,并把這些權(quán)值平均分給它所指向的頁面。這種算法與Pagerank相似,但是他的速度很快,并且可以一次完成。OPIC的程序首先抓取獲取權(quán)值最大的頁面,實驗在10萬個冪指分布的模擬頁面中進(jìn)行。并且,實驗沒有和其它策略進(jìn)行比較,也沒有在真正的WEB頁面測試。Boldi等人(Boldietal.,2004)的模擬檢索實驗進(jìn)行在從.it網(wǎng)絡(luò)上取下的4000萬個頁面和從webbase得到的1億個頁面上,測試廣度優(yōu)先和深度優(yōu)先,隨機(jī)序列和有序序列。比較的基礎(chǔ)是真實頁面pageRank值和計算出來的pageRank值的接近程度。令人驚奇的是,一些計算pageRank很快的頁面(特別明顯的是廣度優(yōu)先策略和有序序列)僅僅可以達(dá)到很小的接近程度。Baeza-Yates等人(Baeza-Yatesetal.,2005)在從.gr域名和.cl域名子網(wǎng)站上獲取的300萬個頁面上模擬實驗,比較若干個抓取策略。結(jié)果顯示OPIC策略和站點隊列長度,都比廣度優(yōu)先要好;并且如果可行的話,使用之前的爬行抓取結(jié)果來指導(dǎo)這次抓取,總是十分有效的。Daneshpajouh等人(Daneshpajouhetal.,2008)設(shè)計了一個用于尋找好種子的社區(qū)。它們從來自不同社區(qū)的高PageRank頁面開始檢索的方法,迭代次數(shù)明顯小于使用隨機(jī)種子的檢索。使用這種方式,可以從以前抓取頁面之中找到好的種子,使用這些種子是十分有效的。限定訪問鏈接一個爬蟲可能僅僅想找到html頁面的種子而避免其他的文件類型。為了僅僅得到html的資源,一個爬蟲可以首先做一個httphead的請求,以在使用request方法獲取所有的資源之前,決定這個網(wǎng)絡(luò)文件的類型。為了避免要發(fā)送過多的head請求,爬蟲可以交替的檢查url并且僅僅對以html,htm和反斜杠結(jié)尾的文件發(fā)送資源請求。這種策略會導(dǎo)致很多的html資源在無意中錯過,一種相似的策略是將網(wǎng)絡(luò)資源的擴(kuò)展名同已知是html文件類型的一組擴(kuò)展名(如.html,.htm,.asp,.php,.aspx,反斜杠)進(jìn)行比較。一些爬蟲也會限制對任何含有“?”的資源(這些是動態(tài)生成的)進(jìn)行獲取請求,以避免蜘蛛爬行在某一個站點中陷入下載無窮無盡的URL的困境。路徑檢索一些爬蟲會盡可能多的嘗試下載一個特定站點的資源。Cothey(Cothey,2004)引入了一種路徑檢索的爬蟲,它會嘗試抓取需要檢索資源的所有URL。例如,給定一個種子地址:它將會嘗試檢索/hamster/menkey/,/hamster/和/。Cothey發(fā)現(xiàn)路徑檢索對發(fā)現(xiàn)獨(dú)立資源,或者一些通常爬蟲檢索不到的的連接是非常有效的。一些路徑檢索的爬蟲也被稱為收割機(jī)軟件,因為他們通常用于收割或者收集所有的內(nèi)容,可能是從特定的頁面或者主機(jī)收集相冊的照片。聚焦抓取爬蟲所抓取頁面的重要程度也可以表述成它與給定查詢之間相似程度的函數(shù)。網(wǎng)絡(luò)爬蟲嘗試下載相似頁面,可以稱為聚焦檢索或者主題檢索。關(guān)于主題檢索和聚焦檢索的概念,最早是由Menczer(Menczer1997;MenczerandBelew,1998)和Chakrabarti等人首先提出來的(Chakrabartietal.,1999)。聚焦檢索的主要問題是網(wǎng)頁爬蟲的使用環(huán)境,我們希望在實際下載頁面之前,就可以知道給定頁面和查詢之間的相似度。一個可能的方法就是在鏈接之中設(shè)置錨點,這就是在早期時候,Pinkerton(Pinkerton,1994)曾經(jīng)在一個爬蟲中采用的策略。Diligenti等人(Diligenti等人,2000)建議使用已經(jīng)抓取頁面的內(nèi)容去推測查詢和未訪問頁的相似度。一個聚焦查詢的表現(xiàn)的好壞主要依賴于查詢主題內(nèi)容的豐富程度,通常還會依賴頁面查詢引擎提供的查詢起點。抓取深層的網(wǎng)頁很多的頁面隱藏的很深或隱藏在在看不到的網(wǎng)絡(luò)之中。這些頁面通常只有在向數(shù)據(jù)庫提交查詢的時候才可以訪問到,如果沒有鏈接指向他們的話,一般的爬蟲是不能訪問到這些頁面的。谷歌站點地圖協(xié)議和modoai(Nelson等人,2005)嘗試允許發(fā)現(xiàn)這些深層次的資源。深層頁面抓取器增加了抓取網(wǎng)頁的鏈接數(shù)。一些爬蟲僅僅抓取形如<ahref=”url”鏈接。某些情況下,例如Googlebot,WEB抓取的是所有超文本所包含的內(nèi)容,標(biāo)簽和文本。WEB3.0檢索Web3.0為下一代搜索技術(shù)定義了更先進(jìn)的技術(shù)和新的準(zhǔn)則,可以概括為語義網(wǎng)絡(luò)和網(wǎng)站模板解析的概念。第三代檢索技術(shù)將建立在人機(jī)巧妙的聯(lián)系的基礎(chǔ)上。重新訪問策略網(wǎng)絡(luò)具有動態(tài)性很強(qiáng)的特性。抓取網(wǎng)絡(luò)上的一小部分內(nèi)容可能會花費(fèi)真的很長的時間,通常用周或者月來衡量。當(dāng)爬蟲完成它的抓取的任務(wù)以后,很多操作是可能會發(fā)生的,這些操作包括新建,更新和刪除。從搜索引擎的角度來看,不檢測這些事件是有成本的,成本就是我們僅僅擁有一份過時的資源。最常使用的成本函數(shù),是新鮮度和過時性(2000年,Cho和Garcia-Molina)新鮮度:這是一個衡量抓取內(nèi)容是不是準(zhǔn)確的二元值。在時間t內(nèi),倉庫中頁面p的新鮮度是這樣定義的:新鮮度過時性:這是一個衡量本地已抓取的內(nèi)容過時程度的指標(biāo)。在時間t時,倉庫中頁面p的時效性的定義如下:過時性在頁面抓取中,新鮮度和過時性的發(fā)展Coffman等人(EdwardG.Coffman,1998)是從事爬蟲對象定義的,他們提出了一個相當(dāng)于新鮮度的概念,但是使用了不同的措詞:他們建議爬蟲必須最小化過時頁面部分。他們指出網(wǎng)絡(luò)爬行的問題就相當(dāng)于多個隊列,一個投票系統(tǒng);這里,爬蟲是服務(wù)器,不同的站點是隊列。頁面修改是到達(dá)的顧客,頁面切換的時間是頁面進(jìn)入一個單一站點的間隔。在這個模型下,每一個顧客在投票系統(tǒng)的平均時間,相當(dāng)于爬蟲的平均過時性。爬蟲的目標(biāo)是盡可能高的提高頁面的新鮮度,同時降低頁面的過時性。這一目標(biāo)并不是完全一樣的,第一種情況,爬蟲關(guān)心的是有多少頁面時過時的;在第二種情況,爬蟲關(guān)心的頁面過時了多少。兩種最簡單的重新訪問策略是由Cho和Garcia-Molina研究的(Cho和Garcia-Molina,2003):統(tǒng)一策略:使用相同的頻率,重新訪問收藏中的所有的鏈接,而不考慮他們更新頻率。正比策略:對變化越多的網(wǎng)頁,重新訪問的頻率也越高。網(wǎng)頁訪問的頻率和網(wǎng)頁變化的頻率直接相關(guān)。(兩種情況下,爬蟲的重新抓取都可以采用隨機(jī)方式,或者固定的順序)Cho和Garcia-Molina證明了一個出人意料的結(jié)果。以平均新鮮度方式衡量,統(tǒng)一策略在模擬頁面和真實的網(wǎng)絡(luò)抓取中都比正比策略出色。對于這種結(jié)果的解釋是:當(dāng)一個頁面變化太快的時候,爬蟲將會將會在不斷的嘗試重新抓取而浪費(fèi)很多時間,但是卻還是不能保證頁面的新鮮度。為了提高頁面的新鮮度,我們應(yīng)該宣判變化太快的頁面死罪(Cho和Garcia-Molina,2003a)。最佳的重新訪問策略既不是統(tǒng)一策略,也不是正比策略;保持平均頁面新鮮度高的最佳方法策略包括忽略那些變化太快的頁面,而保持頁面平均過時性低的方法則是對每一頁按照頁面變化率單調(diào)變化的策略訪問。兩種情況下,最佳的策略較正比策略,都更接近統(tǒng)一策略。正如Coffman等人(EdwardG.Coffman,1998)所注意到的:“為了最小化頁面過時的時間,對任一個頁面的訪問都應(yīng)該盡可能的均勻間隔地訪問。”對于重新訪問的詳盡的策略在大體上是不可以達(dá)到的,但是他們可以從數(shù)學(xué)上得到,因為他們依賴于頁面的變化。(Cho和Garcia-Molina,2003a)指出指數(shù)變化是描述頁面變化的好方法,同時(Ipeirotis等人,2005)指出了怎么使用統(tǒng)計工具去發(fā)現(xiàn)適合這些變化的參數(shù)。注意在這里的重新訪問策略認(rèn)為每一個頁面都是相同的(網(wǎng)絡(luò)上所有的頁面價值都是一樣的)這不是現(xiàn)實的情況,所以,為了獲取更好的抓取策略,更多有關(guān)網(wǎng)頁質(zhì)量的信息應(yīng)該考慮進(jìn)去。平衡禮貌策略爬蟲相比于人,可以有更快的檢索速度和更深的層次,所以,他們可能使一個站點癱瘓。不需要說一個單獨(dú)的爬蟲一秒鐘要執(zhí)行多條請求,下載大的文件。一個服務(wù)器也會很難響應(yīng)多線程爬蟲的請求。就像Koster(Koster,1995)所注意的那樣,爬蟲的使用對很多工作都是很有用的,但是對一般的社區(qū),也需要付出代價。使用爬蟲的代價包括:網(wǎng)絡(luò)資源:在很長一段時間,爬蟲使用相當(dāng)?shù)膸捀叨炔⑿械毓ぷ鳌7?wù)器超載:尤其是對給定服務(wù)器的訪問過高時。質(zhì)量糟糕的爬蟲,可能導(dǎo)致服務(wù)器或者路由器癱瘓,或者會嘗試下載自己無法處理的頁面。個人爬蟲,如果過多的人使用,可能導(dǎo)致網(wǎng)絡(luò)或者服務(wù)器阻塞。對這些問題的一個部分解決方法是漫游器排除協(xié)議(Robotsexclusionprotocol),也被稱為robots.txt議定書(Koster,1996),這份協(xié)議對于管理員指明網(wǎng)絡(luò)服務(wù)器的那一部分不能到達(dá)是一個標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)沒有包括重新訪問一臺服務(wù)器的間隔的建議,雖然訪問間隔是避免服務(wù)器超載的最有效的辦法。最近的商業(yè)搜索軟件,如AskJeeves,MSN和Yahoo可以在robots.txt中使用一個額外的“Crawl-delay”參數(shù)來指明請求之間的延遲。對連接間隔時間的第一個建議由Koster1993年給出,時間是60秒。按照這個速度,如果一個站點有超過10萬的頁面,即使我們擁有零延遲和無窮帶寬的完美連接,它也會需要兩個月的時間來下載整個站點,并且,這個服務(wù)器中的資源,只有一小部分可以使用。這似乎是不可以接受的。Cho(Cho和Garcia-Molina,2003)使用10秒作為訪問的間隔時間,WIRE爬蟲(Baeza-YatesandCastillo,2002)使用15秒作為默認(rèn)間隔。MercatorWeb(Heydon和Najork,1999)爬蟲使用了一種自適應(yīng)的平衡策略:如果從某一服務(wù)器下載一個文檔需要t秒鐘,爬蟲就等待10t秒的時間,然后開始下一個頁面。Dill等人(Dilletal.,2002)使用1秒。對于那些使用爬蟲用于研究目的的,一個更詳細(xì)的成本-效益分析是必要的,當(dāng)決定去哪一個站點抓取,使用多快的速度抓取的時候,倫理的因素也需要考慮進(jìn)來。訪問記錄顯示已知爬蟲的訪問間隔從20秒鐘到3-4分鐘不等。需要注意的是即使很禮貌,采取了所有的安全措施來避免服務(wù)器超載,還是會引來一些網(wǎng)絡(luò)服務(wù)器管理員的抱怨的。Brin和Page注意到:運(yùn)行一個針對超過50萬服務(wù)器的爬蟲,會產(chǎn)生很多的郵件和電話。這是因為有無數(shù)的人在上網(wǎng),而這些人不知道爬蟲是什么,因為這是他們第一次見到。(Brin和Page,1998)并行策略一個并行爬蟲是并行運(yùn)行多個進(jìn)程的爬蟲。它的目標(biāo)是最大化下載的速度,同時盡量減少并行的開銷和下載重復(fù)的頁面。為了避免下載一個頁面兩次,爬蟲系統(tǒng)需要策略來處理爬蟲運(yùn)行時新發(fā)現(xiàn)的URL,因為同一個URL地址,可能被不同的爬蟲進(jìn)程抓到。3.4爬蟲的配置第一部分關(guān)于爬蟲的配置,包括編碼、抓取間隔、超時時間、重試次數(shù)等,也包括一些模擬的參數(shù),例如UserAgent、cookie,以及代理的設(shè)置Spider是爬蟲啟動的入口。在啟動爬蟲之前,我們需要使用一個PageProcessor創(chuàng)建一個Spider對象,然后使用run()進(jìn)行啟動。同時Spider的其他組件(Downloader、Scheduler、Pipeline)都可以通過set方法來進(jìn)行設(shè)置。表1爬蟲函數(shù)及其功能表方法說明示例create(PageProcessor)創(chuàng)建SpiderSpider.create(newGithubRepoProcessor())addUrl(String…)添加初始的URLspider.addUrl("http://webmagic.io/docs/")addRequest(Request...)添加初始的Requestspider.addRequest("http://webmagic.io/docs/")thread(n)開啟n個線程spider.thread(5)run()啟動,會阻塞當(dāng)前線程執(zhí)行spider.run()start()/runAsync()異步啟動,當(dāng)前線程繼續(xù)執(zhí)行spider.start()stop()停止爬蟲spider.stop()test(String)抓取一個頁面進(jìn)行測試spider.test("http://webmagic.io/docs/")addPipeline(Pipeline)添加一個Pipeline,一個Spider可以有多個Pipelinespider.addPipeline(newConsolePipeline())setScheduler(Scheduler)設(shè)置Scheduler,一個Spider只能有個一個Schedulerspider.setScheduler(newRedisScheduler())setDownloader(Downloader)設(shè)置Downloader,一個Spider只能有個一個Downloaderspider.setDownloader(newSeleniumDownloader())get(String)同步調(diào)用,并直接取得結(jié)果ResultItemsresult=spider.get("http://webmagic.io/docs/")getAll(String…)同步調(diào)用,并直接取得一堆結(jié)果List<ResultItems>results=spider.getAll("http://webmagic.io/docs/","http://webmagic.io/xxx")對站點本身的一些配置信息,例如編碼、HTTP頭、超時時間、重試策略等、代理等,都可以通過設(shè)置Site對象來進(jìn)行配置。方法說明示例setCharset(String)設(shè)置編碼site.setCharset("utf-8")setUserAgent(String)設(shè)置UserAgentsite.setUserAgent("Spider")setTimeOut(int)設(shè)置超時時間,單位是毫秒site.setTimeOut(3000)setRetryTimes(int)設(shè)置重試次數(shù)site.setRetryTimes(3)setCycleRetryTimes(int)設(shè)置循環(huán)重試次數(shù)site.setCycleRetryTimes(3)addCookie(String,String)添加一條cookiesite.addCookie("dotcomt_user","code4craft")setDomain(String)設(shè)置域名,需設(shè)置域名后,addCookie才可生效site.setDomain("")addHeader(String,String)添加一條addHeadersite.addHeader("Referer","")setHttpProxy(HttpHost)設(shè)置Http代理site.setHttpProxy(newHttpHost("",8080))publicclassAppimplementsPageProcessor{ privateSitesite=Site.me().setSleepTime(1); inttemp=1; //執(zhí)行這個main方法,即可在控制臺看到抓取結(jié)果。webmagic默認(rèn)有3秒抓取間隔,請耐心等待。publicstaticvoidmain(String[]args){ //Spider是爬蟲的入口類,addurl為入口url SpideroschinaSpider=Spider.create(newApp()).addUrl("/CHENYUFENG1991/article/list/1") //Pipeline是結(jié)果輸出和持久化的接口,這里ConsolePipeline表示結(jié)果輸出到控制臺 .addPipeline(newConsolePipeline()); try{ //添加到JMT監(jiān)控中 SpiderMonitor.instance().register(oschinaSpider); //設(shè)置線程數(shù) //oschinaSpider.thread(5); oschinaSpider.run(); }catch(JMExceptione){ e.printStackTrace(); }}3.5頁面元素的抽取第二部分是爬蟲的核心部分:對于下載到的Html頁面,你如何從中抽取到你想要的信息?WebMagic里主要使用了三種抽取技術(shù):XPath、正則表達(dá)式和CSS選擇器。另外,對于JSON格式的內(nèi)容,可使用JsonPath進(jìn)行解析。XPathXPath本來是用于XML中獲取元素的一種查詢語言,但是用于Html也是比較方便的。例如:page.getHtml().xpath("http://h1[@class='entry-titlepublic']/strong/a/text()")這段代碼使用了XPath,它的意思是“查找所有class屬性為'entry-titlepublic'的h1元素,并找到他的strong子節(jié)點的a子節(jié)點,并提取a節(jié)點的文本信息”。對應(yīng)的Html是這樣子的:圖12html導(dǎo)航CSS選擇器CSS選擇器是與XPath類似的語言。如果大家做過前端開發(fā),肯定知道$('h1.entry-title')這種寫法的含義。客觀的說,它比XPath寫起來要簡單一些,但是如果寫復(fù)雜一點的抽取規(guī)則,就相對要麻煩一點。正則表達(dá)式正則表達(dá)式則是一種通用的文本抽取語言。page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());這段代碼就用到了正則表達(dá)式,它表示匹配所有"/code4craft/webmagic"這樣的鏈接。JsonPath是于XPath很類似的一個語言,它用于從Json中快速定位一條內(nèi)容。WebMagic中使用的JsonPath格式可以參考這里:3.6鏈接的發(fā)現(xiàn)有了處理頁面的邏輯,我們的爬蟲就接近完工了!但是現(xiàn)在還有一個問題:一個站點的頁面是很多的,一開始我們不可能全部列舉出來,于是如何發(fā)現(xiàn)后續(xù)的鏈接,是一個爬蟲不可缺少的一部分。page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all());這段代碼的分為兩部分,page.getHtml().links().regex("(https://github\\.com/\\w+/\\w+)").all()用于獲取所有滿足"(https://github\.com/\w+/\w+)"這個正則表達(dá)式的鏈接,page.addTargetRequests()則將這些鏈接加入到待抓取的隊列中去。3.7具體代碼實現(xiàn)CsdnblogPageProcessor.javapackagecom.xf.cs.en.DB;importjava.util.List;importus.codecraft.webmagic.Page;importus.codecraft.webmagic.Site;importus.codecraft.webmagic.Spider;importcessor.PageProcessor;/***CSDN博客爬蟲**可以爬取指定用戶的csdn博客所有文章,并保存到數(shù)據(jù)庫中。*/publicclassCsdnBlogPageProcessorimplementsPageProcessor{ privatestaticStringusername="CHENYUFENG1991";//設(shè)置csdn用戶名 privatestaticintsize=0;//共抓取到的文章數(shù)量 //抓取網(wǎng)站的相關(guān)配置,包括:編碼、抓取間隔、重試次數(shù)等 privateSitesite=Site.me().setRetryTimes(3).setSleepTime(1000); publicSitegetSite(){ returnsite; } //process是定制爬蟲邏輯的核心接口,在這里編寫抽取邏輯 publicvoidprocess(Pagepage){ //列表頁 if(!page.getUrl().regex("http://blog\\.csdn\\.net/"+username+"/article/details/\\d+").match()){ //添加所有文章頁 page.addTargetRequests(page.getHtml().xpath("http://div[@id='article_list']").links()//限定文章列表獲取區(qū)域 .regex("/"+username+"/article/details/\\d+") .replace("/"+username+"/","/"+username+"/")//巧用替換給把相對url轉(zhuǎn)換成絕對url .all()); //添加其他列表頁 page.addTargetRequests(page.getHtml().xpath("http://div[@id='papelist']").links()//限定其他列表頁獲取區(qū)域 .regex("/"+username+"/article/list/\\d+") .replace("/"+username+"/","/"+username+"/")//巧用替換給把相對url轉(zhuǎn)換成絕對url .all()); //文章頁 }else{ size++;//文章數(shù)量加1 //用CsdnBlog類來存抓取到的數(shù)據(jù),方便存入數(shù)據(jù)庫 CsdnBlogcsdnBlog=newCsdnBlog(); //設(shè)置編號 csdnBlog.setKey(Integer.parseInt( page.getUrl().regex("http://blog\\.csdn\\.net/"+username+"/article/details/(\\d+)").get())); //設(shè)置標(biāo)題 csdnBlog.setTitle( page.getHtml().xpath("http://div[@class='article_title']//span[@class='link_title']/a/text()").get()); //設(shè)置內(nèi)容 csdnBlog.setContent( page.getHtml().xpath("http://div[@class='article_content']/allText()").get()); //設(shè)置日期 csdnBlog.setDate( page.getHtml().xpath("http://div[@class='article_r']/span[@class='link_postdate']/text()").get()); //設(shè)置標(biāo)簽(可以有多個,用,來分割) csdnBlog.setTags(listToString(page.getHtml() .xpath("http://div[@class='article_l']/span[@class='link_categories']/a/allText()").all())); //設(shè)置類別(可以有多個,用,來分割) csdnBlog.setCategory( listToString(page.getHtml().xpath("http://div[@class='category_r']/label/span/text()").all())); //設(shè)置閱讀人數(shù) csdnBlog.setView(Integer.parseInt(page.getHtml().xpath("http://div[@class='article_r']/span[@class='link_view']") .regex("(\\d+)人閱讀").get())); //設(shè)置評論人數(shù) csdnBlog.setComments(Integer.parseInt(page.getHtml() .xpath("http://div[@class='article_r']/span[@class='link_comments']").regex("\\((\\d+)\\)").get())); //設(shè)置是否原創(chuàng) csdnBlog.setCopyright(page.getHtml().regex("bog_copyright").match()?1:0); //把對象存入數(shù)據(jù)庫 newCsdnBlogDao().add(csdnBlog); //把對象輸出控制臺 System.out.println(csdnBlog); } } //把list轉(zhuǎn)換為string,用,分割 publicstaticStringlistToString(List<String>stringList){ if(stringList==null){ returnnull; } StringBuilderresult=newStringBuilder(); booleanflag=false; for(Stringstring:stringList){ if(flag){ result.append(","); }else{ flag=true; } result.append(string); } returnresult.toString(); } publicstaticvoidmain(String[]args){ longstartTime,endTime; System.out.println("【爬蟲開始】請耐心等待一大波數(shù)據(jù)到你碗里來..."); startTime=System.currentTimeMillis(); //從用戶博客首頁開始抓,開啟5個線程,啟動爬蟲 Spider.create(newCsdnBlogPageProcessor()).addUrl("/"+username).thread(5).run(); endTime=System.currentTimeMillis(); System.out.println("【爬蟲結(jié)束】共抓取"+size+"篇文章,耗時約"+((endTime-startTime)/1000)+"秒,已保存到數(shù)據(jù)庫,請查收!"); }}App.javapackagecom.xf.cs.en.WebMagic_CSDNdemo;importjava.util.List;importjavax.management.JMException;importus.codecraft.webmagic.Page;importus.codecraft.webmagic.Site;import;importus.codecraft.webmagic.monitor.SpiderMonitor;importus.codecraft.webmagic.pipeline.ConsolePipeline;importcessor.PageProcessor;publicclassAppimplementsPageProcessor{ privateSitesite=Site.me().setSleepTime(1); inttemp=1; //執(zhí)行這個main方法,即可在控制臺看到抓取結(jié)果。webmagic默認(rèn)有3秒抓取間隔,請耐心等待。publicstaticvoidmain(String[]args){ //Spider是爬蟲的入口類,addurl為入口url SpideroschinaSpider=Spider.create(newApp()).addUrl("/CHENYUFENG1991/article/list/1") //Pipeline是結(jié)果輸出和持久化的接口,這里ConsolePipeline表示結(jié)果輸出到控制臺 .addPipeline(newConsolePipeline()); try{ //添加到JMT監(jiān)控中 SpiderMonitor.instance().register(oschinaSpider); //設(shè)置線程數(shù) //oschinaSpider.thread(5); oschinaSpider.run(); }catch(JMExceptione){ e.printStackTrace(); }}//process(過程) publicvoidprocess(Pagepage){ //通過page.putField()來保存抽取結(jié)果 //page.getHtml().xpath()則是按照某個規(guī)則對結(jié)果進(jìn)行抽取,這里抽取支持鏈?zhǔn)秸{(diào)用 List<String>pages=page.getHtml().xpath("[@class='pagelist']").links().all(); if(pages.size()>5){ pages.remove(pages.size()-1); } page.addTargetRequests(pages);//用于獲取所有滿足"(http://blog\\.csdn\\.net/u012012240/article/month/2016/08/\\d+)"這個正則表達(dá)式的鏈接 //區(qū)分是列表頁面還是信息頁面 if(page.getUrl().regex("article/list").match()){ List<String>links=page.getHtml().xpath("[@class='link_title']").links().regex("http://blog\\.csdn\\.net/chenyufeng1991/article/details/\\d+").all(); //通過page.addTargetRequests()方法來增加要抓取的URL page.addTargetRequests(links); }else{ System.out.println("記錄數(shù):"+temp++); page.putField("title",page.getHtml().xpath("http://[@class='link_title']/a/text()").toString()); } } publicSitegetSite(){ returnsite; }}四.導(dǎo)入MySQL數(shù)據(jù)庫4.1MySQL簡介MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQLAB公司開發(fā),目前屬于Oracle旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在WEB應(yīng)用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件。MySQL是一種關(guān)系數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的SQL語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。由于其社區(qū)版的性能卓越,搭配PHP和Apache可組成良好的開發(fā)環(huán)境。4.2MySQL的安裝及配置進(jìn)入MySQL官網(wǎng),進(jìn)入DOWNLOADS,選擇Community,點擊DOWNLOAD圖13MySQL下載1因為5.7版本在windows上使用解壓安裝問題較多,所以我選擇較為穩(wěn)定的5.6版本,選擇5.6圖14MySQL下載2選擇相應(yīng)信息,點擊下載圖15MySQL下載3將安裝包解壓,通過命令來安裝MySQL數(shù)據(jù)庫。首先解壓到\文件下,打開命令提示符以管理員身份運(yùn)行,cd到\bin下命令為:cd/d\bin圖16MySQL安裝1然后安裝MySQLmysqldinstall,運(yùn)行命令后MySQL安裝成功。最后啟動MySQL服務(wù)。netstartmysql將啟動MySQL服務(wù)。值得注意的是用命令安裝的MySQL在Windows系統(tǒng)下默認(rèn)服務(wù)名為mysql,默認(rèn)密碼為空。圖17MySQL安裝2接下來配置環(huán)境變量編輯path系統(tǒng)變量,將\bin添加到path變量。圖18MySQL環(huán)境不變量配置最后進(jìn)入MySQLmysql-uroot-p,密碼默認(rèn)為空。顯示“mysql>”表示進(jìn)入MySQL,可用T-SQL語句對數(shù)據(jù)庫執(zhí)行各種操作。圖19進(jìn)入MySQL4.3安裝MySQLWorkbenchMySQLWorkbench是一款專為MySQL設(shè)計的ER/數(shù)據(jù)庫建模工具。它是著名的數(shù)據(jù)庫設(shè)計工具DBDesigner4的繼任者。你可以用MySQLWorkbench設(shè)計和創(chuàng)建新的數(shù)據(jù)庫圖示,建立數(shù)據(jù)庫文檔,以及進(jìn)行復(fù)雜的MySQL遷移。MySQLWorkbench是下一代的可視化數(shù)據(jù)庫設(shè)計、管理的工具,它同時有開源和商業(yè)化
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融行業(yè)勞動合同范本(4篇)2
- 班主任研討會發(fā)言稿(14篇)
- 小學(xué)綜合實踐活動長春版三年級下冊第5課 設(shè)計汽車標(biāo)志教案
- 《精準(zhǔn)數(shù)據(jù)》課件
- 2025小學(xué)教師繼續(xù)教育學(xué)習(xí)心得體會(5篇)
- 學(xué)習(xí)實踐弟子規(guī)經(jīng)典文化心得體會(3篇)
- 小學(xué)美術(shù)人教版三年級上冊第8課 星空的聯(lián)想教案及反思
- 南京市企業(yè)勞動合同(非全日制)(4篇)
- 房屋租賃合同表范例(16篇)
- 2025年軍訓(xùn)自我鑒定(20篇)
- 控制性詳細(xì)規(guī)劃城市用地分類和代號
- 鐵路專用線設(shè)計規(guī)范(試行)(TB 10638-2019)
- 主題一+鞋子擦洗自己做+第二課時(課件)-甘肅教育出版社勞動三年級+下冊
- ISO 45003-2021職業(yè)健康安全管理-工作中的心理健康安全-社會心理風(fēng)險管理指南(中文版)
- 三年級語文 寫通知(全國一等獎)
- 2020電網(wǎng)技術(shù)改造工程概算定額第五冊調(diào)試工程
- 起重機(jī)機(jī)械金屬結(jié)構(gòu)
- 自然教育課程的追尋與實踐
- 諾如病毒診斷和治療
- 《無人機(jī)攝影測量》考試復(fù)習(xí)題庫(含答案)
- 職業(yè)健康與環(huán)境保護(hù)的重要性
評論
0/150
提交評論