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的分類的目錄結構,可以進入特定的目錄進行抓取