この記事では、Pythonの`aiohttp`ライブラリを使用して非同期HTTPリクエストを行う方法について詳しく説明します。基本的な使い方から、エラーハンドリング、そして応用例まで、幅広くカバーします。
目次
はじめに
非同期処理は、特にI/Oバウンドな処理において効率を大きく向上させる手法の一つです。`aiohttp`は、Pythonで非同期HTTPリクエストを簡単に扱うことができるライブラリです。
基本的な使い方
インストール
まずは`aiohttp`をインストールしましょう。
pip install aiohttp
GETリクエストの例
最もシンプルなGETリクエストの例を示します。
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
url = "https://www.example.com"
html = await fetch(url)
print(html)
if __name__ == '__main__':
asyncio.run(main())
コードの解説
– `ClientSession`はHTTPリクエスト・レスポンスを管理するクラスです。
– `session.get(url)`でGETリクエストを発行しています。
– `response.text()`でレスポンスの内容をテキスト形式で取得しています。
エラーハンドリング
実際の環境では、ネットワークエラーやサーバーの問題など、さまざまなエラーが発生する可能性があります。
ステータスコードによるエラーハンドリング
async def fetch_with_error_handling(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
if response.status != 200:
print(f"Failed to get {url}: {response.status}")
return
return await response.text()
応用例
ここからは、実際に`aiohttp`を活用する応用例をいくつか紹介します。
複数のURLを同時に取得する
async def fetch_multiple(urls):
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
task = fetch(url, session)
tasks.append(task)
return await asyncio.gather(*tasks)
async def fetch(url, session):
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://www.example1.com", "https://www.example2.com"]
results = await fetch_multiple(urls)
for url, html in zip(urls, results):
print(f"{url}: {len(html)} characters")
コードの解説
– `asyncio.gather(*tasks)`で複数の非同期タスクを並行して実行しています。
POSTリクエストの送信
async def send_post(url, data):
async with aiohttp.ClientSession() as session:
async with session.post(url, data=data) as response:
return await response.json()
コードの解説
– `session.post(url, data=data)`でPOSTリクエストを送信しています。
– `response.json()`でJSON形式のレスポンスを取得しています。
まとめ
この記事では、`aiohttp`ライブラリを用いた基本的な操作からエラーハンドリング、さらには応用例までを解説しました。このライブラリをうまく活用することで、非同期処理を効率よく実装することができます。
コメント