赞
踩
我们想用 python实现接口请求,requests是非常好用的一个三方库。但是requests发送请求是串行的,需要发送完一条请求后才能发送另一条请求。
安装方法: pip install requests
下面的示例用 requests.get()方法实现串行请求100条数据,参数a,b,c。b和c固定,把100条参数a放在excle中,通过pandas读excle。
Requests 允许使用 params 关键字参数,以一个字符串字典来提供这些参数。
> import pandas as pd > import requests > > #你的接口请求地址 > g_request_url = "你的请求地址" > > #串行请求 > def do_request(request_url,send_data): > response = requests.get(request_url,params=send_data) > return response > > if __name__ == '__main__': > data = pd.read_excel('D:/a_test.xlsx', sheet_name='Sheet1', header=0) > # pandas读excle是Dataform,我们将Dataform转list > excel_list = data.values.tolist() > error = 0 > total = 0 > for data1 in excel_list: > a = data1[0] > payload = {'a': a, 'b': {"ip": "xx.xx.xx.xx", "ts": 1588841180}, 'c': 2} > #发送请求 > result=do_request(g_request_url,payload) > code = result.status_code > if(code != 200): > error = error + 1 > total = total + 1 > print("total"+str(total)) > print("error"+str(error))
运行后,我们发现100条请求串行请求时间太长,为了提升测试效率,一般我们需要并行发送请求。这里可以使用多线程,或者协程,gevent或者aiohttp,然而使用起来,都相对麻烦。
那有什么实现起来简单的方法吗?当然有!
grequests是基于gevent+requests编写的一个并发发送请求的库,我们直接使用起来非常简单。
安装方法: pip install grequests
grequests支持get、post、put、delete等requests支持的HTTP请求方法,使用参数和requests一致,发送请求非常简单。
通过遍历res_list可以得到所有请求的返回结果。
import grequests as grequests import pandas as pd g_request_url = "你的请求地址" #并行请求 def do_grequest(request_url,send_data): response = grequests.get(request_url,params=send_data) #print(response.text,a) return response if __name__ == '__main__': data = pd.read_excel('D:/a_test.xlsx', sheet_name='Sheet1', header=0) # pandas读excle是Dataform,我们将Dataform转list excel_list = data.values.tolist() # print(excel_list) #构造请求列表 url_list = [] for data1 in excel_list: a = data1[0] payload = {'a': a, 'b': {"ip": "xx.xx.xx.xx", "ts": 1588841180}, 'c': 2} result=do_grequest(g_request_url,payload) url_list.append(result) #print(url_list) # 并行发送,等最后一个运行完后返回 res_list = grequests.map(url_list) #print(res_list) for i in res_list: code = i.status_code if (code != 200): error = error + 1 else: total = total + 1 print("total" + str(total)) print("error" + str(error))
以上串行和并行请求代码执行后,明细发现串行花费的时间要比并行请求长,我们可以对比下requests串行和grequests并行请求的时间。
requests请求:
import pandas as pd import requests import time #你的接口请求地址 g_request_url = "你的请求地址" #串行请求 def do_request(request_url,send_data): response = requests.get(request_url,params=send_data) return response if __name__ == '__main__': data = pd.read_excel('D:/a_test.xlsx', sheet_name = 'Sheet3', header = 0) # Dataform转list excel_list = data.values.tolist() start = time.time() for data1 in excel_list: a = data1[0] payload = {'a': a, 'b': {"ip": "xx.xx.xx.xx", "ts": 1588841180}, 'c': 2} result = do_request(g_request_url,payload) print(time.time() - start)
串行请求1000条数据,耗时:245.24240112304688s
grequests请求:
import grequests as grequests import pandas as pd import time g_request_url = "你的请求地址" #并行请求 def do_grequest(request_url,send_data): response = grequests.get(request_url,params=send_data) return response if __name__ == '__main__': data = pd.read_excel('D:/ios_1000.xlsx', sheet_name='Sheet3', header=0) # Dataform转list excel_list = data.values.tolist() #构造请求列表 url_list = [] start = time.time() for data1 in excel_list: a = data1[0] payload = {'a': a, 'b': {"ip": "xx.xx.xx.xx", "ts": 1588841180}, 'c': 2} result=do_grequest(g_request_url,payload) url_list.append(result) res_list = grequests.map(url_list) print(time.time() - start)
并行请求1000条数据,耗时:14.888465404510498s
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。