Java 爬蟲專案實戰之爬蟲簡介
Java 爬蟲專案實戰之爬蟲簡介
0. 前言
今年三四月份學習Hbase,瞭解到openTSDB的底層儲存使用到了Hbase,於是乎,學習openTSDB,在閱讀openTSDB原始碼【其原始碼使用java編寫】的過程中, 發現裡面全是I/O,多執行緒,httpclient等。 而我對此則是一無所知,看了一些書也不甚其解,其中包括高洪巖老師所著的兩本書:《Java多執行緒程式設計核心技術》《NIO與Socket程式設計技術指南》以及李林峰老師的《Netty權威指南》。講了很多遍的I/O,我也沒搞懂這些到底是個什麼玩意兒。但是我知道這些都少不了TCP/IP協議,於是又接著溫故大學的TCP/IP,TCP/IP是一個協議族,而應用程式設計師與TCP,IP協議直接打交道的幾乎其實並不多,最為直接的應該是HTTP協議了,只要是個程式設計師,肯定知道HTTP,雖然有很多人並不知道其中的細節。所以,接著我又溫習了一下HTTP協議,才發現當初學的知識是多麼不紮實,連很多基本的道理都沒理解。折騰了這麼幾個月,才慢慢的梳理出了自己的學習歷程,慢慢地也有了一些感慨。
無論是做java程式設計師,還是做大資料開發工程師,Java才是真正的企業霸主,筆者從事大資料開發的,程式設計的這個玩意兒肯定是少不了Java語言。光說不練假把式,就想著進行自己的程式碼練習,便從大資料元件最為顯著的特徵——“分散式”入手,而這個分散式必須涉及到底層的網路通訊,於是我選擇從Java 爬蟲開始著手練習。終於在近兩個週末,搞知乎爬蟲。小有收穫,但是也挖坑不少,以此標記。
1. 什麼是爬蟲
爬蟲是什麼? 沒有接觸過爬蟲的人一定會這麼問。其實爬蟲就是獲取某些網頁中的內容。而實現爬蟲的手法有很多,包括流行的python,以及java等。因為考慮到java企業級的優勢,於是筆者選擇使用java進行爬蟲開發。
程式爬蟲原理的等同於瀏覽器訪問網頁的原理
- (1)真人行為驅動
- (2)瀏覽器自動執行人為的動作,即將動作自動程式化。
而網路爬蟲就是將瀏覽器訪問網頁的過程,再次抽像成程式。
2. 網路爬蟲分類
2.1 獲取方式分類
學習過樹的人都知道,樹的遍歷方式有廣度優先和深度優先,同樣,網路爬蟲也是如此:可以按連結的訪問層次的先後來分成 廣度優先和深度優先
- 廣度優先:即在下載網頁連結時,是以一層一層的連結來爬取。
- 深度優化:以先訪每層中第一個未訪問節點為先,依次下行迭代迴圈。
2.2 爬蟲應用分類
- 漫爬型爬蟲:百度、谷歌爬蟲,沒有目標,以連結為中心去爬,不限制站點的資料,資料儲存直接為單個網頁的文字,不進行格式化方面的抽取,一般只做正文、接要、主題詞等的抽取,方便索引和搜尋。
- 垂直型爬蟲:內容聚焦,比如說淘寶爬蟲、微博爬蟲、電商爬蟲,而且往往資料直接格式化為結構化資料。
3. 網路爬蟲的一般方法
3.1 基於Socket通訊編寫爬蟲
最底層的實現形式,也是執行最高效,但開發效率較低的一種方式。socket並不是什麼通訊協義,只是為了方便tcp/ip層的上層訪問tip/ip層而做一層封裝。相當於http方問socket,而後socket轉化為tcp/ip包。
3.2 基於HttpURLConnection類編寫爬蟲
Java se的net包中的核心類,主要用於http的相關操作。
3.3 基於apache的HttpClient包編寫爬蟲
核心也是基於java se的net包擴充套件而來,專為java的網路通訊程式設計而開發的第三方包,也是apahce。
3.4 基於phantomjs之類的無頭(無介面)瀏覽器
- (1)它是瀏覽器核心,並非瀏覽器。換言之,它是沒有介面UI的瀏覽器。無頭,即無介面。
- (2)它提供的js api,故它可以方便直接的被各種程式語言呼叫。
3.5 基於Selenium或是WebDriver之類的有頭(有介面)瀏覽器
- (1)它能直接操作本地的瀏覽器,與真人操作不同的是,它的操作都是程式觸發,省去了人為操作的步驟。
四、系統設計
- 4.1 模組劃分:提交任務的UI介面層、任務排程層、網路爬取層、資料解析層、資料持久化層
- 4.2 重難點 : 亂碼解決、多執行緒設計、爬取的各引數的靈活配置、反爬代理
五、具體技術點
-
5.1 http協議相關+java se+httpclient+jsoup(httpparser)+database
-
5.2 http協議相關,指在爬蟲過程中對最為主流的http網址的內容的抓包及引數分析,最為主要的引數部分要對http協議相對了解些,包括Url、HttpHeader、Get、Post、Cookie等4項。Url即為共認的Url網址。HttpHeader,指在http請求過程中,協帶的各項header資訊,如refer,host,encoding,返回的type等。 Get請求,即為在瀏覽器中看到的網址後邊的引數部分,Post請求,即為資料提交的時候對資料保護和擴大資料提交量的一種資料的提交方式。Cookie,即為小甜餅,是伺服器端向客戶端寫的資訊,往往是為了提高客戶端的使用體驗而新增的,更關鍵的是要保持住客戶端與伺服器的連線狀態。
-
5.3 Java Se:java基礎,包括:高階物件使用,IO,多執行緒,網路通訊,偶爾涉及到GUI程式設計。
-
5.4 HttpClient: 是開源的Apache的著名的java net程式設計第三方包,其實是對Java Net包的封狀,目前已為4.3版本,更為精簡易用,可以免去很多Http操作的細節操作,其核心為HttpUrlConnection的封裝。
-
5.5 Jsoup:網頁解析,是近來較受歡迎的html解析器,比htmlparser更簡單、易用、高效,故目前應用jsoup的人員急速上升,且與老牌的htmlparser對比優勢明顯,尤其是其選擇器的應用,太過強大,很有吸引用,使人不得選擇jsoup去解析httpclient得到的網頁內容。
-
5.5 database操作:關係型的mysql,sqlserver。非關係型:mongodb,ssdb,hbase,elasticsearch。
六、總結
做爬蟲系統和做別的系統很像,系統設計很關鍵,即層之間的銜接,要儘量高內聚、低耦合。 好的系統幾乎不可能一蹴而就,往往需要無數次重構與優化,這也是為什麼像nutch、hadoop、lucene等如此優秀的開源專案的更新如此頻繁, 不能說不好,只能說能做的更好,所以無數的精英都樂此不疲的去完善優秀的專案,偉大的產生,都源於對細節的孜孜不倦的追求, 希望國內的IT界也能出一些如上所述的優秀開源專案。
另外,網路爬蟲很有前途,知識面要廣,待遇相當不錯。
七、參考資料
- 引自某位老師上課的筆記