爬蟲之靜態網頁爬蟲(基礎知識)


1.環境搭建-Python Unix                               基礎環境-Windows

  1.pip,並設置pip源                                1.直接下載Anaconda,很多比較難以安裝的資源都已經包含了

   配置pip conf,自動設置源                             配置pip源,各個系統默認pip.ini位置不同,需要根據實際情況設置

    #mkdir ~/.pip/                                   官網:http://anaconda.org/

    #vim~/.pip/pip.conf                                下子主頁:https://www.continuum.io/downloads

    [global]

    index-url=http://pypi.tuna.tsinghua.edu.cn/simple

  也可以每次安裝的時候制定source

    #pip install -i http://pypi.tuna.tsinghua.edu.cn/simple xlml

2.http協議

  物理層:電器連接

  數據鏈路層:交換機(可以為接入交換機的任意兩個網絡節點提供獨享的電信號通路)、

        STP(生成樹協議,可以應用於在網絡中建立樹形拓撲,消除網絡中的二層環路,並且可以通過一定的方法實現路徑冗余)、

        幀中繼(公共或專用網上的局域網互聯等,是一種數據包交換通信網絡)

  網絡層:路由器、IP協議

  傳輸層:TCP、UDP協議

  會話層:建立通信連接、網絡撥號

  表示層:每次連接只處理一個請求

  應用層:HTTP、FTP

  (無連接:每次連接只處理一個請求)

  (無狀態:每次連接傳輸都是獨立的)

3.HTTP HEADER(header)

  REQUEST(request)部分的HTTP HEADER                              RESPONSE(response)部分的HTTP HEADER

  Accept:text/plain                                           Accept-Patch:text/example;charset=utf-8 

  Accept-Charset:utf-8                                         Cache-Control:max-age=3600

  Accept-Encoding:gzip,deflate                                      Content-Encoding:gzip

  Accept-Language:en-US                                         Last-Modified:Tue,15 Nov 1994 12:46:13 GMT

  Connection:keep-alive                                           Content-Language:da

  Content-length:348                                          Content-Length:348

  Content-type:application/x-www-form-urlencoded                             ETag:" 737060cd8c284d8af7ad3082f209582d"

  Date:Tue,15Nov,1994 08:15:48 GMT                                   Expires:Thu,01 Dec 1994 16:00:00 GMT

  Host:en.wikipedia.org:80                                        Location:http://www.w3.org/pub/WWW/people.html  

  User-Agent:Mozilla/5.0(x11;Linux x86-64;rv:12.0)Gecko/20100101 Firefox/21.0               Set-Cookie:UserID=JohnDoe;Max-Age=3600;Version=1             

  Cookie:$Version=1;Skin=new;                                      Status:200 OK

4.keep-alive

  HTTP是一個 請求<->響應 模式的典型范例,即客戶端向服務器發送一個請求信息,服務器來響應這個信息。在老的HTTP版本中,每個請求都將被創建一個新的 客戶端<->服務器 的連接,在這

  個連接上發送請求,然后接受請求。這樣的模式有一個很大的優點,比較簡單,很容易理解和編程實現;但也有一個很大的缺點,就是效率比較低,因此keep-Alive被踢出來用來解決效率低問題。

  keep-Alive功能使客戶端到服務器端的連接持續有效,當出現對服務器的后繼請求時,keep-Alive功能避免了建立或者重新建立連接。

  http/1.1

  默認情況下所在HTTP1.1中所有連接都被保持,除非在請求頭或響應頭中指明要關閉:Connection:Close

5.HTTP請求方法

    

6.HTTP響應狀態碼

  2xx  成功

  3xx  跳轉

  4xx  客戶端錯誤

  500  服務器錯誤

  http響應狀態碼300

    1.300 Multiple Choices   存在多個可用的資源,可處理或丟棄

    2.301 Moved Permanetly  重定向(通過各種方法將各種網絡請求重新定個方向跳轉到其它位置)

    3.302 Found        重定向

    4.304 Not Modified    請求的資源未更新,丟棄

  一些Python庫,例如urllib2已結對重定向做了處理,會自動跳轉;動態網頁處理的時候,也是自動跳轉,所以不需要單獨處理

  http響應狀態碼400、500                                             錯誤處理:   

    1.400 Bad Request  客戶端請求有語法錯誤,不能被服務器所理解                      400  檢查請求的參數或路徑

    2.401 Unauthorized  請求未經授權,這個狀態碼必須和WWW-Authenticate報頭域一起使用            401     如果需要授權的網頁。嘗試重新登錄

    3.403 Forbidden    服務器收到請求,但拒絕提供服務                           403  如果需要登錄的網站,嘗試重新登錄;IP被封,暫停爬取,並增加爬蟲的等待時間,如果撥號網絡,嘗試重新聯網更改IP

    4.404 Not Found   請求資源不存在,例如:輸入錯誤的URL                          404  直接丟棄                     

    5.500 Internal Server Error    服務器發生不可預測的錯誤                            5xx  服務器錯誤,直接丟棄,並技數,如果連續不成功,WARNING並停止爬取

    6.503 Server Unavailable  服務器當前不能處理客戶端的請求,一段時間后可能恢復正常

7.HTML

  HTML是超文本標記語言,簡單來說是可以認為是一個規范或者協議,瀏覽器根據HTML的語言規范來解析

  在HTML里,與爬蟲先關的規范有以下:

    這一類tag標記了外鏈用來做抓取,而tr、p用來進行內容抽取

      tag:<a> <tr> <p>

    id、class用在css上的,能幫助我們定位元素,作用於tr  p類似:

      class:class=:“home-price”

      Id:id=‘price-frame’

8.DOM樹

  DOM樹最重要的作用是用來做網頁數據分析及提取,我們可以充分利用TAG、CLASS、ID來找出某一類或某一個元素並提取內容

9.JavaScript

  JavaScript就是運行在前端的編程語言,最典型的用在動態網頁的數據、內容加載及呈現上,JavaScript做網絡請求的時候最常用的技術為AJAX,專門用來異步請求數據,這些數據是我們抓取的時候要用到的

10.爬蟲的抓取對象類型

    1.靜態網頁

    2.動態網頁

    3.web Service

    4.Web API數據獲取

11.抓取的策略

    1.深度優先策略    2.寬度優先策略

  1.一般選用哪種策略?

    1.重要的網頁距離種子站點比較近

    2.萬維網的深度並沒有很深,一個網頁有很多路徑可以到達

    3.寬度優先有利用多爬蟲並行合作抓取

    4.深度限制與寬度優先相結合

  2.如何記錄抓取歷史?

    1.將訪問過的URL保存到數據庫    #效率太低

    2.用HashSet將訪問過的URL保存起來。那只需接近O(1)的代價就可以查到一個URL是否被訪問過了。#消耗內存

    3.URL經過MD5或SHA-1等單向哈希后再保存到HashSet或數據庫

    4.Bit-Map方法,建立一個BitSet,將每一個URL經過一個哈希函數映射到某一位。

12.MD5函數

    MD5簽名是一個哈希函數,可以將任意長度的數據轉化為一個固定長度的數字(通常是4個整形,128位)。計算機不可能有2的128那么大的內存,因此實際的哈希表都會是URL,

    MD5再%n(即取模)。現實世界的URL組合必然超越哈希表的槽位數,因此碰撞是一定存在的,一般的HASH函數,例如Java的HashTable是一個HASH表再跟上一個鏈表,鏈表里

    存的是碰撞結果

      BITMAP記錄方式

        將URL的MD5值再次哈希,用一個或多個BIT位來記錄一個URL

          1.確定空間大小。例如:Facebook   1.5GB

          2.按倍增加槽位。例如:16GB

          3.HASH算法映射Python:mmh3 bitarray

        優勢:對存儲進行了進一步壓縮,在MD5的基礎上,可以從128位最多壓縮到1位,一般情況,如果用4bit或者8bit表示一個url,也能壓縮32或者16倍

        缺陷:碰撞概率增加

13.提高效率

    1.評估網站的網頁數量

    2.選擇合適的HASH算法和空間閾值,降低碰撞幾率

    3.選擇合適的存儲結構和算法  

14.Bloom Filter

    Bloom Filter使用了多個哈希函數,而不是一個。創建一個m位BitSet,先將所有的位初始化為0,然后選擇k個不同的哈希函數。第i個哈希函數對字符串str哈希的結果

    記錄為h(i,str),且h(i,str)的范圍是0到m-1。只能插入,不能刪除。

15.如何有效的記錄抓取歷史?

    多數情況下不需要壓縮,尤其網頁數量少的情況

    網頁數量大的情況下,使用Bloom Filter壓縮

    重點是計算碰撞概率,並根據碰撞概率來確定存儲空間的閾值

    分布式系統,將散列映射到多台主機的內存

16.網站結構分析

    Robots.txt

    網站對爬蟲的限制

    利用sitemap來分析網站結構和估算目標網頁的規模

17.有效抓取特定內容

    利用sitemap里的信息,直接對目標網頁.html進行抓取

    對網站目錄結構進行分析

    大多數網站都會存在明確的top-down的分類的目錄結構,可以進入特定的目錄進行抓取

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM