1. 程式人生 > >網路爬蟲原理(概要了解)

網路爬蟲原理(概要了解)

一、網路爬蟲原理
1.1 等同於瀏覽器訪問網頁的原理
(1)真人行為驅動
(2)瀏覽器自動執行人為的動作,即將動作自動程式化。
1.2 網路爬蟲就是將瀏覽器訪問網頁的過程,再次抽像成程式。

二、網路爬蟲分類
2.1 按連結的訪問層次的先後來分
寬度優先和深度優先。
寬度優先:即在下載網頁連結時,是以一層一層的連結來爬取。
深度優化:以先訪每層中第一個未訪問節點為先,依次下行迭代迴圈。
寬度和廣度混和方式:nutch就是典行的支援這種方式。depth=3,topN=50

2.2 按爬蟲應用來分
漫爬型爬蟲:百度、谷歌爬蟲,沒有目標,以連結為中心去爬,不限制站點的資料,資料儲存直接為單個網頁的文字,不進行格式化方面的抽取,一般只做正文、接要、主題詞等的抽取,方便索引和搜尋。
垂直型爬蟲:內容聚焦,比如說淘寶爬蟲、微博爬蟲、電商爬蟲,而且往往資料直接格式化為結構化資料。

三、網路爬蟲的一般作法
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。非關係型 redis,mongodb。

一、網路抓包工具介紹和選擇
1.1 按面向的物件分類
瀏覽器抓包工具和全域性抓包工具

瀏覽器抓包工具:
IE Developer(自帶)
Chrome Developer(自帶)
FireFox Developer(自帶)
FireFox Firebug:只針對firefox
HttpWatch: 只針對IE瀏覽器
FireFox HttpFox:只針對firefox自帶抓包,簡單易用,但不利於複雜應用。
全域性抓包工具:
Http Analyzer: 針對http、https協議的本機與網路通訊時的抓包工具
WireShark: 什麼都行,主要是tcp、ip包層次,它是http協義的下一層,所以依然可以捕捉到http請求的所有資料。
有windows版的,也有linux版的,應用極為常見。但主要應用網路實時流之tcp、ip包分析上,而不怎麼用其做爬蟲的抓包工具。
Fiddler:c#實現的爬蟲工具,也很強大,可以修改網路通訊中的包,方便除錯。
Winpcap: 與wireshark類似,但只能應用於windows系統。

1.2 選擇方法
1、功能穩定和齊全(根據它就排除掉了瀏覽器自帶抓包工具)
2、熟悉習慣
跟個人相關,我一直習慣用httpwatch,主要是能滿足當前實際應用的需求。
在實際開發當中,一般選擇瀏覽器自帶+第三方抓包,即我用IE Developer+HttpWatch8.5版本配合來搞定問題。
二、瀏覽器抓包工具經典應用
1、web專案的開發測試,(比較簡單,不用第三方抓包工具亦可)
2、非爬蟲性質的抓包分析 (比較簡單,不用第三方抓包工具亦可)
3、爬蟲的抓包分析 (情況相對比較複雜,一般要採用瀏覽器自帶+第三方抓包)

三、 抓包demo示例
1、主要以IE Developer+HttpWatch為工具,
以簡單站點:新浪新聞為例,http://news.sina.com.cn/
簡單的特點:內容基本在直接請求的URL中,且沒有特定的許可權驗證。而且沒有特別的js等內容動態解析。
以複雜站點:新浪微博為例,http://www.weibo.com/
複雜的特點:內容的構成往往源於多個請求,且資料的組織方式多樣,偶爾涉及到ajax請求和js的資料動態填充。
2、http協議小介
(1)http協議包括的method,主要為get,post,put,delete。
get代表是查,post代表是更新,put代表上傳,delete代表刪除。 後續在落實時,人們把這幾件事都歸在了get、post當中,很少有相應去專門符合協議去傳送method request。
(2)http協議status code
1** : 代表的是伺服器已收到資訊,但還沒處理完,將繼續。
最原始的ajax請求中,是以判斷status code來決定是否該次的ajax非同步請求完成,或狀態。
2** : 返回狀態,一般是代表成功終止,即正常的一次請求完成。
等於200,代表ok
3** : 請求的轉移。
301:永久轉移,會在響應頭中跟隨location這個key,來標誌下次該跳轉的目標URL地址。
302:臨時轉移,。。。
304:無更新,從快取中取資料。
4** : 客戶端錯誤。
400客戶端格式錯誤。401無許可權。403禁止訪問。404:file not found,檔案找不到。
5** :伺服器錯誤。
500:伺服器端處理當中出現異常。
(3)http header引數
accept: 客戶端可接受的資料型別。
text/html,即html的文字
application/xhtml+xml,即xhtml,像jsp,asp等都屬於這種
accept-encoding: 客戶端要求伺服器返回的資料編碼格式,
一般設為gzip,deflate的為多,好gzip壓縮,其演算法為deflate。肯定是無失真壓縮。
accept-language:要求的自然語言,注意語言和編碼的概念不同。
connection :代表client與server的連結性,是keep-alive或是none
cookie :client與server之間的溝通狀態資訊。
host: client發過去請求後,由哪個地址來解析該請求。
If-Modified-Since :代表該網頁自哪個時間開始,沒有再改變過。
user-agent: 即ua,客戶端把os、browser type等封裝成ua傳送給伺服器端。
//上邊為http header send部分,下邊為http header received部分
age: 代表該頁是從快取中取出後的多長時間。
cache_control:伺服器要求客戶端是否快取該網頁。
Content-Encoding:server給client的資料的編碼格式,往往為gzip。
Content-Length: server 給client端傳送資料的總位元組數,經常用於判斷是否接收結束。
Content-Type:返回資料的型別,一般為text/html,即純文字型別
(4)http cookie引數
cookie包括兩部分,一部分sent,一部分是receive。
要嚴格區分開,在爬蟲開發的過程中,構建cookies時尤為重要。
cookie中往往包括N多的key,要儘量找出其關鍵的key。

(5) ETAG和if-modified-since
都跟過期時間有關。很多網址是不更新if-modified-since,而是通過一個hash值或是時間值來給ETAG,標誌該資源是否有過更新,從而使資源的更新與時間無關,而與這個key有關。

(6) get和post的區別
引數傳遞方式不一樣:get較簡單,post是不在位址列中顯示的,而且相應的生成對應掩碼的方式,較安全。
引數的傳遞渠道不同,get走的是http協議頭,往往被瀏覽器、os限制了長度,往往小於2KB。
post走的是http訊息體,長度不限制。

四、總結
抓包分析是爬蟲研發的最基礎和關鍵的步驟。
要足夠細心和耐心,開發時應採取循序漸進的步驟,並在每個關鍵環節留有日誌輸出,方便爬蟲問題的問題跟蹤與追根溯原。