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との通信、ファイルのアップロードなど、様々な用途に使用できます。