1.環境搭建-Python Unix 基礎環境-Windowscss
1.pip,並設置pip源 1.直接下載Anaconda,不少比較難以安裝的資源都已經包含了html
配置pip conf,自動設置源 配置pip源,各個系統默認pip.ini位置不一樣,須要根據實際狀況設置前端
#mkdir ~/.pip/ 官網:http://anaconda.org/web
#vim~/.pip/pip.conf 下子主頁:https://www.continuum.io/downloads算法
[global]數據庫
index-url=http://pypi.tuna.tsinghua.edu.cn/simple編程
也能夠每次安裝的時候制定sourcevim
#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的分類的目錄結構,能夠進入特定的目錄進行抓取