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
串行请求100条耗时
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
并行请求1000条耗时