在接口測試中或者說在網絡爬蟲中,urllib2庫是必須要掌握的一個庫,當然還有優秀的requests庫,今天重點來說urllib2庫在接口測試中的應用。urllib2定義了很多的函數和類,這些函數和類能夠幫助我們在複雜情況下獲取URLS的內容。這些情況包含了對headers的添加,cookie的處理,代理,超時,鑑權等的處理。如果想詳細的了解urllib2庫,建議到官方查看,官方地址:https://docs.python.org/2/library/urllib2.html。查看urllib2庫的詳細的幫助文檔,見執行的代碼:
#!/usr/bin/env python
#-*-coding:utf-8-*-
import urllib2
print type(help(urllib2))
首先我們來看一個完整的請求和響應內容,然後通過urllib2的庫來實現這樣的一個過程,我們訪問http://m.cyw.com/切換城市,見抓取的信息,見截圖:
見客戶端發送請求後,服務端響應回復的內容截圖:
在如上的截圖中,我們知道了請求的URL,方法以及請求的參數,下來我們使用urllib2的庫來實現一個完整的請求過程和響應內容,見實現的代碼:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def selCity():
'''使用urllib2實現一個城市選擇的完整請求和響應內容'''
data = urllib.urlencode({'cityId': '438'})
r = urllib2.urlopen(
url='http://m.cyw.com/index.php?m=api&c=cookie&a=setcity',
data=data)
print u'http的狀態碼:', r.getcode()
print u'響應內容:', r.read()
調用如上的函數後,見執行的結果:
http的狀態碼: 200
響應內容: {"status":true,"homeUrl":"\/xian"}
在接口的測試中,客戶端向服務端發起請求的時候,需要添加header這樣服務端,否則服務端會拒絕客戶端的請求,那麼在urllib2庫中,如何添加header了,見如下的案例代碼:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def login():
'''通過一個接口來測試請求頭headers的處理'''
headers= {
'Content-Type': 'application/json; charset=UTF-8',
'Parkingwang-Client-Source': 'ParkingWangAPIClientWeb'}
data=urllib.urlencode(
{"username": "autoapi",
"password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
"role": 2}
)
request=urllib2.Request(url='https://ecapi.parkingwang.com/v4/login',
data=data,
headers=headers)
r=urllib2.urlopen(request)
print r.getcode()
print r.read()
login()
發送一個request的請求,然後請求資源,在該實例中,如果沒有headers,發送請求,會顯示404的錯誤信息,見不帶header發送請求後服務端的響應內容:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def login():
'''通過一個接口來測試請求頭headers的處理'''
data=urllib.urlencode(
{"username": "autoapi",
"password": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92",
"role": 2})
r=urllib2.urlopen(url='https://ecapi.parkingwang.com/v4/login',
data=data)
print r.getcode
login()
見執行函數後的錯誤信息,顯示為:
File "C:\Python27\lib\urllib2.py", line 556, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: Not Found
下來來看urllib2的庫對cookie的處理,對cookie的處理分為二種方式,一種是自動處理cookie,會使用到cookielib,另外一種是自己設置添加cookie,我們先看自動處理cookie的一種方式,我們模擬請求百度,然後循環看百度的cookie,見實現的代碼:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def baidu():
'''通過一個例子來看cookie的處理'''
import cookielib
# 對cookie進行管理
cookie = cookielib.CookieJar()
# 對cookie進行自動管理
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
r = opener.open('http://www.baidu.com')
print r.getcode()
for item in cookie:
print item
調用函數後,見執行後列印的內容:
200
<Cookie BAIDUID=8C777D00B26945AAC27AA4952BC00CE4:FG=1 for .baidu.com/>
<Cookie BIDUPSID=8C777D00B26945AAC27AA4952BC00CE4 for .baidu.com/>
<Cookie H_PS_PSSID=1460_21087 for .baidu.com/>
<Cookie PSTM=1519292146 for .baidu.com/>
<Cookie BDSVRTM=0 for www.baidu.com/>
<Cookie BD_HOME=0 for www.baidu.com/>
下面我們來看自己設置添加cookie的方式,我們知道在登錄一個系統成功後,再去請求系統中的信息,如果不帶cookie系統會拒絕客戶端的請求,理由很簡單就是服務端要確保訪問系統的用戶是經過登錄系統成功後才可以具備權限訪問,這樣也是安全角度的考慮,見如下通過自己設置添加cookie實現的方式,見實現的代碼:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def cookie():
'''通過自己設置添加cookie'''
opener=urllib2.build_opener()
opener.addheaders.append(('Cookie','_gitlab_session=ec998d5f778e2929e5235d24250e94cd; session=.eJwdzkFrwkAQhuG_UubsQaOnQC8SXSzMBGWSMHMRGtPujsklVmJW_O_d9vDBd3ngfcL5a-xuHvKf8d4t4BwukD_h7RNyoHhYY3GdJDs-tKnWyrJRd3xgs8tKh0t1tZWOTNkb8iWg9b0OJ4_Z3v4-udqjVRmlCScXt6FkH4jblZhMYocJ48mkkZlcNYt9z8R-kJgst1EZl8jbQMXHQLbvpcGoJrPydUNFmxp2ydVBGN_htYD7rRv_-2EFr1_dGUj6.DVcwRw.mOjs2qGQ5W4mOHn4yiB3pkqMi0A'))
request=urllib2.Request('http://117.39.63.66:20080/depot/parks?start=0&length=10&draw=1')
r=opener.open(request)
print r.getcode()
print r.headers
print r.read()
下來來看超時的處理,在實際的請求中,由於網絡等因素,導致請求失敗,會報socket.timeout: timed out的錯誤,如果出現這樣的錯誤說明請求超時,我們需要在請求的時候對處理做處理,先來模擬超時的請求,如模擬超時的代碼:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def timeout():
'''通過一個例子來看超時'''
r=urllib2.urlopen('http://www.baidu.com',timeout=0.01)
print r.getcode()
print r.read()
timeout()
見執行後列印的錯誤信息:
File "C:\Python27\lib\socket.py", line 480, in readline
data = self._sock.recv(self._rbufsize)
socket.timeout: timed out
下來我們對該錯誤進行處理,在請求的時候處理下超時的情況,見處理後的代碼:
# !/usr/bin/env python
# -*-coding:utf-8-*-
import urllib2
import urllib
def timeout():
'''通過一個例子來看超時'''
r=urllib2.urlopen('http://www.baidu.com',timeout=2)
print r.getcode()
print r.read()
timeout()
如您對我寫的內容感興趣,可掃描如下二維碼關注本人的公眾號,謝謝!