PythonでRequestsライブラリを使い始める方法

提供:Dev Guides
移動先:案内検索

序章

多くのWebアプリでは、APIを使用してさまざまなサードパーティサービスに接続するのが普通です。 これらのAPIを使用すると、天気情報、スポーツスコア、映画のリスト、ツイート、検索エンジンの結果、写真などのデータにアクセスできます。 APIを使用してアプリに機能を追加することもできます。 これらの例としては、支払い、スケジュール設定、電子メール、翻訳、地図、ファイル転送などがあります。 これらのいずれかを自分で作成する場合は時間がかかりますが、APIを使用すると、APIに接続してその機能やデータにアクセスするのに数分しかかかりません。

この記事では、PythonでHTTPリクエストを送信できるPythonRequestsライブラリについて学習します。

警告:このチュートリアルの後半は、Yandex.Translateの無料のAPIキーに依存していました。 この時点で、これらはもはや自由に発行されていません。 このチュートリアルの残りの部分は、教育目的でそのまま提供されます。


また、APIを使用するとHTTPリクエストを送信し、レスポンスを受信するため、Requestsを使用するとPythonでAPIを使用できます。 ここでは、言語翻訳APIの使用方法を示し、その動作例を確認します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

HTTPリクエストを理解する

HTTPリクエストは、Webの仕組みです。 Webページに移動するたびに、ブラウザはWebページのサーバーに対して複数の要求を行います。 次に、サーバーはページのレンダリングに必要なすべてのデータで応答し、ブラウザーは実際にページをレンダリングして、ページを表示できるようにします。

一般的なプロセスは次のとおりです。

  • クライアント(ブラウザやリクエストを使用するPythonスクリプトなど)は、URLにデータを送信します。
  • 次に、URLにあるサーバーがデータを読み取り、それをどう処理するかを決定し、クライアントに応答を返します。
  • 最後に、クライアントは応答のデータをどう処理するかを決定できます。

クライアントがリクエストで送信するデータの一部は、リクエストメソッドです。 一般的なリクエストメソッドには、GET、POST、PUTがあります。 GETリクエストは通常、何かを変更せずにデータを読み取るためだけのものですが、POSTおよびPUTリクエストは通常、サーバー上のデータを変更するためのものです。 たとえば、 Stripe API を使用すると、POSTリクエストを使用して新しい料金を作成できるため、ユーザーはアプリから何かを購入できます。

注:サーバー上のデータを変更しないため、この記事ではGETリクエストについて説明します。


PythonスクリプトまたはWebアプリ内からリクエストを送信する場合、開発者は、各リクエストで何を送信するか、および応答をどのように処理するかを決定できます。 それでは、最初に DigitalOcean.com にリクエストを送信し、次に言語翻訳APIを使用してそれを調べてみましょう。

ステップ1—Pythonリクエストのインストール

仮想環境をまだ作成していない場合は、最初に作成することをお勧めします。

次に、ライブラリをインストールする必要があります。 pipを使用してリクエストをインストールしましょう。

pip install requests

この時点で、プロジェクトはリクエストを使用する準備ができています。

ステップ2—最初のリクエストを行う

まず、リクエストを使用してDigitalOceanサイトをリクエストしましょう。

script.pyというファイルを作成し、次のコードを追加します。 この記事では、使用するコードがあまりないため、何かが変更された場合は、新しい行を追加する代わりに、既存のコードを更新するだけで済みます。

script.py

import requests

res = requests.get('https://www.digitalocean.com/')

print(res)

したがって、このコードが実行しているのは、DigitalOceanにGETリクエストを送信することだけです。 これは、ブラウザがこのページを表示するために送信したリクエストと同じタイプですが、唯一の違いは、リクエストが実際にHTMLをレンダリングできないため、代わりに生のHTMLとその他の応答情報を取得することです。

ここでは.get()関数を使用していますが、Requestsを使用すると、.post().put()などの他の関数を使用してこれらの要求を送信することもできます。

script.pyファイルを実行することで実行できます。

python script.py

そして、これがあなたが見返りに得るものです:

Output<Response [200]>

次に、200ステータスコードの意味を調べてみましょう。

ステップ3—ステータスコードを理解する

最初にできることは、ステータスコードを確認することです。 HTTPコードの範囲は1XXから5XXです。 おそらく見たことがある一般的なステータスコードは、200、404、および500です。

各ステータスコードの意味の概要は次のとおりです。

  • 1XX-情報
  • 2XX-成功
  • 3XX-リダイレクト
  • 4XX-クライアントエラー(エラーが発生しました)
  • 5XX-サーバーエラー(エラーが発生しました)

一般的に、独自のリクエストを実行するときに探しているのは、200年代のステータスコードです。

リクエストは、4XXおよび5XXステータスコードがエラーであることを認識します。したがって、これらのステータスコードが返された場合、リクエストからの応答オブジェクトはFalseと評価されます。

応答が真実かどうかを確認することで、要求が正常に応答したかどうかをテストできます。 例えば:

script.py

if res:
    print('Response OK')
else:
    print('Response Failed')

そして、これがあなたが見返りに得るものです:

Output<Response [200]>
Response OK

メッセージ"Response Failed"は、400または500のステータスコードが返された場合にのみ表示されます。 URLをナンセンスに変更して、404で応答が失敗することを確認してください。

次を追加することで、ステータスコードを直接確認できます。

script.py

print(res.status_code)

これにより、ステータスコードが直接表示されるため、自分で番号を確認できます。

Output<Response [404]>
Response Failed
404

これにより、応答、スクリプトメッセージ、および応答ステータスコードが表示されます。

ステップ4—ヘッダーを理解する

応答から取得できるもう1つのことは、ヘッダーです。 応答オブジェクトのヘッダーディクショナリを使用して、それらを確認できます。

script.py

print(res.headers)

これにより、次の出力が生成されます。

Output{'Date': 'date', 'Content-Type': 'text/html', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Set-Cookie': '__cfduid=id; expires=date; path=/; domain=.digitalocean.com; HttpOnly; SameSite=Lax', 'Last-Modified': 'date', 'Vary': 'Accept-Encoding', 'ETag': 'etag', 'Expires': 'date', 'Cache-Control': 'max-age=time, public', 'Content-Encoding': 'gzip', 'CF-Cache-Status': 'DYNAMIC', 'cf-request-id': 'id', 'Expect-CT': 'max-age=time, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"', 'Server': 'cloudflare', 'CF-RAY': 'ray'}

ヘッダーはリクエストと一緒に送信され、レスポンスで返されます。 ヘッダーは、クライアントとサーバーの両方が、応答で送受信されているデータを解釈する方法を知っているように使用されます。

返されるさまざまなヘッダーを確認できます。 多くの場合、ヘッダー情報を直接使用する必要はありませんが、必要に応じてそこにあります。

コンテンツタイプは、データの形式(HTML、JSON、PDF、テキストなど)を明らかにするため、通常は必要になる可能性があります。 ただし、コンテンツタイプは通常、リクエストによって処理されるため、返されるデータにアクセスできます。

ステップ5—応答テキストを理解する

そして最後に、res.text(これは、現在表示しているHTMLページなどのテキストデータで機能します)を見ると、DigitalOceanのホームページを構築するために必要なすべてのHTMLを確認できます。 レンダリングされませんが、DigitalOceanに属しているように見えます。

script.py

print(res.text)

これにより、次の出力が生成されます。

Output<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/>

[...]

<title data-react-helmet="true">DigitalOcean – The developer cloud</title><meta data-react-helmet="true" name="description" content="Helping millions of developers easily build, test, manage, and scale applications of any size – faster than ever before."/>

[...]

これをファイルに保存して開くと、DigitalOceanサイトに似たものが表示されます。 実際の状況では、画像、スクリプト、スタイルシートなどを読み込むために1つのWebページに対して複数のリクエストが行われるため、HTMLのみをファイルに保存すると、DigitalOceanサイトのようにはなりません。 HTMLデータを取得するために実行されたリクエストは1つだけだったため、ブラウザ。

ステップ6—TranslateAPIを使用する

それでは、もっと面白いことに移りましょう。 Yandex Translate APIを使用して、テキストを別の言語に翻訳するリクエストを実行します。

APIを使用するには、最初にサインアップする必要があります。 サインアップしたら、Translate APIに移動して、APIキーを作成します。 APIキーを取得したら、それを定数としてファイルに追加します。 これらすべてを実行できるリンクは次のとおりです。https://tech.yandex.com/translate/

script.py

API_KEY = 'your yandex api key'

APIキーが必要な理由は、YandexがAPIを使用するたびに認証できるようにするためです。 APIキーは、送信時にリクエストURLの最後に追加されるため、軽量の認証形式です。

APIを使用するために送信する必要のあるURLを知るには、Yandexドキュメントを参照してください。

そこを見ると、TranslateAPIを使用してテキストを翻訳するために必要なすべての情報が表示されます。

https://translate.yandex.net/api/v1.5/tr.json/translate
 ? key=<API key>
 & text=<text to translate>
 & lang=<translation direction>
 & [format=<text format>]
 & [options=<translation options>]
 & [callback=<name of the callback function>]

アンパサンド(&)、質問マーク(?)、等号(=)を含むURLが表示されたら、そのURLがGETリクエスト用であることを確認できます。 。 これらの記号は、URLに付随するパラメーターを指定します。

通常、角かっこ([])はオプションです。 この場合、formatoptions、およびcallbackはオプションです。 また、リクエストにはkeytextlangが必要です。

それでは、そのURLに送信するコードを追加しましょう。 作成した最初のリクエストを次のように置き換えることができます。

script.py

url = 'https://translate.yandex.net/api/v1.5/tr.json/translate'
res = requests.get(url)

パラメータを追加する方法は2つあります。 URLの末尾に直接追加することも、リクエストに代わって追加することもできます。 後者を実現するために、パラメーターの辞書を作成できます。 必要な3つの項目は、キー、テキスト、および言語です。 APIキー、テキストに'Hello'、言語に'en-es'を使用して辞書を作成しましょう。これは、英語からスペイン語に翻訳することを意味します。

他の言語コードを知る必要がある場合は、このISO639-1コードのリストを参照してください。 639-1列に注目してください。

dict()関数を使用し、ディクショナリに必要なキーと値を渡すことで、パラメータディクショナリを作成できます。

script.py

params = dict(key=API_KEY, text='Hello', lang='en-es')

次に、パラメータディクショナリを取得して、.get()関数に渡します。

script.py

res = requests.get(url, params=params)

この方法でパラメータを渡すと、リクエストが先に進み、パラメータをURLに追加します。

次に、応答テキストにprintステートメントを追加して、応答で返される内容を確認しましょう。

script.py

print(res.text)

これにより、次の出力が生成されます。

Output{"code': 200, "lang": "en-es", "text": ["Hola"]}

3つのことがわかります。 応答自体のステータスコードとまったく同じステータスコードが表示され、指定した言語が表示され、リスト内に翻訳されたテキストが表示されます。 したがって、翻訳されたテキストには'Hola'が表示されます。

言語コードとしてen-frを使用して再試行すると、応答に'Bonjour'が表示されるはずです。

script.py

params = dict(key=API_KEY, text='Hello', lang='en-fr')

これにより、次の出力が生成されます。

Output{"code": 200, "lang": "en-fr", "text": ["Bonjour"]}

この特定の応答のヘッダーを見てみましょう。

script.py

print(res.headers)

これにより、次の出力が生成されます。

Output{'Server': 'nginx/1.6.2', 'Date': 'Sat, 20 Apr 2019 08:57:01 GMT', 'Content-Type': 'application/json; charset=utf-8', 'Content-Length": '46', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=120', 'X-Content-Type-Options': 'nosniff', 'Cache-Control': 'no-store'}

別のサーバーと通信しているため、ヘッダーは異なるはずですが、この場合、コンテンツタイプはtext/htmlではなくapplication/jsonです。 これは、データをJSONとして解釈できることを意味します。

application/jsonが応答のコンテンツタイプである場合、データに簡単にアクセスできるように、要求で応答を辞書とリストに変換することができます。

データをJSONとして解析するには、応答オブジェクトで.json()メソッドを使用します。

印刷すると、データは同じように見えますが、形式が少し異なります。

script.py

json = res.json()
print(json)

これにより、次の出力が生成されます。

Output{'code': 200, 'lang': 'en-fr', 'text': ['Bonjour']}

異なる理由は、res.textから取得するのはもはやプレーンテキストではないためです。 今回は辞書の印刷版です。

テキストにアクセスしたいとします。 これは辞書になっているので、textキーを使用できます。

script.py

print(json['text'])

これにより、次の出力が生成されます。

Output['Bonjour']

そして今、あなたはその1つのキーのデータだけを見ることができます。 この場合、1つのアイテムのリストを見ているので、リスト内のそのテキストを直接取得したい場合は、インデックスからアクセスできます。

script.py

print(json['text'][0])

これにより、次の出力が生成されます。

OutputBonjour

そして今、あなたが見るのは翻訳された単語だけです。

パラメータの変更を行うと、異なる結果が得られます。 翻訳するテキストをHelloからGoodbyeに変更し、対象言語をスペイン語に戻して、再度リクエストを送信してみましょう。

script.py

params = dict(key=API_KEY, text='Goodbye', lang='en-es')

これにより、次の出力が生成されます。

OutputAdiós

長いテキストをさまざまな言語に翻訳してみて、APIがどのような応答を返すかを確認してください。

ステップ7—TranslateAPIエラーケースの処理

最後に、エラーの場合を見ていきます。 すべてが常に機能するとは限らないため、それがいつ発生するかを知る必要があります。

1文字を削除してAPIキーを変更してみてください。 これを行うと、APIキーは無効になります。 次に、リクエストを送信してみてください。

ステータスコードを見ると、次のようになります。

script.py

print(res.status_code)

これにより、次の出力が生成されます。

Output403

APIを使用している場合は、アプリのニーズに応じてエラーケースを処理できるように、問題がないかどうかを確認する必要があります。

結論

この記事では、PythonでHTTPリクエストを送信できるPythonRequestsライブラリについて学習しました。

これがあなたが学んだことです:

  • HTTPリクエストのしくみ
  • 応答で可能なさまざまなステータスコード
  • PythonRequestsライブラリを使用してリクエストを送信および受信する方法
  • 言語翻訳APIを使用してテキストを翻訳する方法
  • application/jsonコンテンツの応答を辞書に変換する方法

Pythonについて詳しく知りたい場合は、Reactトピックページで演習とプログラミングプロジェクトを確認してください。