Pythonでaiohttpを使用し非同期リクエストを行う

Pythonでaiohttpを使用し非同期リクエストを行ってみます。

aiohttpは、asyncioとPythonのための非同期型HTTPクライアント/サーバーです。

今回はaiohttpのライブラリをインストールします。なお、aiohttpのライブラリは、Pythonの標準ライブラリではありませんの事前にインストールする必要があります。

■Python

今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認)

■aiohttpをインストールする

aiohttpをインストールを行いますが、今回はpipを経由してインストールを行うので、まずWindowsのコマンドプロンプトを起動します。

pip install aiohttp

起動後、上記のコマンドを入力し、Enterキーを押します。

なお、今回は、pythonランチャーを使用しており、Python Version 3.8.5にインストールを行うために、pipを使う場合にはコマンドでの切り替えを行います。

py -3.8 -m pip install aiohttp

切り替えるために、上記のコマンドを入力し、Enterキーを押します。

Defaulting to user installation because normal site-packages is not writeable
Collecting aiohttp
Downloading aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl (635 kB)
|████████████████████████████████| 635 kB 1.1 MB/s
Requirement already satisfied: chardet<5.0,>=2.0 in c:\users\user_\appdata\roaming\python\python38\site-packages (from aiohttp) (4.0.0)
Requirement already satisfied: attrs>=17.3.0 in c:\users\user_\appdata\roaming\python\python38\site-packages (from aiohttp) (21.2.0)
Collecting yarl<2.0,>=1.0
Downloading yarl-1.6.3-cp38-cp38-win_amd64.whl (125 kB)
|████████████████████████████████| 125 kB 2.2 MB/s
Collecting async-timeout<4.0,>=3.0
Downloading async_timeout-3.0.1-py3-none-any.whl (8.2 kB)
Collecting multidict<7.0,>=4.5
Downloading multidict-5.1.0-cp38-cp38-win_amd64.whl (48 kB)
|████████████████████████████████| 48 kB 1.4 MB/s
Collecting typing-extensions>=3.6.5
Downloading typing_extensions-3.10.0.0-py3-none-any.whl (26 kB)
Requirement already satisfied: idna>=2.0 in c:\users\user_\appdata\roaming\python\python38\site-packages (from yarl<2.0,>=1.0->aiohttp) (2.10)
Installing collected packages: multidict, yarl, async-timeout, typing-extensions, aiohttp
Successfully installed aiohttp-3.7.4.post0 async-timeout-3.0.1 multidict-5.1.0 typing-extensions-3.10.0.0 yarl-1.6.3

Enterキーを押すと、インストールが開始され、上記のように「Successfully installed」と表示されます。これが表示されれば、aiohttpが正常にインストールされたことになります。

なお、今回はaiohttpのバージョン3.7.4.post0をインストールしました。

■非同期リクエストを行う

インストール後、aiohttpを使用し非同期リクエストを行ってみます。

■コード

import aiohttp
import asyncio

async def main():
    async with aiohttp.ClientSession() as session:
        async with session.get('https://www.yahoo.co.jp/') as response:
            
            print("Status:",response.status)
            print("Content-type:",response.headers['content-type'])

            html = await response.text()
            print("Body:",html,"...")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

非同期処理を行なう際にはasyncioモジュールをimportで呼び出しています。

aiohttp.ClientSession()をsession変数にして、HTTP リクエスト(GETメソッド)を送信し、サーバーから返ってきた情報をresponse変数に格納。格納したものをprint()関数で出力します。なお、今回HTTP リクエスト(GETメソッド)を送信するサーバー(URL)は、Yahoo!JAPAN(https://www.yahoo.co.jp/)を指定しています。

loop変数を作成し、asyncio.get_event_loop()関数で、現在のイベント ループを取得。

loop.run_until_complete()関数を使用し、非同期処理が行われているmain()関数が、完了するまで実行します。

■実行

このスクリプトを「asynchronous_request.py」という名前で保存し、コマンドプロンプトから実行してみます。

実行してみると、aiohttpモジュールとasyncioモジュールを使用することで、非同期リクエストが行われて、今回指定したサーバー(URL)のステータスコードやコンテンツの情報が返され、出力することができました。

コメント

タイトルとURLをコピーしました