Grequests,非常 Nice 的 Python 非同步 HTTP 請求神器

左诗右码發表於2024-12-03

在 Python 開發中,處理 HTTP 請求是一項基礎而重要的任務。我們經常需要從網路獲取資料,或者向伺服器傳送資料。

我們已知的 requests 庫已經是相當的牛掰了,但是比較遺憾的是 requests 庫不支援非同步請求,今天,我們來介紹一個非同步 HTTP 請求庫 ——grequestsgrequests 庫以其非同步處理能力,為開發者提供了一個高效、簡潔的方式來傳送和處理 HTTP 請求,並且它和 requests 庫的用法賊為相似。一起來看看吧!

安裝 grequests 庫

首先,讓我們來安裝 grequests 庫。安裝過程非常簡單,只需要使用 pip 命令即可:

pip install grequests

grequests 庫的特性

grequests 庫以其強大的功能和靈活性而著稱,以下是它的一些核心特性:

  • 非同步請求:利用 gevent 庫,grequests 可以併發傳送多個 HTTP 請求,提高程式效能。
  • 支援多種 HTTP 方法:支援 GET 、 POST 、 PUT 、 DELETE 等多種 HTTP 方法。
  • 響應序列化:支援將響應內容序列化為 JSON 格式,方便資料處理。
  • 檔案上傳和下載:提供了便捷的方式來上傳和下載檔案。

基本功能

傳送 GET 請求

讓我們從一個簡單的 GET 請求開始。下面的程式碼展示瞭如何使用 grequests 傳送 GET 請求:

import grequests

# 定義請求的 URL 列表
urls = ['http://httpbin.org/get'] * 5
# 使用 grequests.map 併發傳送請求
responses = grequests.map(grequests.get(url) for url in urls)
# 列印每個響應的 JSON 內容
for response in responses:
    print(response.json())

傳送 POST 請求

傳送 POST 請求同樣簡單,以下是一個示例:

import grequests

# 定義請求的 URL 列表
urls = ['http://httpbin.org/post'] * 5
# 定義 POST 請求的資料
data = {'key': 'value'}
# 使用 grequests.map 併發傳送 POST 請求
responses = grequests.map(grequests.post(url, data=data) for url in urls)
# 列印每個響應的 JSON 內容
for response in responses:
    print(response.json())

高階功能

併發請求

grequests 的併發請求功能可以顯著提高處理大量 HTTP 請求的效率。下面是一個併發請求的示例:

import grequests

# 定義請求的 URL 列表
urls = ['http://httpbin.org/get'] * 10
# 建立請求列表
requests = [grequests.get(u) for u in urls]
# 使用 grequests.map 併發傳送請求
responses = grequests.map(requests)
# 列印每個響應的 JSON 內容
for response in responses:
    print(response.json())

併發數控制

grequests 允許我們控制併發請求的數量,這對於避免對伺服器造成過大壓力非常重要。我們可以透過 grequests.map 函式的 size 引數來控制併發數:

import grequests

# 定義請求的 URL 列表
urls = ['http://httpbin.org/get'] * 20
# 建立請求列表
requests = [grequests.get(u) for u in urls]
# 使用 grequests.map 併發傳送請求,限制併發數為 5
responses = grequests.map(requests, size=5)
# 列印每個響應的 JSON 內容
for response in responses:
    print(response.json())

實際應用場景

grequests 在實際專案中的應用非常廣泛,例如:

  1. 爬蟲設定 IP 代理池時驗證 IP 是否有效:透過併發請求,快速驗證代理 IP 的有效性。
  2. 進行壓測時,進行批次請求:利用非同步請求提高壓測效率。

結語

grequests 是一個功能強大且易於使用的 Python 庫,它透過非同步處理能力,幫助開發者高效地傳送和處理 HTTP 請求。希望這篇文章能夠幫助你更好地理解和使用 grequests

此文僅作為拋磚引玉,讓我們心中有個印象,更多詳細功能可查閱 GitHub 倉庫

相關文章