以下是我的學習筆記,以及總結,如有錯誤之處請不吝賜教
本文主要介紹一些爬蟲基礎知識。
HTTP協議:
http是一個請求<->響應模式的典型範例,即客戶端向服務器發送一個請求信息系,服務器來響應這個信息。在老的http版本中,每個請求都將被創建一個新的客戶端->服務器的鏈接,在這個連接上發送請求,然後節後請求。這樣的模式有一個很大的有點就是,簡單,容易理解和編程實現;特也有一個缺點就是效率低,因此Keep-Alive被提出用來解決效率低的問題。keep-alive功能使客戶端的鏈接持續有效,當出現對服務器的後繼請求時,keep-alive功能避免了建立或者重新建立連接。
http/1.1默認情況下所有連接都被保持,除非在請求頭或者響應頭中指明要關閉:connection:close。
主要包括:物理層(電器連接)、數據鏈路層(交換機、STP、幀中繼)、網絡層(路由器、IP協議)、傳輸層(TCP、UDP協議)、會話層(建立通信連接、撥號上網)、表示層(每次連接只處理一個請求)、應用層(HTTP、FTP),具體如下圖:
特點:①應用層的協議,②無連接:每次連接只處理一個請求,③無狀態:每次連接、傳輸都是獨立的。
HTTP HEADER:
- request:
- response:
HTTP請求方法:主要有get、head、post等等,具體如下表:
HTTP響應狀態碼:
- 2**:成功
- 3**:跳轉
- 4**:客戶端錯誤 錯誤處理:
- 500服務器錯誤 錯誤處理:
HTML語言:
是超文本標記語言,簡單來說是可以認爲一種規範或者協議,瀏覽器根據html的語言規範來解析。html中與爬蟲相關的規範有以下幾個:
DOM樹:是用來做網頁數據分析及提取,我們可以利用Tag、Class、ID來找某一類或某一種元素並提取內容:
Javascript語言:
是運行在前端的編程語言,最典型的是用在動態網頁的數據、內容加載及呈現上,Javascript做網絡請求的時候最常用的技術稱爲:AJAX(asynchoronous javascript and xml),專門用來異步請求數據。具體如下圖示例:
網頁抓取原理:
根據抓取對象類型:①靜態網頁、②動態網頁、③web service進行抓取,分爲深度優先策略和寬度優先策略兩種:
策略選擇:
- 網頁距離種子站點的距離
- 萬維網深度並沒有很深,一個網頁有很多路徑課到達
- 寬度優先有利於多爬蟲並行合作抓取
- 深度限制於寬度優先相結合
不重複策略:
記錄抓取歷史的方法:
- 將訪問過的url保存到數據庫:效率太低
- 用hashset將訪問過的url保存起來,只需要接近o(1)的代價就可以查到一個url是否被訪問過了:消耗內存
- MD5方法:url經過MD5戶SHA-1等單項哈希後再保存到HashSet或數據庫
- Bit-Map方法:建立一個bitset,將每個url經過一個哈希函數映射到某一位,①評用site方法估網站的網頁數量,②選擇合適的hash算法和空間閾值,降低碰撞機率,③選擇合適的存儲結構和算法,具體如下圖:優勢:對村抽進行進一步壓縮,在MD5的基礎上,可以衝128位壓縮到1位,一般情況,如果用4bit或者8bit表示一個url,也能壓縮32或者16倍;缺陷:碰撞概率增加
- Bloom Filter方法:使用了多個哈希函數,而不是一個。創建一個m位bitset,先將所以有位初始化爲0,然後選擇k個不同的哈希函數。第i個哈希函數對字符串str的結果記爲h(i,str),且h(i,str)的範圍是0到m-1。只能插入,不能刪除。具體結構如圖:
如何使用以上方法:
- 多數情況下不需要壓縮,尤其網頁數量少的情況
- 網頁數量大的情況下,使用Bloom Filter壓縮
- 重點是計算碰撞概率,並根據碰撞概率來確定存儲空間的閾值
- 分佈式系統,將散列映射到多臺主機的內存
網站結構分析:
- 一般網站對爬蟲都有限制,例如打開robots.txt網頁:
- 利用sitemap裏的的信息:大多數網站都會存在明確的top-down的分類的目錄結構,我們可以利用sitemap來分析網站結構和估算目標網頁的規模:
- 對網站目錄結構進行分析:例如www.mafengwo.cn這個網站,所有旅遊遊記都位於www.mafengwo.cn/mdd下,按照城市進行了分類,每個城市的遊記都位於城市的首頁,如下圖: 遊記的分頁格式: 遊記的頁面:
XPath語言:
是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。具體教程可以看:W3school
- 基本語法: @屬性:在DOM樹,以路徑的方式查詢節點,通過@符號來選取屬性,如下圖所示:rel class href都是屬性,可以通過“//*[@class='external text']”來選取對應元素;=符號要求屬性完全匹配,可以用contain方法來部分匹配,例如:“//*[contain(@class,'external')]”可以匹配,而“//*[@class='external']”則不能。 運算符:and和or運算符:選擇p或者span或者h1標籤的元素: 選擇class爲editor或者tag的元素:
正則表達式:
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特性字符,及這些特定字符的組合,組成一個規則字符串,這個規則字符串用來表發對字符串的一種過濾邏輯。一些常用規則:
在爬蟲的解析中,經常會將正則表達式與Dom選擇器結合使用。正則表達式適用於字符串特徵比較明顯的情況,但是同樣的正則表達式可能在HTML源碼中多次出現,而DOM選擇器可以通過class及id來精確找到DOM塊,從而縮小查找範圍。以下是一些常用爬蟲正則規則:
- 獲取標籤下的文本:
- 查找特定類別的鏈接,例如/wiki/不包含category目錄:
- 查找商品外鏈,例如jd的商品外鏈爲7位數字的a標籤節點:
- 查找淘寶的商品信息,或者開始及結尾:
貪婪模式及非貪婪模式:?該字符緊跟任何一個其他限制符(*,+,?,{n},{n,},{n,m})後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配搜索的字符串,而默認的貪婪模式則儘可能多得匹配搜索的字符串,具體如下圖:
To be continue......