第一種:利用requests獲取headers
通過requests.session()查看默認配置下的請求頭:
import requests session = requests.session() print(session.headers) #輸出的默認請求頭配置結果為:{'User-Agent': 'python-requests/2.27.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'} print(session.headers.items()) #輸出的默認請求頭配置結果為:ItemsView({'User-Agent': 'python-requests/2.27.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'})
包裝請求頭:
#獲取headers中的key for i in session.headers.keys(): print(i) ''' 輸出結果為: User-Agent Accept-Encoding Accept Connection ''' #獲取headers中values for i in session.headers.values(): print(i) ''' 輸出結果為: python-requests/2.27.1 gzip, deflate */* keep-alive ''' #輸出headers中的值 session.headers.pop('User-Agent') for i in session.headers.keys(): print(i) ''' 輸出結果為: Accept-Encoding Accept Connection ''' #清除headers中的內容 session.headers.clear() print(session.headers) #使用字典更新的方式更新請求頭 headers = { 'Origin': 'https://***.com', 'Host': '***.com', 'Referer': 'https://**.com/', 'User-Agent': 'Mozilla/5.0', } session.headers.update(headers) print(session.headers) #在請求的時候添加headers參數 response = session.get(url, headers=headers)
備注:
兩種方式在response端看到的效果等同,區別在於第一種方式session是永久的,而第二種常用的方式只是在請求的時候攜帶過去。
第二種:利用requests獲取cookies
import requests session = requests.session() print(session.cookies) #輸出結果為:<RequestsCookieJar[]> print(session.cookies.items()) #輸出結果為:[] def get_Cookies(): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4515.159 Safari/537.36' } url = 'URl請求地址' session = requests.session() session.post(url,headers=headers) cookie = session.cookies a = cookie.get_dict() return a print(get_Cookies()) #輸出結果為:{'X_HTTP_TOKEN': '42daf4b72327b2817495839261bf5e71415983ed09', 'user_trace_token': '20210819231227-8e195ef7-7b6c-4e9c-a77c-f806bbb0dd3c'}
有時候用session.cookies獲取不到cookies信息,需要用原始方式獲取cookies:
import json import requests def login(self): self._session = requests.Session() url = "http://cdht-sentinel.bbdservice.com" data = { "ip": "182.150.28.190", "location": "四川省成都市", "password": "71b44033d3814ca82c7d079e046d6765", "systemState": 2, "username": "admin2" } response = requests.post(url=url,data=json.dumps(data),headers=self._headers) ret = json.loads(response.text) cookie_str = response.headers.get("Set-Cookie") cookie_tuple = cookie_str.split(";") for item in cookie_tuple: if item.count(",")>=1: for item1 in item.split(","): key1,value1 = item1.split("=") self._cookie[key1]=value1 else: key, value = item.split("=") self._cookies[key] = value print("登錄成功:",self._cookies)
python的requests中cookies的獲取和使用:
#處理cookie方法一:用requests.utils.dict_from_cookiejar()把返回的cookies轉換成字典 import requests def login(): url = "http://www.xxx.com/login" headers = { 'Content-Tpye':'application/json' } payload = { "username":"111@qq.com", "password":"11111" } try: res = requests.post(url,headers=headers,json=payload) cookies = res.cookies cookie = requests.utils.dict_from_cookiejar(cookies) return cookie except Exception as err: print('獲取cookie失敗:、n{0}'.format(err)) #處理cookie方式二:遍歷cookies的鍵值,拼接成cookie格式 import requests def login(): url = "http://www.xxx.com/login" headers = { 'Content-Tpye':'application/json' } payload = { "username":"111@qq.com", "password":"11111" } try: res = requests.post(url,headers=headers,json=payload) cookies = res.cookies.items() cookie = '' for name, value in cookies: cookie +='{0}={1};'.format(name,value) return cookie except Exception as err: print('獲取cookie失敗:、n{0}'.format(err)) #cookie的使用一 import requests def get_data(): cookie=login() res = requests.get(url=get_data_url,cookies=cookie) print(res.text) #cookie的使用二 import requests def get_data(): cookie=login() headers = { "cookie":cookie } res = requests.get(url=get_data_url,header = headers) print(res.text)
參考鏈接:https://www.cnblogs.com/miaoxiaochao/p/13054450.html
第三種:Python接口請求發送依賴session
requests.method發送請求是不會自動保留cookies信息,那么充值必須需要登錄才可以,所以解決的方式有兩種:
1、手動解決:提取cookies信息,下一個充值接口發送請求時手動傳遞cookies
2、自動保存cookies,用作下一個接口
import logging if __name__ == "__main__": import requests session = requests.session() url = "http://登錄接口地址" payloads = {'mobilephone':'15340583307',"pwd":'123'} r = requests.session.post(url=url, data=payloads) print(r.text) cook = r.cookies #充值接口:應在登錄后才可充值 recharge_url = url+"/member/recharge" payloads = {'mobilephone':'15340583307','amount':100} r = requests.session.post(url=recharge_url,data=payloads,cookies=cook) print(r.text) print(r.headers) #針對Session發送請求方法封裝 class SessionRequest(object): def __init__(self): self.session =requests.session() def sendRequest(self,url,method,params=None,data=None,json=None,timeout=10): responseResult = None new_method = method.lower() if new_method == 'get': logging.info("正在發送get請求,請求地址:{},請求參數{}".format(url,params)) responseResult = self.session.get(url=url,params=params,timeout=timeout) elif new_method=="post": if json: logging.info("正在發送請求,請求地址:{},請求參數{}".format(url,json)) responseResult = self.session.post(url=url,json=json,time=timeout) else: logging.info("正在發送請求,請求地址:{},請求參數{}".format(url,data)) responseResult = self.session.post(url=url,data=data,timeout=timeout) return responseResult.json()
第四種:Python模塊requests測試接口時Session傳遞
在測試接口時需要有些接口登錄后方可操作,這時需要將登錄的session進行傳遞,可以直接獲取登錄后的cookie,也可以使用requests.Session():
方法一:直接獲取登錄的cookie進行傳遞,如下代碼:
import json import requests def login(): url = "接口請求地址" logininfo = json.dumps({"username":"admin","userpass":"1111"}) headers = {'Referer':'afdasdf', 'X-Requested-with':'XMLHttpRequest', 'Content-Type':'application/json;charset=UTF-8'} rps = requests.post(url=url, data=logininfo,headers=headers) print(rps.status_code) print(rps.cookies.get_dict()) return rps.cookies.get_dict() def getUserInfo(): url = "接口請求地址2" datainfo = json.dumps({"currentPage":1,"pagesize":15,"username":"","userDesc":""}) headers = {'Referer':'afdasdf', 'X-Requested-with':'XMLHttpRequest', 'Content-Type':'application/json;charset=UTF-8'} rps = requests.post(url=url,data=datainfo,headers=headers,cookies=login()) print(rps.status_code) print(rps.content) print(rps.text) getUserInfo()
方法二:通過方法Session()進行傳遞
import json import requests def login(): url = "接口請求地址" logininfo = json.dumps({"username":"admin","userpass":"1111"}) headers = {'Referer':'afdasdf', 'X-Requested-with':'XMLHttpRequest', 'Content-Type':'application/json;charset=UTF-8'} s = requests.session() rps = s.post(url=url, data=logininfo,headers=headers) print(rps.status_code) print(rps.cookies.get_dict()) return s def getUserInfo(): url = "接口請求地址2" datainfo = json.dumps({"currentPage":1,"pagesize":15,"username":"","userDesc":""}) headers = {'Referer':'afdasdf', 'X-Requested-with':'XMLHttpRequest', 'Content-Type':'application/json;charset=UTF-8'} rps = login().post(url=url,data=datainfo,headers=headers) print(rps.status_code) print(rps.content) print(rps.text) getUserInfo()
二者的優缺點對比如下:
方法一最主要的缺點是當接口用例很多的時候,都需要帶上Login(),那么就意味着每調用一個接口都得必須執行Login()的函數;方法二使用requests的session會話對象來進行處理,會話對象讓你能夠跨請求保持某些參數,它也會在同一個Session實例發出的所有請求之間保持cookie,所以如果你向同一主機發送多個請求,底層的TCP連接將會被重用,從而帶來顯著的性能提升。
另一種封裝方式見鏈接:https://www.cnblogs.com/shuishan-runner/p/14845277.html