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