httplib模塊是一個專門用於http的模塊,urllib和urllib2也都是基於對它進行了更上層次的封裝javascript
我記得剛開始的時候,公司用的cdn有段時間抽風,全球40多個節點老是有那麼幾個節點
不一樣步,致使玩家加載的是老的活動圖片,玩家在論壇抱怨,國外的玩家抱怨,那可
不像國內的(客服MM萬篇一概:您的狀況我已經收到,已經在處理了請稍後)。
國外的要是不立馬趕忙立刻處理好,玩家會直接撤款,搞很差還告你。。
論壇一旦接到這樣的狀況立刻就得打電話給咱們,管尼碼半夜幾點。(運維的悲哀)
剛開始時候只能寫host綁域名而後打開瀏覽器一個一個去測。40多個地址啊,手工去弄起碼20分鐘之後才能查出來是哪一個節點不一樣步
後來就直接寫腳本完成了,40多個節點測完也頂多一分把鐘的事情
原理:通常CDN都是按照地區智能DNS解析的。每一個地區ping出來的地址都不同。按照本地鏈接連接域名的方式是無法遍歷那些節點的,你只能得到離你最近的那個節點(要麼就像我寫host那樣弄)。
後來想到一個辦法HTTP是基於TCP/IP的,凡是基於TCP/IP的都是能夠用IP地址通訊的,而web服務器,都是識別主機名的(就是域名),因而就寫了相似下面這個腳本的用來測試。。
源腳本在之前公司的服務器上,這個我是用58的cdn測的(他們用的網宿的)html
1 coding:utf-8 2 import httplib 3 import hashlib 4 uri="/js/v7/hp/19h_79463675356567.js" #url路徑 5 #CDN節點的IP列表,第一個是本地虛擬機,web目錄下沒文件的 6 cdnnode=["192.168.1.90","58.221.56.5","117.21.189.108","182.140.147.57","113.107.56.96","58.51.95.157","113.107.236.12","198.47.104.131","209.170.78.73"] 7 Host="pic2.58.com" #CDN用的域名 8 for i in cdnnode: 9 conn=httplib.HTTPConnection(i) #先連接上IP 10 conn.request(method="GET", #以GET的方式發送請求 11 url=uri, #請求的web路徑 12 headers={'Host':Host, #請求頭裏面的主機名, 13 "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, lik e Gecko) Chrome/33.0.1750.152 Safari/537.36",#這個是我模擬的瀏覽器信息 14 "Referer":"im is test"})#請求來源(那些防盜鏈的基本上就是檢查這個字段),原本就測試用的 15 response=conn.getresponse() #獲取CDN的迴應內容信息 16 print i,response.status #打印IP和http狀態碼 17 print response.getheaders() #打印迴應頭信息,以列表嵌元組的方式表示 18 print hashlib.md5(response.read()).hexdigest() #讀取回應的內容信息,而後再計算出他的MD5值 19 print 20 conn.close() #連接關閉
執行結果java
1 root@zing:~/Desktop# python h.py 2 192.168.1.90 404 #本地虛擬主機裏面沒有那個文件,因此飯或404頁面 3 [('date', 'Thu, 03 Apr 2014 02:12:42 GMT'), ('content-length', '571'), ('content-type', 'text/html'), ('connection', 'keep-alive'), ('server', 'nginx/1.0.15')] 4 d0ad532febcf12aa3559ce2a3f8324b8 #這是404頁面的MD5值 5 6 #下面的是cdn的測試數據,從x-via的最後一部分能夠看出他們使用的是不一樣的節點 7 58.221.56.5 200 8 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 nt42:0 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')] 9 10f96bdb2285851ee5b553dcd3bdd5e1 10 11 117.21.189.108 200 12 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 jxjj111:10 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')] 13 10f96bdb2285851ee5b553dcd3bdd5e1 14 15 182.140.147.57 200 16 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 cdxx61:6 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')] 17 10f96bdb2285851ee5b553dcd3bdd5e1 18 19 113.107.56.96 200 20 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 jydx39:0 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:43 GMT'), ('content-type', 'application/x-javascript')] 21 10f96bdb2285851ee5b553dcd3bdd5e1 22 23 58.51.95.157 200 24 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 hbxf145:2 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:44 GMT'), ('content-type', 'application/x-javascript')] 25 10f96bdb2285851ee5b553dcd3bdd5e1 26 27 113.107.236.12 200 28 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx20:88 (Cdn Cache Server V2.0), 1.1 zjjhdx36:8104 (Cdn Cache Server V2.0), 1.1 gdyf15:1 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:44 GMT'), ('content-type', 'application/x-javascript')] 29 10f96bdb2285851ee5b553dcd3bdd5e1 30 31 198.47.104.131 200 32 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx22:8104 (Cdn Cache Server V2.0), 1.1 hdwt37:8107 (Cdn Cache Server V2.0), 1.1 mgdls130:3 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:45 GMT'), ('content-type', 'application/x-javascript')] 33 10f96bdb2285851ee5b553dcd3bdd5e1 34 35 209.170.78.73 200 36 [('content-length', '14803'), ('accept-ranges', 'bytes'), ('x-via', '1.1 jszjsx22:8104 (Cdn Cache Server V2.0), 1.1 hdwt37:8107 (Cdn Cache Server V2.0), 1.1 fra72:1 (Cdn Cache Server V2.0)'), ('server', 'nginx/1.4.2'), ('last-modified', 'Mon, 03 Mar 2014 07:28:52 GMT'), ('connection', 'keep-alive'), ('etag', '"53142f34-39d3"'), ('date', 'Wed, 02 Apr 2014 14:14:33 GMT'), ('content-type', 'application/x-javascript'), ('age', '1')] 37 10f96bdb2285851ee5b553dcd3bdd5e1
一些經常使用的方法函數
request(method,url,body,head):
method:請求的方式,通常是post和get
url:請求的資源路徑
body:須要提交到服務器上的數據,通常須要用urllib.urlencode(date) 編碼一次才行,若是提交的是json數據的話須要調用json模塊
header:請求頭
response.read():讀取響應消息內容
response.getheader('name'):name爲指定的頭
response.getheaders():覺得列表嵌元組的方式獲取響應headernode