【譯】Python3中進行HTTP請求的4種方式

翻譯:瘋狂的技術宅
原文標題:HTTP Requests in Python 3
原文連接:https://www.twilio.com/blog/2...
本文首發微信公衆號:充實的腦洞html

相關文章:【譯】深刻解析Node.js中5種發起HTTP請求的方法python

python

python包索引(PyPI)提供了超過10萬個代碼庫的包,它可以幫助python程序員完成許多工做,不管是構建web應用程序仍是分析數據。另外PyPI還提供了不少諸如 twilio 之類的API的輔助庫git

下面讓咱們經過使用4個不一樣的 Python HTTP 庫來學習如何從 RESTful API 檢索和解析 JSON 數據,以此來演示PyPI包的強大功能。程序員

文中的每一個示例都包含如下內容:github

  1. 定義要解析的URL,咱們將使用Spotify API,由於它不須要在請求時進行身份驗證。web

  2. 建立一個 HTTP GET 去請求這個URL。json

  3. 解析返回的JSON數據。segmentfault

咱們將要使用的四個庫用了不一樣的方法獲得同一個結果。若是你把結果輸出,將會看到一個有Spotify搜索結果的字典:
api

*注意:結果可能會根據你使用的Python版本而有所不一樣。在這篇文章中,全部的代碼都使用Python 3編寫。 若是你仍在使用Python 2.X,那麼請考慮爲Python 3設置一個virtualenv。
如下說明將幫助您使用virtualenv與Python 3:bash

  1. 爲Python 3測試建立一個名爲pythreetest的目錄。

  2. 一旦安裝了virtualenv,從項目目錄中執行如下命令:

使用如下命令建立一個新的virtualenv:

virtualenv -p python3 myvenv

使用source命令激活myvenv

source myvenv/bin/activate

如今你將可以使用pip安裝須要的庫,並在virtualenv中使用Python 3啓動解釋器,在那裏您能夠成功導入包。

urllib

urllib是一個內置在Python標準庫中的模塊,並使用http.client來實現HTTP和HTTPS協議的客戶端。 因爲urllib是同Python一塊兒進行分發和安裝的,所以無需使用 pip 進行安裝。 若是你重視穩定性,那麼這就是給你準備的。 twilio-python助手庫就使用了urllib。

urllib同其餘庫比起來須要作更多的工做。 例如:你必須在發出HTTP請求以前建立一個URL對象。

import urllib.request
import urllib.parse

url = 'https://api.spotify.com/v1/search?type=artist&q=snoop'
f = urllib.request.urlopen(url)
print(f.read().decode('utf-8'))

在上面的例子中,咱們將請求URL發送到CGI的stdin,並讀取返回給咱們的數據。

Requests

Requests是Python社區中最喜歡的庫,由於它簡潔易用。 Requests由urllib3提供支持,有玩笑說這是「惟一的非轉基因HTTP庫,適合人類消費」。

Requests 抽象了大量的程式化的代碼,使得HTTP請求比使用內置urllib庫更簡單。

首先用pip進行安裝

pip install requests

向 Spotify 發送請求

import requests

r = requests.get('https://api.spotify.com/v1/search?type=artist&q=snoop')
r.json()

輸出結果:

from pprint import pprint
pprint(r.json())

咱們剛剛向Spotify發出了一個GET請求,同時建立了一個名爲rResponse 對象,以後使用內置的JSON解碼器來處理咱們請求的內容。

Octopus

Octopus是爲想要GET一切的開發人員準備的。它容許你多任務去訪問Spotify。就像它的名字同樣,這個庫使用線程併發地檢索和報告HTTP請求的完成狀況,同時可使用你所熟悉的庫。

或者,你可使用 Tornado 的 IOLoop 進行異步請求,不過在這裏就不盡興嘗試了。

經過pip安裝:

pip install octopus-http

Octopus的設置比前面的例子稍微多一些。 咱們必須構建一個響應處理器,並使用內置的JSON庫對JSON進行編碼。

import json
 
from pprint import pprint
from octopus import Octopus
 
 
def create_request(urls):
    data = []
 
    otto = Octopus(
           concurrency=4, auto_start=True, cache=True, expiration_in_seconds=10
    )
 
    def handle_url_response(url, response):
        if "Not found" == response.text:
            print ("URL Not Found: %s" % url)
        else:
            data.append(response.text)
 
    for url in urls:
        otto.enqueue(url, handle_url_response)
 
    otto.wait()
 
    json_data = json.JSONEncoder(indent=None,
                                 separators=(',', ': ')).encode(data)
 
    return pprint(json_data)
 
 
print(create_request(['https://api.spotify.com/v1/search?type=artist&q=snoop',
                     'https://api.spotify.com/v1/search?type=artist&q=dre']))

在上面的代碼片斷中,咱們定義了create_requests函數來使用線程Octopus請求。 咱們從一個空的list開始,data,並建立Octopus類的一個實例dotto。 最後配置了默認設置。

而後咱們構建響應處理器,其中的response參數是Octopus.Response的一個實例。 當每一個請求成功後,響應內容將被添加到數據列表中。在響應處理器內部,咱們可使用Octopus類的主要方法。.enqueue方法用於加入新的URL。

咱們指定.wait方法等待隊列中的全部URL完成加載,而後對JSON列表進行JSON編碼並打印結果。

籲,終於結束了。

HTTPie

HTTPie適用於但願快速與HTTP服務器、RESTful API 和 Web 服務進行交互的開發人員,它僅僅須要一行代碼。 這個庫是「一個可讓你微笑的開源 CLI HTTP客戶端:用戶友好的 curl 替代方案」。雖然它能夠不依賴Python環境,可是它能夠經過Pip安裝,並用來建立HTTP請求。

pip install httpie

默認協議是HTTP,但您能夠建立一個別名,並重置HTTPS爲默認值,以下所示:

alias https='http —default-scheme=https'

以後建立請求:

https "https://api.spotify.com/v1/search?type=artist&q=snoop"

使用HTTPie僅須要URL就夠了。

最後的想法

Python 生態提供了許多與 JSON api 交互的選擇。雖然這些方法對於最簡單的請求是類似的, 但隨着 HTTP 請求的複雜性增長, 這些差別變得更加明顯。多進行嘗試, 看看哪個最適合你的需求。你甚至能夠嘗試用另外一種語言, 如 Ruby。

關注微信公衆號:充實的腦洞, 一個技術宅的保留地
相關文章
相關標籤/搜索