Pythonの非同期処理を利用して複数のWebサイトからデータをJSONファイルとして書き込み、またはデータを表示してみます。
■今回の環境(Python)
今回のPythonはバージョン3.8.5を用いる。(Mac OS)
■非同期処理を利用して複数のWebサイトからデータをJSONファイルとして書き込み
では、早速非同期処理を利用して複数のWebサイトからデータをJSONファイルとして書き込み、またはデータの表示をするスクリプトを書いていきます。
■コード
import asyncio import aiohttp import simplejson as json # 非同期関数 async def fetch_data(session, url): async with session.get(url) as response: data = await response.text() print(f"データ取得完了: {url}") return data # メイン関数 async def main(): # セッションの作成 async with aiohttp.ClientSession() as session: # 非同期処理の並行実行 urls = [ "https://www.baidu.com/", "https://google.com", "https://yahoo.co.jp", ] tasks = [fetch_data(session, url) for url in urls] results = await asyncio.gather(*tasks) print("取得したデータ:") for url, data in zip(urls, results): print(f"{url}: {data[:50]}...") # データをJSONファイルに書き込む json_data = {url: data for url, data in zip(urls, results)} with open("data.json", "w") as f: json.dump(json_data, f,ensure_ascii=False) # イベントループの作成と実行 loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()
まずはモジュールのインポートします。今回はasyncio、aiohttp、および simplejson(jsonとしてインポートされています)モジュールをインポートします。これらのモジュールは非同期処理とHTTPクライアント、およびJSON操作のために使用されます。
次にfetch_data非同期関数を定義します。これは指定されたURLからデータを非同期に取得するための関数です。sessionオブジェクトを使用してURLにGETリクエストを送信し、レスポンスのテキストデータを取得します。そして、取得したデータを返します。
次にmain非同期関数を定義します。メインの非同期処理関数です。aiohttp.ClientSessionオブジェクトを作成してセッションを確立し、複数のURLに対して非同期処理を並行して実行します。fetch_data関数を使用して各URLからデータを取得し、結果をリストに格納します。取得したデータと対応するURLを表示します。
次にデータのJSONファイルへの書き込みを行います。取得したデータをJSON形式の辞書に格納します。各URLをキー、対応するデータを値として持ちます。with open(“data.json”, “w”) as f:を使用して、ファイル名が”data.json”で書き込みモードでファイルを開きます。json.dumpを使用して、辞書のデータをJSONファイルに書き込みます。ensure_ascii=Falseとすることで、日本語文字をそのままの形式で書き込むことができます。
次にイベントループの作成と実行を行います。asyncio.get_event_loopを使用してイベントループを取得し、main関数をloop.run_until_completeに渡して非同期処理を実行します。最後に、イベントループをクローズします。
■実行・検証
このスクリプトを「multiple_website_s.py」という名前で、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、ターミナルから実行してみます。
実行してみると、非同期処理によって、今回指定した複数のURLからデータが取得され、取得したデータがターミナルに表示されます。また、取得したデータはJSONファイルに書き込まれます。
書き込み後、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)を確認すると今回は「data.json」という名前でJSON形式のファイルが生成されていることが確認できました。
コメント