python requests

1、Requests發送HTTP請求html

案例:選定某個測試的URL,利用requests庫內置的不一樣的方法來發送不一樣類型(GET/POST/PUT/DELETE)的http請求,並輸出響應的狀態碼python

請求方式web

請求URLjson

GETapi

http://httpbin.org/get瀏覽器

POST服務器

http://httpbin.org/postcookie

PUT網絡

http://httpbin.org/putsession

DELETE

http://httpbin.org/delete

request basic.py

# 導入requests庫

import requests

 

# 定義base_url做爲基礎被測URL

base_url = 'http://httpbin.org'

 

# 發送get請求;打印響應狀態碼

r = requests.get(base_url+'/get')

print(r.status_code)

 

# 發送POST請求;打印響應狀態碼

r = requests.post(base_url+'/post')

print(r.status_code)

 

# 發送PUT請求;打印響應狀態碼

r = requests.put(base_url+'/put')

print(r.status_code)

 

# 發送DELETE請求,打印響應狀態碼

r = requests.delete(base_url+'/delete')

print(r.status_code)

執行結果:
發送4種不一樣請求,對應響應狀態碼都是200,請求發送OK

 

 

2、Requests參數傳遞

1.傳遞URL參數

案例:利用Requests庫,在GET請求中使用查詢字符串(Query String)傳遞參數。

# 導入requests庫

import requests

 

# 定義base_url做爲基礎被測URL

base_url = 'http://httpbin.org'

 

# 定義請求所需的參數,參數之間以英文逗號隔開

param_data = {'uname':'Test00001','pwd':'123456'}

# 發送GET請求,格式如:requests.get(url,params)

r = requests.get(base_url+'/get',params=param_data)

print(r.url)    # 輸出請求的url

print(r.status_code)    #輸出響應的狀態碼

執行結果:

 

2.傳遞Body參數

案例:利用Requests庫,在POST請求的請求體(Request Body)中傳遞參數

import requests

base_url = 'http://httpbin.org'

 

form_data = {'uname':'Test00002','pwd':'123456'}

# 發送POST請求,格式如:requests.post(url,data)

r = requests.post(base_url+'/post',data=form_data)

print(r.text)   # 返回響應內容

執行結果:

 

3、Requests請求頭設置

1.設置Request Headers

案例:利用Requests庫,爲POST請求添加HTTP Headers,此時須要傳遞一個字典類型的數據給headers參數

import requests

 

base_url = 'http://httpbin.org'

 

form_data = {'uname':'Test00003','pwd':'123456'}

header = {'user-agent':'Mozilla/5.0'}

r = requests.post(base_url+'/post',data=form_data,headers=header)

print(r.text)  #以文本形式返回響應內容

執行結果:

 

print(r.text)表明以文本形式返回響應內容

若以上代碼修改成print(r.json()),表明以json形式返回響應內容,以下:

 

2.Request Headers爬蟲應用

爬蟲程序經過定製Request Headers來模擬瀏覽器的訪問行爲,以應對網站的反爬蟲策略,避免被封。

如:爬取知乎頁面元素時,須要設置與瀏覽器一致的請求頭,而後再發送請求
測試url:https://www.zhihu.com/explore

情形1:不設置Request Headers

import requests

r = requests.get('https://www.zhihu.com/explore')

print(r.text)

執行結果:
400狀態,錯誤請求,服務器沒法解析請求

 

情形2:設置Request Headers

(從瀏覽器Copy一份User-Agent做爲設置的Headers)

 

import requests

header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

r = requests.get('https://www.zhihu.com/explore',headers=header)

print(r.text)

執行結果:
可正常返回頁面的元素

 

 

4、Requests Cookies設置

1.設置Cookies

經過cookies參數能夠設置Cookie

request advanced.py

import requests

 

base_url = 'http://httpbin.org'

 

cookie = {'uid':'666'}

r =requests.get(base_url+'/cookies',cookies=cookie)

print(r.text)

執行結果:

 

2.獲取Cookies

首頁對某個站點發起請求,而後獲取其Cookies(經過調用cookies屬性便可獲取所請求站點的cookies)

r = requests.get('http://www.baidu.com')

print(r.cookies)

print(type(r.cookies))

 

for key,value in r.cookies.items():

    print(key+':'+value)

執行結果:

 

從以上輸出結果中能夠觀察到:
1)所獲取的cookies的類型是RequestCookieJar類型
2)用items()方法將所獲取的cookies轉化爲元組組成的列表,而後遍歷輸出每個cookie的名稱和值,實現cookies的遍歷解析

 

5、Requests超時設置 & 文件上傳

1.超時設置

將timeout做爲參數項,若響應超過設置的時間後即中止等待響應,以防某些請求沒有響應而一直處於等待狀態
1)先獲取響應時間

import requests

 

base_url = 'http://httpbin.org'

 

cookie = {'uid':'666'}

r = requests.get(base_url+'/cookies',cookies=cookie)

print(r.text)

print(r.elapsed.total_seconds())    # 獲取響應時間(s)

 

2)設置等待響應的超時時間

cookie = {'uid':'666'}

r = requests.get(base_url+'/cookies',cookies=cookie,timeout=0.5)

print(r.text)

執行結果:(鏈接超時,拋出異常)
requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='httpbin.org', port=80): Max retries exceeded with url: /cookies (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x02043BB0>, 'Connection to httpbin.org timed out. (connect timeout=0.5)'))

2.文件上傳

Requests利用files做爲參數模擬提交文件數據

file = {'file':open('test.bmp','rb')}   #rb表示用二進制格式打開指定目錄下的文件,且用於只讀

r =requests.post(base_url+'/post',files=file)

print(r.text)

執行結果:
指定目錄下(本次與腳本文件在同一目錄)的圖片數據通過編碼已經提交ok

 

 

6、Session會話對象

會話(Session):Session對象存儲特定用戶會話所需的屬性及配置信息。當用戶在應用程序的Web頁面之間跳轉時,存儲在Session對象中的變量將在整個用戶會話過程當中一直存在,以確保在不一樣頁面中操做的是同一個用戶。

在接口測試過程當中接口之間常常有依賴關係,如某個接口中的數值傳遞到另一個接口做爲參數傳遞使用。

案例:A請求是設置 Cookie,B請求是獲取Cookie。若沒有Session保存機制的狀況下,B接口是無法獲取到A接口設置的Cookie值。

# 設置Cookies。{name}/{value}分別設置Cookie的名稱和值

http://www.httpbin.org/cookies/set/{name}/{value}

# 獲取Cookies

http://www.httpbin.org/cookies

 

場景①:未啓用Session保存機制

執行代碼:

# A接口設置Cookie

r = requests.get(base_url+'/cookies/set/uid/666')

print(r.text)

 

print('--------------------')

 

# B接口獲取Cookie

r = requests.get(base_url+'/cookies')

print(r.text)

執行結果:

 

場景②:啓用Session保存機制

Requests的會話對象可以跨請求保持某些參數,也會在同一個Session實例發出的全部請求之間保持cookie一致。
適用場景:利用Session能夠模擬同一個會話,如模擬登陸成功以後再進行後續操做

執行代碼:

# 生成會話對象

s = requests.session()

 

# 利用會話對象調用接口A並設置cookie

r = s.get(base_url+'/cookies/set/uid/666')

print(r.text)

 

print('--------------------')

 

# 利用同一會話對象調用接口B並獲取cookie

r = s.get(base_url+'/cookies')

print(r.text)

執行結果:

 

 

7、SSL驗證 & 代理設置

1.SSL證書驗證

Requests能夠模擬Web瀏覽器,實現對HTTPS請求來驗證SSL證書。SSL驗證默認是開啓的,若證書驗證失敗,Requests會拋出SSLError;若不想驗證SSL則可使用verify參數(verify=False)關閉驗證SSL。

以驗證12306網站的證書爲例,以下:

1)保持默認開啓SSL證書驗證,發送請求
執行代碼:

import requests

r = requests.get('https://www.12306.cn')

print(r.text)

執行結果:
ssl.CertificateError: hostname 'www.12306.cn' doesn't match either of 'webssl.chinanetcenter.com', 'i.l.inmobicdn.net', ...
PS:12306的證書是本身頒發給本身的,若不關閉SSL認證時,會出現認證失敗

2)利用verify參數關閉驗證SSL
執行代碼:

import requests

r = requests.get('https://www.12306.cn',verify=False)

print(r.text)

執行結果:

 

2.代理設置

代理(Proxy):網絡代理是一種特殊的網絡服務,容許一個網絡終端(客戶端)經過代理服務與另外一個網絡終端(服務器)進行非直接的鏈接。代理服務器位於客戶端和服務端之間,代理服務器接收客戶端的請求,而後代替客戶端向目標網站發出請求,全部的流量路由均來自代理服務器的IP地址,從而實現獲取一些不能直接獲取的資源。

測試過程當中,有的接口在請求少許次數時,可正常獲取內容。但若大量頻繁請求(如:性能測試場景),服務器可能會開啓驗證,甚至直接把IP封禁。爲了防止以上狀況影響正常測試,此時就須要設置代理來解決。在Requests中須要用到proxies參數,在爬蟲時也會經常使用到代理設置。

測試過程當中所需的代理IP,可參考:西刺免費代理IP

選取某個代理IP進行測試:
類型:HTTP
IP地址:118.190.95.35
端口:9001

 

執行代碼:

proxy = {'http':'118.190.95.35:9001'}

r = requests.get(base_url+'/get',proxies=proxy)

print(r.text)

執行結果:

 

以上返回結果中,origin參數即爲請求時所設置的代理IP(若不設置代理IP,則origin顯示爲所用測試機的IP)

 

8、身份認證

身份認證:不少接口都須要身份認證,Requests支持多種身份認證,如:BasicAuth、DigestAuth...

 

執行代碼:

import requests

from requests.auth import HTTPBasicAuth

from requests.auth import HTTPDigestAuth

 

base_url = 'http://httpbin.org'

 

# BasicAuth認證

r = requests.get(base_url+'/basic-auth/test00001/111111',auth=HTTPBasicAuth('test00001','111111'))

print(r.text)

 

print('------------------')

 

# DigestAuth認證

r = requests.get(base_url+'/digest-auth/auth/test00002/222222',auth=HTTPDigestAuth('test00002','222222'))

print(r.text)

執行結果:

 

 

9、流式請求

流式請求:有的接口返回值包含有多個結果,而很是規的返回一個結果。好比查詢接口,其返回值爲排在前面固定數量的多個結果。

案例
請求接口:http://httpbin.ors/streas/{n}

 

n表示返回結果集的數量,好比輸入10則會返回10個不一樣id的結果,以下:

r = requests.get(base_url+'/stream/10')

print(r.text)

 

針對此類型接口,對結果集的處理須要使用iter_lines()迭代方法來處理。以下:
iter_lines() 函數說明:http://docs.python-requests.org/zh_CN/latest/api.html

 

執行代碼:

import requests

import  json

 

# 發送流式請求,stream=True表示接受流式請求,返回多個結果

r = requests.get(base_url+'/stream/10',stream=True)

 

# 若響應內容未設置編碼格式,則將其設置爲utf-8格式

if r.encoding is None:

    r.encoding = 'utf-8'

 

# 對響應結果進行迭代處理每一組數據(一次一行)

for line in r.iter_lines(decode_unicode=True):  # unicode解碼方式

    if line:

        data = json.loads(line) # 將響應的json數據轉換爲python數據(字典類型)

        print(data['id'])   #輸出每一個結果(字典類型)中id鍵對應的值

執行結果:

 

PS:
json.loads() 函數實現:json格式的字符串(str) ==> python格式的字典(dict)

原文:https://www.jianshu.com/p/6a44eca9841d

相關文章
相關標籤/搜索