使用 requests (譯:瑞快四次)模塊進行封裝,幫你處理 restful (譯:儒哎斯否)類型的接口
一、requests 模塊基本使用
1、准備接口的URL、請求參數、請求頭
# 1. 構造注冊、登錄、充值請求的url
register_url = "注冊url" login_url = "登錄url" recharge_url = "充值url"
# 2. 創建請求參數
register_params = { "mobilephone": "18244446666", "pwd": "123456", "regname": "yuxing" } login_params = { "mobilephone": "18244446667", "pwd": "123456", } recharge_params = { "mobilephone": "18244446667", "amount": "500000", } # 可以添加請求頭,反爬蟲措施,所以有的需要自己添加合法的請求, 但是多數情況下, 不需要修改
headers = { "User-Agent": "Mozilla/5.0 shengruhuakai" }
2、向服務器發送請求
get 請求:使用 requests 庫中 get 方法
- 如果給 params (派瑞斯)傳參, 那么是以查詢字符串參數的形式來傳的--在url后傳參
# get請求:使用 requests 庫中 get 方法 # 如果給 params (派瑞斯)傳參, 那么是以查詢字符串參數的形式來傳的--在url后傳參
res = requests.get(register_url, params=register_params) # 如果需要請求頭則加上 headers 請求頭參數
res1 = requests.get(register_url, params=register_params, headers=headers) # 返回的 res 是一個Response的對象, 就可以把它當作是一個響應報文
# 可以從返回的對象中獲取需要的數據----根據不同系統,獲取字段也不同 # 獲取響應狀態碼
print(res.status_code) # 獲取響應報文
print(res.text) # 將響應報文轉化為Python中的字典數據類型
print(res.json()) # 獲取cookie
print(res.cookies)
post 請求:使用 requests 庫中 post 方法
# post請求:使用 requests 庫中 post 方法 # 一般情況下 post 請求不會以 params 來傳參 # 如果給 params 傳參, 那么是以查詢字符串參數的形式來傳的--在url后傳參不安全
res3 = requests.post(register_url, params=register_params, headers=headers) # 返回的是一個 Response (瑞思幫死)的對象, 就可以把它當作是一個響應報文 # 從響應報文中獲取需要參數
print(res3.status_code)
3、給data、json傳參
-
如果給 data 傳參, 那么會以 x-www-form-urlencoded 的形式來傳參
-
如果給 json 傳參, 那么會以 json 格式的字符串形式來傳參
# 如果給 data 傳參, 那么會以 x-www-form-urlencoded 的形式來傳參
res4 = requests.post(register_url, data=register_params, headers=headers) # 返回的是一個Response的對象, 就可以把它當作是一個響應報文 # print(res4.status_code)
# 如果給 json 傳參, 那么會以 json 格式的字符串形式來傳參 # 這里的 params 既可以是字典, 也可以是 json 格式的字符串----但是不以字符串來傳,字典不易出錯 # 所有的參數, 都轉化為字典之后來傳遞
res5 = requests.post(register_url, json=register_params, headers=headers) # 返回的是一個 Response(響應)的對象, 就可以把它當作是一個響應報文
print(res5.status_code)
4、如果需要上個接口的 cookie
第一種方法:在登錄后取出 cookie 以參數的形式傳給 充值接口,不方便一般不使用
# 先登錄
login_res = requests.post(login_url, data=login_params, headers=headers) # cookie = login_res.cookies['JSESSIONID'] # 不能單獨取出字符串傳遞
print(login_res.status_code) cookie = login_res.cookies # 只能傳遞cookies對象
# 充值 ---- cookies 以參數傳遞
recharge_res = requests.post(recharge_url, data=recharge_params, headers=headers, cookies=cookie) print(recharge_res.status_code)
第二種方法:使用 requests (瑞快斯特)中的 Session(賽神)創建會話,之后使用 Session 會話發送請求
# 創建 Session 會話對象, 相當於Jmeter當中的Cookie管理器
one_session = requests.Session() # 先登錄,使用會話發送請求
login_res = one_session.post(login_url, data=login_params, headers=headers) # 充值
recharge_res = one_session.post(recharge_url, data=recharge_params, headers=headers) # 關閉會話,close(科樓司) # 關閉之后, 依然可以發起請求 # 關閉會話只不過是釋放資源
one_session.close()
二、封裝 requests 模塊
import requests import json from scripts.handle_log import do_log class HandleTheRequest: """ 封裝請求接口類 """ def __init__(self): """ 創建會話對象,定義一個session的參數 """ self.one_session = requests.Session() def to_request(self, url, method, data=None, headers=None, is_json=False): """ 定義一個請求方法 :param url: 接口地址 :param method: 請求方法get、post :param data: 參數 :param headers: 請求頭 :param is_json: 是否為json請求數據 :return: 請求結果 """ if isinstance(data, str): try: data = json.loads(data) except Exception as e: data = eval(data) do_log.error("數據轉換器錯誤".format(e)) if method.lower() == "get": # 將輸入的請求方法轉化為大寫/lower res = self.one_session.get(url, params=data) elif method.lower() == "post": if is_json: # 如果is_json為True,就以json格式的形式來傳參 res = self.one_session.post(url, json=data, headers=headers) else: # 如果is_json為False,就以www-form的形式傳參 res = self.one_session.post(url, data=data, headers=headers) else: res = None print("不支持[{}]這種方法傳參".format(method)) do_log.error("發送的請求不是get/post,不支持的請求方式".format(method)) return res def close(self): """ 關閉session會話 :return: """ self.one_session.close() # do_register = HandleTheRequest() if __name__ == '__main__': # 1.構造前端的接口 register_url = "請求地址" # 2.構造請求參數,為字典烈性Params register_params = { "mobilephone": "13211110003", "pwd": "123456", "regname": "shouhu" } # 添加請求頭 headers = { "User-Agent": "Mozilla/5.0 shouhu" } a1_request = HandleTheRequest() register_request = a1_request.to_request(url=register_url, method="post", data=register_params, headers=headers) # 傳請求頭 # register_request = a1_request.to_request(url=register_url, method="post", data=register_params) print(f"cookies值為:{register_request.cookies}") # 關閉會話 a1_request.close() # 如果以json格式傳參需要設置為 True # initiate_request.to_request(method="post", url=recharge_url, data=recharge_params, is_json=True) pass
全面的封裝:https://www.cnblogs.com/xiaogongjin/p/11372155.html
import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) class HandleRequests: def __init__(self): self.one_session = requests.Session() def request(self, url, method='get', headers=None, param=None, data=None, is_json=False, is_http=False): ''' 定義一個請求方法 :param url: 域名接口 :param method: 請求方法 :param headers: 請求頭 :param param: get請求體 :param data: post表單請求體 :param is_json: 是否為json請求數據 :param is_http: 是否為http請求 :return: 請求結果 ''' if is_http is False: if method.lower() == 'get': res = self.one_session.get(url=url, headers=headers, params=param, verify=False) return res elif method.lower() == 'post': if is_json: res = self.one_session.post(url=url, headers=headers, data=data, verify=False) return res else: res = self.one_session.post(url=url, headers=headers, json=data, verify=False) return res elif method.lower() == 'delete': res = self.one_session.delete(url=url, headers=headers, verify=False) return res else: print("不支持{}請求方法!".format(method)) else: if method.lower() == 'get': res = self.one_session.get(url=url, headers=headers, params=data) return res elif method.lower() == 'post': if is_json: res = self.one_session.post(url=url, headers=headers, data=data) return res else: res = self.one_session.post(url=url, headers=headers, json=data) return res elif method.lower() == 'delete': res = self.one_session.delete(url=url, headers=headers) return res else: print("不支持{}請求方法!".format(method)) def close_cookie(self): ''' 關閉cookie ''' self.one_session.close()