內容簡介
本書介紹了網絡爬蟲開發中的關鍵問題與Java實現。主要包括從互聯網獲取信息與提取信息和對Web信息挖掘等內容。本書在介紹基本原理的同時注重輔以具體代碼實現來幫助讀者加深理解,書中部分代碼甚至可以直接使用。
本書適用于有Java程序設計基礎的開發人員。同時也可以作為計算機相關專業本科生或研究生的參考教程。
前 言
當你在網上沖浪時,你是否知道還有一類特殊的網絡用戶也在互聯網上默默地工作著,它們就是網絡爬蟲。這些網絡爬蟲按照設計者預定的方式,在網絡中穿梭,同時自動收集有用的信息,進行分類和整理,將整理結果提供給用戶,以方便用戶查找他們感興趣的內容。由于網絡爬蟲的實用性,引起了很多程序員,特別是Web程序員的興趣。
但是大多數網絡爬蟲的開發原理與技巧在專業的公司內部都秘而不宣,至今仍然缺少理論與實踐相結合的專門介紹網絡爬蟲的書籍。本書嘗試理論與實踐相結合,深入透徹地講解網絡爬蟲的原理,并且輔以相關代碼作為參考。本書相關的代碼在附帶光盤中可以找到。
本書的兩位主要作者在搜索引擎領域都有豐富的理論和實踐經驗。同時,還有多個程序員幫忙開發或編寫了代碼實現,例如Java實現異步I/O或對PDF文件的處理等。由于作者的日常工作繁忙,做得不夠的地方敬請諒解。
作者羅剛在參加編寫本書之前,還合作撰寫過《解密搜索引擎技術實戰》一書,但存在講解不夠細致、知識點不夠深入等問題。此次修訂,對一些過時的內容進行了更新。
本書從基本的爬蟲原理開始講解,通過介紹優先級隊列、寬度優先搜索等內容引領讀者入門;之后根據當前風起云涌的云計算熱潮,重點講述了云計算的相關內容及其在爬蟲中的應用,以及帶偏好的爬蟲、信息抽取、鏈接分析等內容;為了能夠讓讀者更深入地了解爬蟲,本書在最后兩章還介紹了有關爬蟲的數據挖掘等內容。
由于搜索引擎相關領域也正在快速發展中,而且由于篇幅的限制,有些不成熟的內容,沒有能夠在本書體現,例如有關"暗網"的內容。隨著技術的不斷發展,我們將在今后的版本中加入這些內容。
本書適合需要具體實現網絡爬蟲的程序員使用,對于信息檢索等相關研究人員也有一定的參考價值,同時獵兔搜索技術團隊也已經開發出以本書為基礎的專門培訓課程和商業軟件。目前的一些網絡爬蟲軟件仍然有很多功能有待實現,作者真誠地希望通過本書把讀者帶入網絡爬蟲開發的大門并認識更多的朋友。
感謝開源軟件和我們的家人、關心我們的老師和朋友、創業伙伴以及選擇獵兔搜索軟件的客戶多年來的支持。
編 者
目 錄
第1篇 自己動手抓取數據第1章 全面剖析網絡爬蟲 31.1 抓取網頁 41.1.1 深入理解URL 41.1.2 通過指定的URL抓取網頁內容 61.1.3 Java網頁抓取示例 81.1.4 處理HTTP狀態碼 101.2 寬度優先爬蟲和帶偏好的爬蟲 121.2.1 圖的寬度優先遍歷 121.2.2 寬度優先遍歷互聯網 131.2.3 Java寬度優先爬蟲示例 151.2.4 帶偏好的爬蟲 221.2.5 Java帶偏好的爬蟲示例 231.3 設計爬蟲隊列 241.3.1 爬蟲隊列 241.3.2 使用Berkeley DB構建爬蟲隊列 291.3.3 使用Berkeley DB 構建爬蟲隊列示例 301.3.4 使用布隆過濾器構建Visited表 361.3.5 詳解Heritrix爬蟲隊列 391.4 設計爬蟲架構 461.4.1 爬蟲架構 461.4.2 設計并行爬蟲架構 471.4.3 詳解Heritrix爬蟲架構 521.5 使用多線程技術提升爬蟲性能 551.5.1 詳解Java多線程 551.5.2 爬蟲中的多線程 591.5.3 一個簡單的多線程爬蟲實現 601.5.4 詳解Heritrix多線程結構 61本章小結 64第2章 分布式爬蟲 692.1 設計分布式爬蟲 702.1.1 分布式與云計算 702.1.2 分布式與云計算技術在爬蟲中的應用--淺析Google的云計算架構 722.2 分布式存儲 722.2.1 從Ralation_DB到key/value存儲 722.2.2 Consistent Hash算法 742.2.3 Consistent Hash代碼實現 792.3 Google的成功之道--GFS 802.3.1 GFS詳解 802.3.2 開源GFS--HDFS 842.4 Google網頁存儲秘訣--BigTable 882.4.1 詳解BigTable 882.4.2 開源BigTable-HBase 932.5 Google的成功之道--MapReduce算法 982.5.1 詳解MapReduce算法 1002.5.2 MapReduce容錯處理 1012.5.3 MapReduce實現架構 1022.5.4 Hadoop中的MapReduce簡介 1042.5.5 wordCount例子的實現 1052.6 Nutch中的分布式 1092.6.1 Nutch爬蟲詳解 1092.6.2 Nutch中的分布式 116本章小結 118第3章 爬蟲的"方方面面" 1213.1 爬蟲中的"黑洞" 1223.2 主題爬蟲和限定爬蟲 1223.2.1 理解主題爬蟲 1223.2.2 Java主題爬蟲 1283.2.3 理解限定爬蟲 1303.2.4 Java限定爬蟲示例 1363.3 有"道德"的爬蟲 152本章小結 156第2篇 自己動手抽取Web內容第4章 "處理"HTML頁面 1594.1 征服正則表達式 1604.1.1 學習正則表達式 1604.1.2 Java正則表達式 1634.2 抽取HTML正文 1694.2.1 了解Jsoup 1694.2.2 使用正則表達式抽取示例 1734.3 抽取正文 1774.4 從JavaScript中抽取信息 1934.4.1 JavaScript抽取方法 1934.4.2 JavaScript抽取示例 195本章小結 197第5章 非HTML正文抽取 1995.1 抽取PDF文件 2005.1.1 學習PDFBox 2005.1.2 使用PDFBox抽取示例 2045.1.3 提取PDF文件標題 2055.1.4 處理PDF格式的公文 2065.2 抽取Office文檔 2115.2.1 學習POI 2115.2.2 使用POI抽取Word示例 2115.2.3 使用POI抽取PPT 示例 2135.2.4 使用POI抽取Excel示例 2145.3 抽取RTF 2175.3.1 開源RTF文件解析器 2175.3.2 實現一個RTF文件解析器 2175.3.3 解析RTF示例 222本章小結 227第6章 多媒體抽取 2296.1 視頻抽取 2306.1.1 抽取視頻關鍵幀 2306.1.2 Java視頻處理框架 2316.1.3 Java視頻抽取示例 2356.2 音頻抽取 2476.2.1 抽取音頻 2486.2.2 Java音頻抽取技術 252本章小結 254第7章 去掉網頁中的"噪聲" 2557.1 "噪聲"對網頁的影響 2567.2 利用"統計學"消除"噪聲" 2577.2.1 網站風格樹 2607.2.2 "統計學去噪"的Java實現 2687.3 利用"視覺"消除"噪聲" 2727.3.1 "視覺"與"噪聲" 2727.3.2 "視覺去噪"的Java實現 273本章小結 277第3篇 自己動手挖掘Web數據第8章 分析Web圖 2818.1 存儲Web"圖" 2828.2 利用Web"圖"分析鏈接 2918.3 Google的秘密--PageRank 2918.3.1 深入理解PageRank算法 2918.3.2 PageRank算法的Java實現 2958.3.3 應用PageRank進行鏈接分析 2988.4 PageRank 的兄弟HITS 2998.4.1 深入理解HITS算法 2998.4.2 HITS算法的Java實現 3008.4.3 應用HITS進行鏈接分析 3118.5 PageRank與HITS比較 312本章小結 313第9章 去掉"重復"的文檔 3159.1 何為"重復"的文檔 3169.2 利用"語義指紋"排重 3169.2.1 理解"語義指紋" 3189.2.2 "語義指紋"排重的Java實現 3199.3 SimHash排重 3199.3.1 理解SimHash 3209.3.2 SimHash排重的Java實現 3219.4 分布式文檔排重 328本章小結 329第10章 分類與聚類的應用 33110.1 網頁分類 33210.1.1 收集語料庫 33210.1.2 選取網頁的"特征" 33310.1.3 使用支持向量機進行網頁分類 33610.1.4 利用URL地址進行網頁分類 33810.1.5 使用AdaBoost進行網頁分類 33810.2 網頁聚類 34110.2.1 深入理解DBScan算法 34110.2.2 使用DBScan算法聚類實例 342本章小結 344