PYTHON MEBY

Pythonでaiohttpを使って非同期HTTPリクエストを送信 (Python 3.5以降)

この記事では、Pythonのaiohttpライブラリを使用して非同期HTTPリクエストを送信する方法を説明します。非同期処理の基礎と、aiohttpを使った効率的なHTTPリクエスト送信方法を学びます。Python 3.5以降に対応しています。

目次

aiohttpのインストール

aiohttpライブラリはpipを使用してインストールできます。

pip install aiohttp

非同期リクエストの基本

aiohttpでは、`ClientSession`オブジェクトを使用して非同期リクエストを行います。`async with`文を使用してセッションを管理することで、リソースを効率的に利用できます。

import asyncio
import aiohttp

async def main():
    async with aiohttp.ClientSession() as session:
        pass

asyncio.run(main())

GETリクエスト

GETリクエストは`session.get()`メソッドを使用します。

import asyncio
import aiohttp

async def fetch_data(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    data = await fetch_data('https://example.com')
    print(data)

asyncio.run(main())

POSTリクエスト

POSTリクエストは`session.post()`メソッドを使用し、`data`引数にJSONデータを指定します。

import asyncio
import aiohttp
import json

async def send_data(url, data):
    async with aiohttp.ClientSession() as session:
        async with session.post(url, data=json.dumps(data)) as response:
            return await response.text()

async def main():
    data = {'key1': 'value1', 'key2': 'value2'}
    response = await send_data('https://httpbin.org/post', data)
    print(response)

asyncio.run(main())

エラーハンドリング

例外処理を使用して、リクエストエラーを適切に処理します。

import asyncio
import aiohttp

async def fetch_data(url):
    async with aiohttp.ClientSession() as session:
        try:
            async with session.get(url) as response:
                response.raise_for_status()  # HTTPエラー(4xx or 5xx)を例外として発生
                return await response.text()
        except aiohttp.ClientError as e:
            print(f'Error: {e}')
            return None

async def main():
    data = await fetch_data('https://example.com')
    if data:
        print(data)

asyncio.run(main())

同時リクエストとSemaphore

複数のURLに同時にリクエストを送信するには、asyncio.Semaphoreを使用して、接続数を制限します。

import asyncio
import aiohttp

async def fetch_data(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    urls = ['https://example.com', 'https://google.com']
    semaphore = asyncio.Semaphore(5)  # 最大5つの同時接続
    async with aiohttp.ClientSession() as session:
        tasks = [fetch_data(session, url) for url in urls]
        results = await asyncio.gather(*[task for task in tasks])
        print(results)

asyncio.run(main())

応用例

aiohttpは、Webスクレイピング、APIとの通信、ファイルのアップロードなど、様々な用途に使用できます。

関連記事