python日记(三)之实现接口请求
python+request串行
我们想用 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,然而使用起来,都相对麻烦。
那有什么实现起来简单的方法吗?当然有!
python+grequests并行
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串行和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