python接口測試之urllib2的應用(十五)

2021-03-02 Python自動化測試

        在接口測試中或者說在網絡爬蟲中,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()

      如您對我寫的內容感興趣,可掃描如下二維碼關注本人的公眾號,謝謝!

           

相關焦點

  • Python接口測試之Requests
    在Python語言中,雖然提供了urllib2和urllib的庫,但是相比較而言,Requests任然是實現接口測試最好的選擇,因為它是用起來更加簡便。    在這裡重點介紹Requests中POST請求方法中請求參數data和請求參數json的區別,以及在實際工作中應用時的注意事項。
  • Python接口測試實戰丨如何實現特殊字符集的自動化測試?
    在當前網際網路產品更新迭代的快節奏下,回歸測試的時間被嚴重壓縮,在金融領域和其他網際網路應用場景下,支付、轉帳、清算往往是核心功能,為了確保資金安全和快速到帳,接口在對用戶名、帳戶名中的特殊字符的正確處理顯得尤為重要。
  • Python開發簡單爬蟲【學習資料總結】
    ;另一方面,會將新的URL補充進URL管理器,若有URL管理器中含有新的URL,則重複上述步驟,直到爬取完所有的URL 6、最後,調度器會調動應用的方法,將價值數據輸出到需要的格式。
  • 乾貨丨Python接口測試自動化實戰及代碼示例:含get、post等方法
    最終選定 python 作為腳本開發語言,使用其自帶的 requests 和 urllib 模塊進行接口請求,使用優化後的 unittest 測試框架編寫測試接口函數,測試結果選用 HTMLTestRunner 框架予以展示,並使用 python 的 ssl 模塊支持 https 協議的驗證。接下來,我詳細地介紹這些模塊,並給出各個模塊完整的測試代碼。
  • Python爬蟲核心模塊urllib的學習
    例:        其中urllib2.urlopen()變成了urllib.request.urlopen()        urllib2.Request()變成了urllib.request.Request()        urllib和urllib2模塊之間的區別        在python中,urllib和urllib2不可相互替代的
  • Python新手學習網絡爬蟲要做什麼?
    想要做爬蟲,我們就需要做到以下幾點:一、先了解html有關的知識html是一種標記語言並不難學,它是超文本標記語言,標準通用標記語言下的一個應用。「超文本」就是指頁面內可以包含圖片、連結,甚至音樂、程序等非文字元素。
  • Python高手實戰秘籍:正流行的接口測試工具requests庫,超好用!
    說到python發送HTTP請求進行接口自動化測試,腦子裡第一個閃過的可能就是requests庫了,當然python有很多模塊可以發送HTTP請求,包括原生的模塊http.client,urllib2等,但由於原生的模塊過於複雜,使用繁瑣,那麼requests庫就誕生了,它也是現階段比較流行的接口自動化測試工具之一。
  • 測試 | 如何用 Python 測試 Android 應用
    其底層基於Google uiautomator,Google提供的uiautomator庫可以獲取屏幕上任意一個APP的任意一個控制項屬性,並對其進行任意操作,但有兩個缺點:1、測試腳本只能使用Java語言。2、測試腳本必須每次被上傳到設備上運行。 我們希望測試能夠用一個更腳本化的語言,例如Python編寫,同時可以每次所見即所得地修改測試、運行測試。
  • [接口測試 - 基礎篇] 11 掌握下python解析YAML格式也是需要的
    示例如下:開源優測信息:    微信公眾號:        公眾號: DeepTest        中文名: 開源優測        創建者: 苦葉子        內容系列:                        - 接口測試                        - jmeter
  • Python爬蟲:一些常用的爬蟲技巧總結
    也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本、寫過簡單驗證碼識別腳本。提供了cookielib模塊用於處理cookies,cookielib模塊的主要作用是提供可存儲cookie的對象,以便於與urllib2模塊配合使用來訪問Internet資源.
  • 淺析Python五大領域應用
    requests模塊在python內置模塊的基礎上進行了高度的封裝,從而使得python進行網絡請求時,變得人性化,使用Requests可以輕而易舉完成瀏覽器可有的任何操作。Beautiful Soup 是用Python寫的一個HTML/XML的解析器,它可以大大節省你的編程時間。
  • Python 爬蟲:8 個常用的爬蟲技巧總結!
    用python也差不多一年多了,python應用最多的場景還是web快速開發、爬蟲、自動化運維:寫過簡單網站、寫過自動發帖腳本、寫過收發郵件腳本
  • 接口自動化測試與Tesla自動化測試平臺
    那麼我們今天就由接口測試為切入點,講一講接口測試的概念和要點,講一講Tesla平臺,及其兩種測試模式(頁面接口模式與代碼託管模式)。文章嘗試從一些基礎知識開始講述,所以比較適合初學者。同時,從接口進行測試可以快速分辨是左側的問題,或者是右側的問題。「實現後的收益更高」接口的功能一般是較為穩定的,並且也會進行前向兼容。實現後的測試,就具備重複執行的能力,也具備驗證功能回歸的能力。「實現難度較低」相對於接口測試的實現(發送並接收,校驗),UI的操作和校驗會更加難以實現。
  • 接口測試詳解JMeter學習(廣州中軟卓越)
    Apache JMeter是Apache組織開發的基於Java的壓力測試工具。用於對軟體做壓力測試,它最初被設計用於Web應用測試,但後來擴展到其他測試領域。 它可以用於測試靜態和動態資源,例如靜態文件、Java 小服務程序、CGI 腳本、Java 對象、資料庫、FTP 伺服器, 等等。
  • Python協程:概念及其用法
    Python2.x協程python2.x協程應用:python2.x中支持協程的模塊不多,gevent算是比較常用的,這裡就簡單介紹一下gevent的用法。也就是說,程序沒有等待urllib2請求網站返回結果,而是直接先跳過了,等待執行完畢再回來獲取返回值。值得一提的是,在此過程中,只有一個線程在執行,因此這與多線程的概念是不一樣的。
  • 專為滲透測試人員設計的Python工具大合集
    滲透測試就是滲透測試工程師完全模擬黑客可能使用的攻擊技術和漏洞發現技術,對目標網絡、主機、應用的安全作深入的探測,發現系統最脆弱的環節。如果說安全檢測是「橫向地毯式自動化掃描」,那麼滲透測試就是「縱向深度人工化入侵」。可見滲透測試的目的是發現目標系統潛在的業務漏洞風險。
  • Python學習第94課-通過第三方接口獲得數據並導入Python繪圖
    【每天幾分鐘,從零入門python編程的世界!】上節課我們學習了導入外部文件數據並繪圖。這節課我們學習通過第三方接口獲得數據並導入Python進行繪圖。我們的數據接口使用Tushare,Tushare是一個免費、開源的python財經數據接口包。
  • 面試題-web service接口如何測試?
    前言接口相關的測試,http 協議的接口大家平常基礎的很多,基本上問題不大。webservice 接口如何測試呢?
  • PostMan 之 Mock 接口測試
    文末有福利接口測試學習資料免費領取哦~在測試的時候經常會碰到後端開發工程師的接口還沒有開發完成
  • Python2.6低版本Python如何實現爬蟲功能
    >>> import requestsTraceback (most recent call last):File "<stdin>", line 1, in <module>File "/usr/lib/python2.6/site-packages/requests/__init__.py", line