<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天筆者想和大家來聊聊python介面自動化如何使用requests庫傳送http請求,廢話呢筆者就不多說了,直接進入正題。
什麼是Requests ?Requests 是⽤Python語⾔編寫,基於urllib,採⽤Apache2 Licensed開源協定的 HTTP 庫。它⽐ urllib 更加⽅便,可以節約我們⼤量的⼯作,完全滿⾜HTTP測試需求。
安裝:cmd命令列執行pip install requests
HTTP 協定 (Hyper Text Transfer Protocol),一個基於TCP/IP通訊協定來傳遞資料,包括html檔案、影象、結果等,即是一個使用者端和伺服器端請求和應答的標準。根據HTTP 標準,HTTP 請求可以使用多種請求方法。
HTTP請求常用的Get和Post兩種方法:
關鍵程式碼:requests.get(url)
引數說明:若需要傳請求引數,可直接在 url 後面新增,也可以在呼叫get()方法時通過關鍵字params傳入,需要注意的是params需要傳入dict(字典)型別。
下面以請求百度為例,傳送get請求:
import requests # 通過url直接加上請求引數,與通過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) # 列印狀態碼 # print(response.text) # 獲取響應內容
執行結果:
C:softwarepythonpython.exe D:/learn/test.py
200
nished with exit code 0
關鍵程式碼:requests.post(url, data)
引數說明:可傳dict型別也可傳json型別,dict型別使用關鍵字data傳參,json型別則為使用關鍵字json傳參。若無需傳參可不傳。
register_url = "http://127.0.0.1:666/index/register" # 新增請求頭,需要就傳 header = { "Content-Type": "application/json" } # json型別的引數 json = { "mobile_phone": "15612345678", "pwd": "Test1234", "type": 0 } # 傳送post請求 response = requests.post(url=register_url, json=json, headers=header) print(response.json()) # 列印結果:{'code': 200, 'msg': 'success', 'password': '321', 'username': '123'}
上面舉例為json型別的傳參,json和dict型別的資料結構表面上看有點相似,那怎麼判斷什麼時候用json什麼時候用dict呢?只要檢視請求頭,需要哪種就傳哪種,表單型別的引數,即"Content-Type: application/x-www-form-urlencoded"就使用關鍵字data去傳dcit型別的引數,像上面舉例的"Content-Type": "application/json"json型別的引數一定要使用關鍵字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("這是響應頁面文字資訊:.{}n".format(response.text)) # 因為返回資料太長,不作執行 # print("這是獲取的位元組流資料decode解碼:.{}n".format(response.content.decode()))
執行結果:
C:softwarepythonpython.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庫的基本用法,如GET、POST請求以及response的屬性,接下來我們再看下requests庫的一些高階用法,如下載/上傳檔案、Cookies設定、代理設定等。
與傳送請求區別無二,只是儲存時需要處理一下,如下載圖片,把獲取圖片的二進位制資料然後用二進位制寫入檔案即可。
import requests response = requests.get('https://github.com/favicon.ico') # 獲取二進位制資料,然後寫入檔案 with open('favicon.ico','wb')as f: f.write(response.content) f.close
關鍵程式碼:requests.post(utl, files=files)
import requests file = {'file':open('favicon.ico','rb')} # 將之前抓取的github圖示以二進位制格式讀取 response = requests.post('http://httpbin.org/post', files = file) print(response.text)
為什麼會有SSL證書驗證,SSL是什麼?
SSL協定是網路層和傳輸層的協定。SSL(Secure Sockets Layer 安全通訊協定)協定,及其繼任者TLS(Transport Layer Security傳輸層安全)協定,是為網路通訊提供安全及資料完整性的一種安全協定。
HTTPS是相容HTTP的,可以把HTTPS理解為'HTTP over TSL',即HTTPS是HTTP協定和TSL協定的組合。HTTPS在傳輸資料時,同樣會先建立TCP連線,建立起TCP連線後,會建立TSL連線。請求可以為HTTPS請求驗證SSL證書,就像我們使用的瀏覽器一樣,SSL驗證預設是開啟的,如果證書驗證失敗,請求會丟擲一個SSLError,如下圖:
碰到請求SSL驗證的,我們是可以直接跳過不驗證的,通過設定verify=False就可關閉錯誤提示,跳過SSL驗證,這裡只是忽略了SSL驗證,並不是沒有了SSL驗證,它仍然會存在一個警告資訊InsecureRequestWarning。
import requests #通過一下兩行程式碼即可把警報消除,即使verify=False,報警還是存在的 from requests.packages import urllib3 urllib3.disable_warnings() response = requests.get('https://www.12306.cn',verify = False) print(response.status_code)
在requests中,如果直接使用get()或post()等方法是可以做到模擬網頁的介面請求,但是每次發起請求結束後它就結束了,並不會儲存相關的驗證資訊,如cookies/token;比如第一次使用post()請求登入了某個網站,第二次想獲取成功登入後的使用者個人資訊,再一次發起post()請求時它會要求你需求先登入,明明第一次請求時已經登入了,為什麼第二次還提示要先登入呢?實際上兩次請求相當於使用了兩個瀏覽器去存取,是兩個完全不相關的對談,因此第二次請求是拿不到使用者資訊的。
requests中的session物件能夠讓我們跨http請求保持某些引數,即讓同一個session物件傳送的請求頭攜帶某個指定的引數。當然,最常見的應用是它可以讓cookie保持在後續的一串請求中。
# 建立一個session物件,使它能夠自動記錄上一次請求中的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())
凡是需要重複使用的,我們都可以對它進行二次封裝,寫成我們自己的版本,還可以在封裝過程中加入我們想要的內容,使用的時候直接呼叫即可。
import requests class SendSessionRequest: """使用session鑑權的介面,記錄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)
到此這篇關於python介面自動化使用requests庫傳送http請求的文章就介紹到這了,更多相關python 傳送http請求內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45