您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“python接口自動(dòng)化如何使用requests庫(kù)發(fā)送http請(qǐng)求”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“python接口自動(dòng)化如何使用requests庫(kù)發(fā)送http請(qǐng)求”吧!
什么是Requests ?Requests 是?Python語?編寫,基于urllib,采?Apache2 Licensed開源協(xié)議的 HTTP 庫(kù)。它? urllib 更加?便,可以節(jié)約我們?量的?作,完全滿?HTTP測(cè)試需求。
安裝:cmd命令行執(zhí)行pip install requests
HTTP 協(xié)議 (Hyper Text Transfer Protocol),一個(gè)基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù),包括html文件、圖像、結(jié)果等,即是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)。根據(jù)HTTP 標(biāo)準(zhǔn),HTTP 請(qǐng)求可以使用多種請(qǐng)求方法。
HTTP 0.9:只有基本的文本GET請(qǐng)求,沒有固定的版本號(hào),不支持請(qǐng)求頭。
HTTP 1.0:完善的請(qǐng)求/響應(yīng)模型,并將協(xié)議補(bǔ)充完整,定義了三種請(qǐng)求方法:GET,POST和HEAD方法。
HTTP 1.1:在1.0的基礎(chǔ)上進(jìn)行更新,新增了五種請(qǐng)求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法。
HTTP 2.0(未普及):請(qǐng)求/響應(yīng)首部的定義基本沒有改變,只是所有首部鍵必須全部小寫,而且請(qǐng)求行要獨(dú)立為:method、:scheme、:host、:path這些鍵值
HTTP請(qǐng)求常用的Get和Post兩種方法:
GET是從服務(wù)器上獲取數(shù)據(jù),POST是向服務(wù)器傳送數(shù)據(jù)
GET請(qǐng)求參數(shù)都顯示在瀏覽器網(wǎng)址上,HTTP服務(wù)器根據(jù)該請(qǐng)求所包含URL中的參數(shù)來產(chǎn)生響應(yīng)內(nèi)容,也就是說GET請(qǐng)求的參數(shù)是URL的一部分。比如百度requests模塊
POST請(qǐng)求參數(shù)是在請(qǐng)求體當(dāng)中,消息長(zhǎng)度沒有限制且以隱式的方式進(jìn)行傳送,通常用來向HTTP服務(wù)器提交量比較大的數(shù)據(jù)(比如請(qǐng)求中包含許多參數(shù)或者文件上傳操作等),請(qǐng)求的參數(shù)包含在“Content-Type”消息頭里,指明該消息體的媒體類型和編碼
關(guān)鍵代碼:requests.get(url)
參數(shù)說明:若需要傳請(qǐng)求參數(shù),可直接在 url 后面添加,也可以在調(diào)用get()方法時(shí)通過關(guān)鍵字params傳入,需要注意的是params需要傳入dict(字典)類型。
下面以請(qǐng)求百度為例,發(fā)送get請(qǐng)求:
import requests # 通過url直接加上請(qǐng)求參數(shù),與通過params傳參效果是一樣的 response = requests.get(url='http://www.baidu.com/s?wd=requests模塊') # 通過params傳參 response2 = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模塊"}) print(response.status_code) # 打印狀態(tài)碼 # print(response.text) # 獲取響應(yīng)內(nèi)容
運(yùn)行結(jié)果:
C:\software\python\python.exe D:/learn/test.py
200
nished with exit code 0
關(guān)鍵代碼:requests.post(url, data)
參數(shù)說明:可傳dict類型也可傳json類型,dict類型使用關(guān)鍵字data傳參,json類型則為使用關(guān)鍵字json傳參。若無需傳參可不傳。
register_url = "http://127.0.0.1:666/index/register" # 添加請(qǐng)求頭,需要就傳 header = { "Content-Type": "application/json" } # json類型的參數(shù) json = { "mobile_phone": "15612345678", "pwd": "Test1234", "type": 0 } # 發(fā)送post請(qǐng)求 response = requests.post(url=register_url, json=json, headers=header) print(response.json()) # 打印結(jié)果:{'code': 200, 'msg': 'success', 'password': '321', 'username': '123'}
上面舉例為json類型的傳參,json和dict類型的數(shù)據(jù)結(jié)構(gòu)表面上看有點(diǎn)相似,那怎么判斷什么時(shí)候用json什么時(shí)候用dict呢?只要查看請(qǐng)求頭,需要哪種就傳哪種,表單類型的參數(shù),即"Content-Type: application/x-www-form-urlencoded"就使用關(guān)鍵字data去傳dcit類型的參數(shù),像上面舉例的"Content-Type": "application/json"json類型的參數(shù)一定要使用關(guān)鍵字json去傳遞。
常見的屬性:
response.status_code:獲取響應(yīng)狀態(tài)碼
response.cookies:獲取
cookiesresponse.headers:獲取頭部信息
response.url:獲取
urlresponse.text:自動(dòng)識(shí)別文本中的編碼格式進(jìn)行解碼,但有時(shí)候不準(zhǔn)確,會(huì)出現(xiàn)亂碼
response.content.decode('utf-8'):response.content,獲取字節(jié)流的數(shù)據(jù),進(jìn)行decode解碼,默認(rèn)是utf8
response.json():json方法可以將json字符串轉(zhuǎn)換成對(duì)應(yīng)的python類型的數(shù)據(jù),接口返回的數(shù)據(jù)99%都是json類型的
import requests response = requests.get(url='http://www.baidu.com/s?wd=requests模塊') # response = requests.get(url='http://www.baidu.com/s', params={"wd": "requests模塊"}) print("這是status_code:{}\n".format(response.status_code)) print("這是cookies:.{}\n".format(response.cookies)) print("這是headers:.{}\n".format(response.headers)) print("這是url:.{}\n".format(response.url)) # print("這是響應(yīng)頁(yè)面文本信息:.{}\n".format(response.text)) # 因?yàn)榉祷財(cái)?shù)據(jù)太長(zhǎng),不作運(yùn)行 # print("這是獲取的字節(jié)流數(shù)據(jù)decode解碼:.{}\n".format(response.content.decode()))
運(yùn)行結(jié)果:
C:\software\python\python.exe D:/learn/test.py
這是status_code:200
這是cookies:.<RequestsCookieJar[<Cookie BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1 for .baidu.com/>, <Cookie BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9 for .baidu.com/>, <Cookie H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437 for .baidu.com/>, <Cookie PSINO=6 for .baidu.com/>, <Cookie PSTM=1596554477 for .baidu.com/>, <Cookie delPer=0 for .baidu.com/>, <Cookie BDSVRTM=11 for www.baidu.com/>, <Cookie BD_CK_SAM=1 for www.baidu.com/>]>
這是headers:.{'Bdpagetype': '3', 'Bdqid': '0xf2cd9ccf00070e08', 'Cache-Control': 'private', 'Ckpacknum': '2', 'Ckrndstr': 'f00070e08', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html;charset=utf-8', 'Date': 'Tue, 04 Aug 2020 15:21:17 GMT', 'P3p': 'CP=" OTI DSP COR IVA OUR IND COM ", CP=" OTI DSP COR IVA OUR IND COM "', 'Server': 'BWS/1.1', 'Set-Cookie': 'BAIDUID=6EC84DD4DE623D15C087081CA8B7A6D9:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BIDUPSID=6EC84DD4DE623D15C087081CA8B7A6D9; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1596554477; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BAIDUID=6EC84DD4DE623D1500B3D0E771D1D3FA:FG=1; max-age=31536000; expires=Wed, 04-Aug-21 15:21:17 GMT; domain=.baidu.com; path=/; version=1; comment=bd, delPer=0; path=/; domain=.baidu.com, BD_CK_SAM=1;path=/, PSINO=6; domain=.baidu.com; path=/, BDSVRTM=11; path=/, H_PS_PSSID=32292_1441_32355_32328_31253_32348_32046_32394_32429_32115_32437; path=/; domain=.baidu.com', 'Traceid': '1596554477018818305017495812540276870664', 'Vary': 'Accept-Encoding', 'X-Ua-Compatible': 'IE=Edge,chrome=1', 'Transfer-Encoding': 'chunked'}
這是url:.http://www.baidu.com/s?wd=requests%E6%A8%A1%E5%9D%97
Process finished with exit code 0
在上面我們基本了解了requests庫(kù)的基本用法,如GET、POST請(qǐng)求以及response的屬性,接下來我們?cè)倏聪聄equests庫(kù)的一些高級(jí)用法,如下載/上傳文件、Cookies設(shè)置、代理設(shè)置等。
與發(fā)送請(qǐng)求區(qū)別無二,只是保存時(shí)需要處理一下,如下載圖片,把獲取圖片的二進(jìn)制數(shù)據(jù)然后用二進(jìn)制寫入文件即可。
import requests response = requests.get('https://github.com/favicon.ico') # 獲取二進(jìn)制數(shù)據(jù),然后寫入文件 with open('favicon.ico','wb')as f: f.write(response.content) f.close
關(guān)鍵代碼:requests.post(utl, files=files)
import requests file = {'file':open('favicon.ico','rb')} # 將之前抓取的github圖標(biāo)以二進(jìn)制格式讀取 response = requests.post('http://httpbin.org/post', files = file) print(response.text)
為什么會(huì)有SSL證書驗(yàn)證,SSL是什么?
SSL協(xié)議是網(wǎng)絡(luò)層和傳輸層的協(xié)議。SSL(Secure Sockets Layer 安全套接層)協(xié)議,及其繼任者TLS(Transport Layer Security傳輸層安全)協(xié)議,是為網(wǎng)絡(luò)通信提供安全及數(shù)據(jù)完整性的一種安全協(xié)議。
HTTPS是兼容HTTP的,可以把HTTPS理解為'HTTP over TSL',即HTTPS是HTTP協(xié)議和TSL協(xié)議的組合。HTTPS在傳輸數(shù)據(jù)時(shí),同樣會(huì)先建立TCP連接,建立起TCP連接后,會(huì)建立TSL連接。請(qǐng)求可以為HTTPS請(qǐng)求驗(yàn)證SSL證書,就像我們使用的瀏覽器一樣,SSL驗(yàn)證默認(rèn)是開啟的,如果證書驗(yàn)證失敗,請(qǐng)求會(huì)拋出一個(gè)SSLError,如下圖:
碰到請(qǐng)求SSL驗(yàn)證的,我們是可以直接跳過不驗(yàn)證的,通過設(shè)置verify=False就可關(guān)閉錯(cuò)誤提示,跳過SSL驗(yàn)證,這里只是忽略了SSL驗(yàn)證,并不是沒有了SSL驗(yàn)證,它仍然會(huì)存在一個(gè)警告信息InsecureRequestWarning。
import requests #通過一下兩行代碼即可把警報(bào)消除,即使verify=False,報(bào)警還是存在的 from requests.packages import urllib3 urllib3.disable_warnings() response = requests.get('https://www.12306.cn',verify = False) print(response.status_code)
在requests中,如果直接使用get()或post()等方法是可以做到模擬網(wǎng)頁(yè)的接口請(qǐng)求,但是每次發(fā)起請(qǐng)求結(jié)束后它就結(jié)束了,并不會(huì)保存相關(guān)的驗(yàn)證信息,如cookies/token;比如第一次使用post()請(qǐng)求登錄了某個(gè)網(wǎng)站,第二次想獲取成功登錄后的用戶個(gè)人信息,再一次發(fā)起post()請(qǐng)求時(shí)它會(huì)要求你需求先登錄,明明第一次請(qǐng)求時(shí)已經(jīng)登錄了,為什么第二次還提示要先登錄呢?實(shí)際上兩次請(qǐng)求相當(dāng)于使用了兩個(gè)瀏覽器去訪問,是兩個(gè)完全不相關(guān)的會(huì)話,因此第二次請(qǐng)求是拿不到用戶信息的。
requests中的session對(duì)象能夠讓我們跨http請(qǐng)求保持某些參數(shù),即讓同一個(gè)session對(duì)象發(fā)送的請(qǐng)求頭攜帶某個(gè)指定的參數(shù)。當(dāng)然,最常見的應(yīng)用是它可以讓cookie保持在后續(xù)的一串請(qǐng)求中。
# 創(chuàng)建一個(gè)session對(duì)象,使它能夠自動(dòng)記錄上一次請(qǐng)求中的cookie信息 se = requests.session() # 登錄接口 login_url = "http://www.test.com/api/member/login" login_data = { "mobilephone": "15612355678", "pwd": "Test1234" } res = se.post(url=login_url, data=login_data) # 登錄后查詢用戶最近的訂單記錄 order_record_url = "http://www.test.com/api/member/order" record_data = { "beginTime": "2022-07-01", "endTime": "2022-07-10" } res2 = se.post(url=order_record_url, data=record_data) print(res2.json())
凡是需要重復(fù)使用的,我們都可以對(duì)它進(jìn)行二次封裝,寫成我們自己的版本,還可以在封裝過程中加入我們想要的內(nèi)容,使用的時(shí)候直接調(diào)用即可。
import requests class SendSessionRequest: """使用session鑒權(quán)的接口,記錄cookies/token""" def __init__(self): self.session = requests.session() def requests(self, url, method, params=None, data=None, json=None, headers=None): method = method.lower() if method == "post": return self.session.post(url=url, json=json, data=data, headers=headers) elif method == "patch": return self.session.patch(url=url, json=json, data=data, headers=headers) elif method == "get": return self.session.get(url=url, params=params)
到此,相信大家對(duì)“python接口自動(dòng)化如何使用requests庫(kù)發(fā)送http請(qǐng)求”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。