Python使用grequests併發傳送請求

2021-10-13 21:29:03 字數 2474 閱讀 2555

參考博文:

requests是python傳送介面請求非常好用的乙個三方庫,由k神編寫,簡單,方便上手快。但是requests傳送請求是序列的,即阻塞的。傳送完一條請求才能傳送另一條請求。

為了提公升測試效率,一般我們需要並行傳送請求。這裡可以使用多執行緒,或者協程,gevent或者aiohttp,然而使用起來,都相對麻煩。

grequests是k神基於gevent+requests編寫的乙個併發傳送請求的庫,使用起來非常簡單。

安裝方法: pip install gevent grequests

國內的話,上述方法安裝速度慢,可以使用國內的清華源,速度快。

1、臨時使用的話,輸入命令:

pip install -i  《庫名稱》
2、永久配置的話,輸入命令:

pip install pip -u

pip config set global.index-url

說明:

(1)「pip install pip -u」是用於執行公升級pip的命令;

(2)若pip為10.0.0以上版本,則可以進行公升級;

(3)檢視pip版本的命令:pip -v

首先構造乙個請求列表,使用grequests.map()並行傳送,得到乙個響應列表。示例如下:

import grequests

req_list = [ # 請求列表

grequests.get(''),

grequests.post('', data=),

grequests.put('', json=),

]res_list = grequests.map(req_list) # 並行傳送,等最後乙個執行完後返回

print(res_list[0].text) # 列印第乙個請求的響應文字

grequests支援get、post、put、delete等requests支援的http請求方法,使用引數和requests一致,傳送請求非常簡單。

通過遍歷res_list可以得到所有請求的返回結果。

我們可以對比下requests序列和grequests並行請求100次github.com的時間,示例如下:

1、使用requests傳送請求

import requests

import time

start = time.time()

res_list = [requests.get('') for i in range(100)]

print(time.time()-start)

實際耗時約100s+

2、使用grequests傳送

import grequests

import time

start = time.time()

req_list = [grequests.get('') for i in range(100)]

res_list = grequests.map(req_list)

print(time.time()-start)

實際耗時約3.58s

在批量傳送請求時難免遇到某個請求url無法訪問或超時等異常,grequests.map()方法還支援自定義異常處理函式,示例如下:

import grequests

def err_handler(request, exception):

print("請求出錯")

req_list = [

grequests.get('', timeout=0.001), # 超時異常

grequests.get('http://fakedomain/'), # 該網域名稱不存在

grequests.get('') # 正常返回500的請求

]res_list = grequests.map(reqs, exception_handler=err_handler)

print(res_list)

執行結果:

請求出錯

請求出錯

[none, none, ]

1、「no connection adapters were found」報錯:

requests.exceptions.invalidschema: no connection adapters were found for '10.96.106.47:8098/cashier/bill/index'
url採用的是』10.96.106.47:8098/cashier/bill/index』,報錯內容為』找不到「 10.96.106.47:8098/cashier/bill/index」的連線介面卡』,是url中沒有http或者https協議導致的,補全url即解決,強調細心。

2、requests無map函式,grequests有

python元類的使用 python使用元類

原文 type 動態語言和靜態語言最大的不同,就是函式和類的定義,不是編譯時定義的,而是執行時動態建立的。比方說我們要定義乙個hello的class,就寫乙個hello.py模組 當python直譯器載入hello模組時,就會依次執行該模組的所有語句,執行結果就是動態建立出乙個hello的class...

Python精通 Python函式使用

在程式設計意義上的函式其實是指完成某種操作的 塊,當然這個是個人的理解,但是這個概念在所有的程式語言中都是通用的。這個 塊用來完成某寫特定的操作。但是在數學上的函式卻是表示某種對應關係,這兩者之間還是有一定的區別的。但是在某種角度上講我們所程式設計的這種 塊其實就是表示的是引數與返回值之間的關係。從...

python 元組使用 使用元組

usr bin python filename using tuple.py zoo wolf elephant penguin print number of animals in the zoo is len zoo new zoo monkey dolphin zoo print number...