Pythonでaiofileとrequestsを用いた非同期処理でURLの情報をファイルに書き込みしてみます。
今回はasyncio、aiofile、requests、beautifulSoupを用います。これらのライブラリ・モジュールが事前にインストールされているかを確認しスクリプトを実行してください。
■Python
今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows11)
■aiofileとrequestsを用いた非同期処理でURLの情報をファイルに書き込み
では、早速aiofileとrequestsを用いた非同期処理でURLの情報を取得し、取得した情報をファイルに書き込みするスクリプトを書いていきます。
■コード
import asyncio import aiofile import requests from bs4 import BeautifulSoup async def get_title(url): response = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') title = soup.title.string.strip() return title async def write_title_to_file(url, file_path): title = await get_title(url) async with aiofile.async_open(file_path, 'w') as f: await f.write(title) async def main(): url = 'https://www.yahoo.co.jp/' # タイトルを取得したいURLを指定してください file_path = 'title.txt' # タイトルを書き込むファイルパスを指定してください await write_title_to_file(url, file_path) if __name__ == '__main__': asyncio.run(main())
まず、必要なモジュールをインポートします。 非同期処理を行うためにasyncio、ファイル操作を非同期で行うためにaiofile、HTTPリクエストを送信するためにrequests、HTMLの解析を行うためにBeautifulSoupをインポートします。
次にget_title関数を定義します。この関数は指定したURLのタイトルを非同期で取得します。requests.getメソッドを使用してURLにGETリクエストを送信し、そのレスポンスのHTMLコンテンツをBeautifulSoupで解析してタイトルを取得します。最後に取得したタイトルを返します。
定義後、write_title_to_file関数を定義します。この関数は、指定したURLのタイトルを非同期で取得し、そのタイトルを指定したファイルに書き込みます。await get_title(url)を使用してget_title関数を非同期に呼び出し、タイトルを取得します。その後、aiofile.async_openを使用してファイルを非同期に開き、タイトルを書き込みます。
次にmain関数を定義します。この関数はプログラムのエントリーポイントです。ここでは、取得したいURLとタイトルを書き込むファイルのパスを指定し、write_title_to_file関数を非同期に呼び出します。今回のURLは「https://www.yahoo.co.jp/」とします。
最後にプログラムを実行させるためのコードを記述します。asyncio.runを使用してmain関数を実行します。if __name__ == ‘__main__’:の条件は、このプログラムが直接実行された場合にのみ実行されることを保証します。なお、asyncio.runはPython 3.7以降で利用可能な関数であり、イベントループを作成し非同期コルーチンを実行します。
■検証・実行
今回書いたスクリプトを「url_a.py」という名前でPythonが実行されている作業ディレクトリ(カレントディレクトリ)に保存し、コマンドプロンプトから実行してみます。
実行してみると、スクリプトは実行されましたが、コマンドプロンプトでは何も表示されません。
しかし、Pythonが実行されている作業ディレクトリ(カレントディレクトリ)内を確認すると「title.txt」というtxt形式のテキストファイルが生成されていることが確認でき、このファイルを開くと取得されたタイトルが書き込まれていました。
検証結果から、非同期処理を使用してWebページからタイトルを取得し、aiofileモジュールを使用して非同期にファイルに書き込み、プログラムの実行がブロックされずに高速に処理ができました。
コメント