日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

網(wǎng)絡(luò)爬蟲調(diào)研報(bào)告

系統(tǒng) 2182 0

網(wǎng)絡(luò)爬蟲調(diào)研報(bào)告

調(diào)研背景

?????? 項(xiàng)目中要對指定的網(wǎng)絡(luò)資源進(jìn)行抓取、存儲(chǔ)、分類、索引、并提供檢索服務(wù)。充當(dāng)全文檢索數(shù)據(jù)庫的是 Apache 組織下的開源項(xiàng)目 Lucene 檢索工具,而 Lucene 只是個(gè)搜索引擎工具,它提供 API 接口,通過編寫程序?qū)π畔⑦M(jìn)行索引和檢索,在其后臺(tái)需要網(wǎng)絡(luò)爬蟲程序的支持,其目的是通過 網(wǎng)絡(luò)爬蟲軟件抓取網(wǎng)頁,作為提供給 Lucene 搜索引擎的資源,進(jìn)行索引和查詢。

調(diào)研對象

Nutch ? http://nutch.apache.org/

Heritrix ? http://crawler.archive.org/

Nutch

Nutch Apache 基金會(huì)的一個(gè)開源項(xiàng)目,它原本是開源文件索引框架 Lucene 項(xiàng)目的一個(gè)子項(xiàng)目,后來漸漸發(fā)展成長為一個(gè)獨(dú)立的開源項(xiàng)目。它基于 Java 開發(fā),基于 Lucene 框架,提供 Web 網(wǎng)頁爬蟲和搜索引擎兩部分功能。

Nutch 主要分為兩個(gè)部分:網(wǎng)頁爬蟲( Crawler )和搜索引擎( Searcher )。 Crawler 主要用于從網(wǎng)絡(luò)上抓取網(wǎng)頁并為這些網(wǎng)頁建立索引。 Searcher 主要利用這些索引檢索用戶的查找關(guān)鍵詞來產(chǎn)生查找結(jié)果。另外很吸引人的一點(diǎn)在于,它提供了一種插件框架,使得其對各種網(wǎng)頁內(nèi)容的解析、各種數(shù)據(jù)的采集、查詢、集群、過濾等功能能夠方便的進(jìn)行擴(kuò) 展,正是由于有此框架,使得 Nutch 的插件開發(fā)非常容易,第三方的插件也層出不窮,極大的增強(qiáng)了 Nutch 的功能和聲譽(yù)。

爬蟲工作策略

Nutch 爬蟲的工作策略一般則可以分為累積式抓取( cumulative crawling )和增量式抓取( incremental crawling )兩種。

累積式抓取 是指從某一個(gè)時(shí)間點(diǎn)開始,通過遍歷的方式抓取系統(tǒng)所能允許存儲(chǔ)和處理的所有網(wǎng)頁。在理想的軟硬件環(huán)境 下,經(jīng)過足夠的運(yùn)行時(shí)間,累積式抓取的策略可以保證抓取到相當(dāng)規(guī)模的網(wǎng)頁集合。但由于 Web 數(shù)據(jù)的動(dòng)態(tài)特性,集合中網(wǎng)頁的被抓取時(shí)間點(diǎn)是不同的,頁面被更新的情況也不同,因此累積式抓取到的網(wǎng)頁集合事實(shí)上并無法與真實(shí)環(huán)境中的網(wǎng)絡(luò)數(shù)據(jù)保持一致。

增量式抓取 是指在具有一定量規(guī)模的網(wǎng)絡(luò)頁面集合的基礎(chǔ)上,采用更新數(shù)據(jù)的方式選取已有集合中的過時(shí)網(wǎng)頁進(jìn)行抓取,以保證所抓取到的數(shù)據(jù)與真實(shí)網(wǎng)絡(luò)數(shù)據(jù)足夠接近。進(jìn)行增量式抓取的前提是,系統(tǒng)已經(jīng)抓取了足夠數(shù)量的網(wǎng)絡(luò)頁面,并具有這些頁面被抓取的時(shí)間信息。

面向?qū)嶋H應(yīng)用環(huán)境的網(wǎng)絡(luò)蜘蛛設(shè)計(jì)中,通常既包括累積式抓取,也包括增量式抓取的策略。累積式抓取一般用于數(shù)據(jù)集合的整體建立或大規(guī)模更新階段;而增量式抓取則主要針對數(shù)據(jù)集合的日常維護(hù)與即時(shí)更新。

在確定了抓取策略之后,如何從充分利用網(wǎng)絡(luò)帶寬,合理確定網(wǎng)頁數(shù)據(jù)更新的時(shí)間點(diǎn)就成了網(wǎng)絡(luò)蜘蛛運(yùn)行策略中的核心問題。

總體而言,在合理利用軟硬件資源進(jìn)行針對網(wǎng)絡(luò)數(shù)據(jù)的即時(shí)抓取方面,已經(jīng)形成了相對比較成熟的技術(shù)和實(shí)用性解決方案,這方面目前所需解決的主要問題,是如何更好的處理動(dòng)態(tài)網(wǎng)絡(luò)數(shù)據(jù)問題(如數(shù)量越來越龐大的 Web2.0 數(shù)據(jù)等),以及更好的根據(jù)網(wǎng)頁質(zhì)量修正抓取策略的問題。

工作流程


網(wǎng)絡(luò)爬蟲調(diào)研報(bào)告

Nutch 架構(gòu)圖

網(wǎng)絡(luò)爬蟲調(diào)研報(bào)告


Nutch 工作流程圖

Nutch 工作流程:

建立初始 URL 集合分析

初始 URL 集的建立有兩種方式:超鏈接和站長提交。

超鏈接 是指機(jī)器人程序根據(jù)網(wǎng)頁鏈到其他網(wǎng)頁中的超鏈接,就像日常生活中所說的 一傳十,十傳百 ……” 一樣,從少數(shù)幾個(gè)網(wǎng)頁開始,連到數(shù)據(jù)庫上所有到其他網(wǎng)頁的鏈接。理論上,若網(wǎng)頁上有適當(dāng)?shù)某B結(jié),機(jī)器人便可以遍歷絕大部分網(wǎng)頁。

站長提交 是指在實(shí)際運(yùn)行中,爬蟲不可能抓取到所有站點(diǎn),為此,網(wǎng)站站長可以向搜索引擎進(jìn)行提交,要求收錄,搜索引擎經(jīng)過核查之后,便將該網(wǎng)站加入到 URL 集合中,進(jìn)行抓取。

1. ???????? inject 操作分析

inject 操作調(diào)用的是 Nutch 的核心包之一 crawl 包中的類 org.apache.nutch.crawl.Injector 。它執(zhí)行的結(jié)果是: crawldb 數(shù)據(jù)庫內(nèi)容得到更新,包括 URL 及其狀態(tài)。

inject 操作主要作用可以從下面 3 方面來說明:

(1) URL 集合進(jìn)行格式化和過濾,消除其中的非法 URL ,并設(shè)定 URL 狀態(tài) (UNFETCHED), 按照一定方法進(jìn)行初始化分值;

(2) URL 進(jìn)行合并,消除重復(fù)的 URL 入口;

(3) URL 及其狀態(tài)、分值存入 crawldb 數(shù)據(jù)庫,與原數(shù)據(jù)庫中重復(fù)的則刪除舊的,更換新的。

2. ???????? generate 操作分析

generate 操作調(diào)用的是 crawl 包中的類 org.apache.nutch.crawl.Generator 。它執(zhí)行的結(jié)果是:創(chuàng)建了抓取 列表,存放于 segments 目錄下,以時(shí)間為文件夾名稱。循環(huán)抓取多少次, segments 文件夾下就會(huì)有多少個(gè)以時(shí)間為名稱的文件夾。

generate 操作主要作用可以從下面 3 方面來說明:

(1) crawldb 數(shù)據(jù)庫中將 URL 取出并進(jìn)行過濾;

(2) URL 進(jìn)行排序,通過域名、鏈接數(shù)和一種 hash 算法綜合進(jìn)行降序排列;

(3) 將排列列表寫入 segments 目錄中。

3. ???????? fetch 操作分析

fetch 操作調(diào)用的是 fetcher 包中的類 org.apache.nutch.fetcher.Fetcher 。它執(zhí)行的結(jié)果是:將頁面內(nèi)容抓取下來,存于 segment 目錄下。

fetch 操作主要作用可以從下面 4 方面來說明:

(1) 執(zhí)行抓取,按照 segments 目錄下的抓取列表進(jìn)行;

(2) 抓取過程中,頁面的 URL 地址可能因?yàn)殒溄影l(fā)生改變,從而需要更新 URL 地址;

(3) 抓取采用多線程方式進(jìn)行,以提高抓取速度;

(4) fetch 操作過程中調(diào)用了 parse 操作。

4. ???????? parse 操作分析

parse 操作調(diào)用的是 parse 包中的類 org.apache.nutch.parse.ParseSegment 。它執(zhí)行的結(jié)果是:將 fetch 得到的頁面解析為 text data ,存于 segments 目錄下。

parse 操作主要作用可以從下面 3 方面來說明:

(1) 解析 segment 中由 fetch 得到的頁面,并進(jìn)行整理,將頁面分成為 parse-date parse-text

(2) parse-date 中保存的是頁面的題名、作者、日期、鏈接等內(nèi)容;

(3) parse-text 中保存的是頁面的文本內(nèi)容。

例如,我只執(zhí)行一次抓取任務(wù),就執(zhí)行了上述的一些操作,操作的結(jié)果直接反映在 segments 目錄中。可以看到在 home\SHIYANJUN \nutch-0.9\mydir\segments 目錄下面創(chuàng)建了 20081004102407 這個(gè)目錄,該目錄中包含 6 個(gè)目錄: content crawl_fetch crawl_generate crawl_parse parse_data parse_text ,從目錄名稱就可以大致知道該目錄存取的相關(guān)內(nèi)容信息。

5. ???????? updatedb 操作分析

updatedb 操作調(diào)用的是 crawl 包中的類 org.apache.nutch.crawl.CrawlDb 。它執(zhí)行的結(jié)果是:更新了 crawldb 數(shù)據(jù)庫,為下一輪抓取做準(zhǔn)備。

updatedb 操作主要作用如下:

根據(jù) segments 目錄下 fetch 目錄和 parse 目錄中的內(nèi)容,對 crawldb 進(jìn)行更新,增加新的 URL ,更換舊的 URL

6. ???????? invertlinks 操作分析

invertlinks 操作用來更新 linkDB ,為建立索引的工作提供準(zhǔn)備。

7. ???????? index 過程分析

index 過程,即索引過程,包括:將數(shù)據(jù)轉(zhuǎn)換成文本、分析文本、將分析過的文本保存到數(shù)據(jù)庫中這三個(gè)操作。

(1) 轉(zhuǎn)換成文本

在索引數(shù)據(jù)之前,首先必須將數(shù)據(jù)轉(zhuǎn)換成 Nutch 能夠處理的格式 ―― 純文本字符流。但是,在現(xiàn)實(shí)世界中,信息多以富媒體 (rich media) 文檔格式呈現(xiàn): PDF WORD EXCEL HTML XML 等。為此, Nutch 采用了插件機(jī)制 (plugin) ,通過各種各樣的文檔解 析器,將富媒體轉(zhuǎn)換成純文字字符流。文檔解析器種類繁多,開發(fā)人員可以根據(jù)需要進(jìn)行選擇,同時(shí)還可以自己修改或編寫,非常靈活方便。

(2) 分析文本

在對數(shù)據(jù)進(jìn)行索引前,還需要進(jìn)行預(yù)處理,對數(shù)據(jù)進(jìn)行分析使之更加適合被索引。分析數(shù)據(jù)時(shí),先將文本數(shù)據(jù)切分成一些大塊或者語匯單元 (tokens) ,然后對它們執(zhí)行一些可選的操作,例如:在索引之前將這些語匯單元轉(zhuǎn)換成小寫,使得搜索對大小寫不敏感;最有代表性的是要從輸入中去掉一 些使用很頻繁但卻沒有實(shí)際意義的詞,比如英文文本中的一些停止詞 (a an the in on ) 。同樣的,我們也需要分析輸入的語匯單元,以便從詞語中去掉一些不必要的字母以找到它們的詞干。這一處理過程稱為分析 (analyze) 。分析技術(shù)在索引和搜索時(shí)都會(huì)用到,比較重要。

(3) 將分析過的文本保存到數(shù)據(jù)庫中

對輸入的數(shù)據(jù)分析處理完成之后,就可以將結(jié)果寫入到索引文件中。 Nutch 采用的是 Lucene 的索引格式,可以參考關(guān)于 Lucene 的索引機(jī)制。 Lucene 采用 倒排索引 的數(shù)據(jù)結(jié)果來存儲(chǔ)索引的。

8. ???????? 搜索程序分析

Nutch 的搜索程序執(zhí)行過程,可以從下面的步驟了解:

(1) HTTP 服務(wù)器接收用戶發(fā)送過來的請求。對應(yīng)到 Nutch 的運(yùn)行代碼中就是一個(gè) servlet ,稱為查詢處理器 (Query Handler) 。查詢處理器負(fù)責(zé)響應(yīng)用戶的請求,并將相應(yīng)的 HTML 結(jié)果頁面返回給用戶。

(2) 查詢處理器對查詢語句做一些微小的處理并將搜索的項(xiàng) (terms) 轉(zhuǎn)發(fā)到一組運(yùn)行索引搜索器的機(jī)器上。 Nutch 的查詢系統(tǒng)似乎比 lucene 簡單的多, 這主要是因?yàn)樗阉饕娴挠脩魧λ约核獔?zhí)行的查詢內(nèi)容有非常清晰的思路。然而, lucene 的系統(tǒng)結(jié)構(gòu)非常靈活,且提供了多種不同的查詢方式。看似簡單的 Nutch 查詢最終被轉(zhuǎn)換為特定的 lucene 查詢類型。每個(gè)索引搜索器并行工作且返回一組有序的文檔 ID 列表。

(3) 現(xiàn)在存在這大量從查詢處理器返回過來的搜索結(jié)果數(shù)據(jù)流。查詢處理器對這些結(jié)果集進(jìn)行比較,從所有的結(jié)果查找出匹配最好的那些。如果其中任何一個(gè)索引搜索器在 1~2 秒之后返回結(jié)果失敗,該搜索器的結(jié)果將被忽略。因此,最后列表由操作成功的搜索器返回的結(jié)果組成。

關(guān)于查詢處理器

查詢處理器對查詢作了一些細(xì)微的處理,例如刪除停止詞 ( 例如 the of ) 。接著 Nutch 需要執(zhí)行一些操作以便于它在大規(guī)模的數(shù)據(jù)環(huán)境下能更好的工作。一個(gè)索引搜索器涉及搜索的文檔集數(shù)目非常龐大,所以 Nutch 需 要同時(shí)與很多索引搜索器交互來提高搜索速率。實(shí)際運(yùn)行環(huán)境中,為了保證系統(tǒng)級(jí)別的穩(wěn)定性,文檔集的段文件會(huì)被復(fù)制到多個(gè)不同主機(jī)上。因?yàn)閷τ谖臋n集中的每 個(gè)段,查詢處理器會(huì)隨機(jī)的與其中一個(gè)可搜索到自身的索引搜索器相交互。如果發(fā)現(xiàn)一個(gè)索引搜索器不能交互,查詢處理器會(huì)通知之后的搜索操作不使用該搜索器, 但是查詢處理器每隔一段時(shí)間會(huì)回頭檢查一次搜索器的狀態(tài),以防該主機(jī)上的搜索器再次可用。

關(guān)于分析器

Nutch 使用自己的分析器,對應(yīng)于 analysis 包。 Nutch 把索引時(shí)進(jìn)行分析所使用的二元語法技術(shù) (bigram) 與查詢過程中對短語的優(yōu)化技術(shù)結(jié)合在一起,通過二元語法技術(shù)可以把兩個(gè)連續(xù)的詞組合成一個(gè)語匯單元。這就可以大大減少搜索時(shí)需要考慮的文檔范圍,例如,包含詞組 the quick 的文檔比包含 the 的文檔要少的多。

分析器對分析操作進(jìn)行了封裝。分析器通過執(zhí)行若干操作,將文本語匯單元化,這些操作可能包括提取單詞、去除標(biāo)點(diǎn)符號(hào)、去掉語匯單元上的音調(diào)符號(hào)、將字母轉(zhuǎn)化為小寫 ( 也稱為規(guī)格化 ) 、移除常用詞、將單詞轉(zhuǎn)換為詞干形式 ( 詞干還原 ) ,或者將單詞轉(zhuǎn)換為基本形等。這個(gè)過程也稱為語匯單元化過程。分析操作發(fā)生在兩個(gè)階段:建立索引和進(jìn)行查詢時(shí)。

Nutch 的其他一些特性

為了獲取小數(shù)量的文檔 ( 通常是 10 個(gè)左右 ) ,查詢處理器會(huì)對每個(gè)索引搜索器進(jìn)行查詢。因?yàn)樽詈蟮慕Y(jié)果是從多個(gè)索引搜索器中合并得到的,所以就沒有必要從一個(gè)數(shù)據(jù)源中獲取過多的文檔結(jié)果,尤其是在用戶很少去查看第一頁之后的結(jié)果的情況下。

實(shí)際上,在每個(gè)用戶查詢被處理之前,它會(huì)被擴(kuò)展為十分復(fù)雜的 lucene 查詢。每個(gè)索引過的文檔都包含了三個(gè)域:網(wǎng)頁自身的內(nèi)容,網(wǎng)頁的 URL 文本值,以及由所有關(guān)鍵 (anchor) 文本所組成的合成文檔,這些關(guān)鍵文本可在導(dǎo)航網(wǎng)頁的超鏈接中找到。每個(gè)域?qū)?yīng)一個(gè)不同的權(quán)重值。 Nutch 的查詢處理器生成一個(gè) lucene 布爾查詢,其中在三個(gè)域中都包含了搜索引擎用戶所輸入的文本。

● Nutch 也會(huì)特別的把那些在 web 上出現(xiàn)的非常頻繁的關(guān)鍵字組作為一個(gè)整體來索引 ( 其中的許多關(guān)鍵字是與 HTTP 相關(guān)的詞組 ) 。這些關(guān)鍵字序列出現(xiàn)的非常頻繁,所以無需花費(fèi)精力去對這些詞序中的每個(gè)組成部分單獨(dú)搜索,也不必查找出這些搜索結(jié)果中是否有交集的部分。我們不用把這些項(xiàng)劃分為單獨(dú)的單詞對來搜索文檔,而是把它們作為一個(gè)單元,當(dāng)然前提是 Nutch 在索引期間必須檢測到它們是作為一個(gè)整體而存在的。另外,在與索引搜索器交互之前,查詢處理器會(huì)查找出用戶輸入的字符串中單詞的任意組合。如果這樣一個(gè)詞序確實(shí)存在,它的單詞成員就會(huì)整合成一個(gè)特殊的搜索項(xiàng)。

在使用 lucene 執(zhí)行索引操作之前, Nutch 的內(nèi)容獲取器 / 索引器需要預(yù)處理 HTML 文檔。它使用 NekoHTML 解析器剝離 HTML 中的內(nèi)容,并索引其中的非標(biāo)記文本。對于從 HTML 文檔提取標(biāo)題文本, NekoHTML 是很有建樹的。

● Nutch 進(jìn)程間通信層 (IPC) 保持了查詢處理器與索引搜索器間長時(shí)間的連接。查詢處理器端可能存在多個(gè)并發(fā)的線程,對于給定的地址,任一線程都可以向遠(yuǎn)程服務(wù)器發(fā)送調(diào)用請求。服務(wù)器每接受一個(gè)請求之后,就會(huì)根據(jù)給定字符串嘗試去查找對應(yīng)的注冊服務(wù) ( 運(yùn)行在自己線程上 ) 。客戶端的請求線程會(huì)一直阻塞其他事件,直到服務(wù)器端響應(yīng)的 IPC 代碼到達(dá)后,消息通知請求線程為止。如果服務(wù)器的響應(yīng)花費(fèi)的時(shí)間超過了 IPC 規(guī)定的時(shí)限, IPC 的代碼就會(huì)宣布此服務(wù)器不可用,并拋出一個(gè)異常。

另外, Nutch 的排序算法是仿照 Google PageRank 算法,關(guān)于 PageRank 算法的資料有很多,推薦《 Google 的秘密 PageRank 徹底解說中文版》。

優(yōu)點(diǎn)

Nutch 支持分布式抓取,并有 Hadoop 支持,可以進(jìn)行多機(jī)分布抓取,存儲(chǔ)和索引。另外很吸引人的一點(diǎn)在于,它提供了一種插件框架,使得其對各種網(wǎng)頁內(nèi)容的解析、各種數(shù)據(jù)的采集、查詢、集群、過濾等功能能夠方便的進(jìn)行擴(kuò)展,正是由于有此框架,使得 Nutch 的插件開發(fā)非常容易,第三方的插件也層出不窮,極大的增強(qiáng)了 Nutch 的功能和聲譽(yù)。

缺點(diǎn)

Nutch 的爬蟲定制能力比較弱

?

網(wǎng)絡(luò)爬蟲調(diào)研報(bào)告


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 嘉义县| 克什克腾旗| 界首市| 清镇市| 梓潼县| 石城县| 承德市| 抚顺县| 依安县| 吴江市| 开鲁县| 托克托县| 西盟| 芦山县| 旺苍县| 拜泉县| 宝坻区| 攀枝花市| 开封市| 综艺| 日照市| 上林县| 若尔盖县| 大宁县| 平远县| 盖州市| 滨海县| 龙海市| 新宁县| 五家渠市| 天津市| 澜沧| 林州市| 巩义市| 诸城市| 洮南市| 阿拉尔市| 台南市| 昌宁县| 龙海市| 万荣县|