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

網絡爬蟲調研報告

系統 2268 0

網絡爬蟲調研報告

調研背景

?????? 項目中要對指定的網絡資源進行抓取、存儲、分類、索引、并提供檢索服務。充當全文檢索數據庫的是 Apache 組織下的開源項目 Lucene 檢索工具,而 Lucene 只是個搜索引擎工具,它提供 API 接口,通過編寫程序對信息進行索引和檢索,在其后臺需要網絡爬蟲程序的支持,其目的是通過 網絡爬蟲軟件抓取網頁,作為提供給 Lucene 搜索引擎的資源,進行索引和查詢。

調研對象

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

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

Nutch

Nutch Apache 基金會的一個開源項目,它原本是開源文件索引框架 Lucene 項目的一個子項目,后來漸漸發展成長為一個獨立的開源項目。它基于 Java 開發,基于 Lucene 框架,提供 Web 網頁爬蟲和搜索引擎兩部分功能。

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

爬蟲工作策略

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

累積式抓取 是指從某一個時間點開始,通過遍歷的方式抓取系統所能允許存儲和處理的所有網頁。在理想的軟硬件環境 下,經過足夠的運行時間,累積式抓取的策略可以保證抓取到相當規模的網頁集合。但由于 Web 數據的動態特性,集合中網頁的被抓取時間點是不同的,頁面被更新的情況也不同,因此累積式抓取到的網頁集合事實上并無法與真實環境中的網絡數據保持一致。

增量式抓取 是指在具有一定量規模的網絡頁面集合的基礎上,采用更新數據的方式選取已有集合中的過時網頁進行抓取,以保證所抓取到的數據與真實網絡數據足夠接近。進行增量式抓取的前提是,系統已經抓取了足夠數量的網絡頁面,并具有這些頁面被抓取的時間信息。

面向實際應用環境的網絡蜘蛛設計中,通常既包括累積式抓取,也包括增量式抓取的策略。累積式抓取一般用于數據集合的整體建立或大規模更新階段;而增量式抓取則主要針對數據集合的日常維護與即時更新。

在確定了抓取策略之后,如何從充分利用網絡帶寬,合理確定網頁數據更新的時間點就成了網絡蜘蛛運行策略中的核心問題。

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

工作流程


網絡爬蟲調研報告

Nutch 架構圖

網絡爬蟲調研報告


Nutch 工作流程圖

Nutch 工作流程:

建立初始 URL 集合分析

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

超鏈接 是指機器人程序根據網頁鏈到其他網頁中的超鏈接,就像日常生活中所說的 一傳十,十傳百 ……” 一樣,從少數幾個網頁開始,連到數據庫上所有到其他網頁的鏈接。理論上,若網頁上有適當的超連結,機器人便可以遍歷絕大部分網頁。

站長提交 是指在實際運行中,爬蟲不可能抓取到所有站點,為此,網站站長可以向搜索引擎進行提交,要求收錄,搜索引擎經過核查之后,便將該網站加入到 URL 集合中,進行抓取。

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

inject 操作調用的是 Nutch 的核心包之一 crawl 包中的類 org.apache.nutch.crawl.Injector 。它執行的結果是: crawldb 數據庫內容得到更新,包括 URL 及其狀態。

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

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

(2) URL 進行合并,消除重復的 URL 入口;

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

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

generate 操作調用的是 crawl 包中的類 org.apache.nutch.crawl.Generator 。它執行的結果是:創建了抓取 列表,存放于 segments 目錄下,以時間為文件夾名稱。循環抓取多少次, segments 文件夾下就會有多少個以時間為名稱的文件夾。

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

(1) crawldb 數據庫中將 URL 取出并進行過濾;

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

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

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

fetch 操作調用的是 fetcher 包中的類 org.apache.nutch.fetcher.Fetcher 。它執行的結果是:將頁面內容抓取下來,存于 segment 目錄下。

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

(1) 執行抓取,按照 segments 目錄下的抓取列表進行;

(2) 抓取過程中,頁面的 URL 地址可能因為鏈接發生改變,從而需要更新 URL 地址;

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

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

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

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

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

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

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

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

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

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

updatedb 操作調用的是 crawl 包中的類 org.apache.nutch.crawl.CrawlDb 。它執行的結果是:更新了 crawldb 數據庫,為下一輪抓取做準備。

updatedb 操作主要作用如下:

根據 segments 目錄下 fetch 目錄和 parse 目錄中的內容,對 crawldb 進行更新,增加新的 URL ,更換舊的 URL

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

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

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

index 過程,即索引過程,包括:將數據轉換成文本、分析文本、將分析過的文本保存到數據庫中這三個操作。

(1) 轉換成文本

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

(2) 分析文本

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

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

對輸入的數據分析處理完成之后,就可以將結果寫入到索引文件中。 Nutch 采用的是 Lucene 的索引格式,可以參考關于 Lucene 的索引機制。 Lucene 采用 倒排索引 的數據結果來存儲索引的。

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

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

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

(2) 查詢處理器對查詢語句做一些微小的處理并將搜索的項 (terms) 轉發到一組運行索引搜索器的機器上。 Nutch 的查詢系統似乎比 lucene 簡單的多, 這主要是因為搜索引擎的用戶對他自己所要執行的查詢內容有非常清晰的思路。然而, lucene 的系統結構非常靈活,且提供了多種不同的查詢方式。看似簡單的 Nutch 查詢最終被轉換為特定的 lucene 查詢類型。每個索引搜索器并行工作且返回一組有序的文檔 ID 列表。

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

關于查詢處理器

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

關于分析器

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

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

Nutch 的其他一些特性

為了獲取小數量的文檔 ( 通常是 10 個左右 ) ,查詢處理器會對每個索引搜索器進行查詢。因為最后的結果是從多個索引搜索器中合并得到的,所以就沒有必要從一個數據源中獲取過多的文檔結果,尤其是在用戶很少去查看第一頁之后的結果的情況下。

實際上,在每個用戶查詢被處理之前,它會被擴展為十分復雜的 lucene 查詢。每個索引過的文檔都包含了三個域:網頁自身的內容,網頁的 URL 文本值,以及由所有關鍵 (anchor) 文本所組成的合成文檔,這些關鍵文本可在導航網頁的超鏈接中找到。每個域對應一個不同的權重值。 Nutch 的查詢處理器生成一個 lucene 布爾查詢,其中在三個域中都包含了搜索引擎用戶所輸入的文本。

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

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

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

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

優點

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

缺點

Nutch 的爬蟲定制能力比較弱

?

網絡爬蟲調研報告


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 华亭县| 阿克陶县| 海盐县| 潜江市| 河南省| 邢台市| 尼玛县| 榆树市| 蚌埠市| 赫章县| 咸宁市| 鄂尔多斯市| 同仁县| 沈阳市| 乡宁县| 陇川县| 长武县| 清新县| 嘉兴市| 永州市| 中江县| 安乡县| 大关县| 龙江县| 丁青县| 厦门市| 东海县| 白银市| 阜阳市| 丰都县| 剑川县| 石屏县| 泉州市| 宜城市| 巴彦淖尔市| 双江| 樟树市| 彭阳县| 项城市| 宁南县| 祁连县|