【Python】boxに公開されているデータを一括ダウンロードする
概要
行動認識などの動画データセットは、youtubeから動画をダウンロードするのが一般的ですが、 稀にboxなどで提供されていることがあります。
軽量なファイルであればweb上で一括ダウンロードが可能なのですが、動画などのサイズが大きいファイルがあると、 「選択した項目がダウンロードサイズの上限を超えています。」とエラーを吐かれてしまいます。
そこで今回は、python用のbox SDKを用いて、boxのストレージから一括でファイルをダウンロードする方法について、こちらにメモを残しておきます。
準備
ファイルを一括ダウンロードするにあたり、以下の準備が必要です。
- Boxアカウントの準備
- 開発者コンソールより、Boxアプリの作成
- Developer Tokenの取得
- 必要なパッケージのインストール
Boxアカウントの準備
まず以下のサイトにアクセスし、ログインします。 アカウントを持っていない場合は作成してください。
開発者コンソールより、Boxアプリの作成
続いて開発者コンソールの左、マイアプリのページから、Boxアプリの新規作成をクリックします。
「アクセス制限付きアプリ」を選択し、適当な名前を付与後、「アプリの作成」をクリックします。
Developer Tokenの取得
先ほど作成したアプリのページの「構成」から、プライマリアクセストークンの生成を行います。
このトークンは後ほど使用するので、どこかにメモをしておいてください。
必要なパッケージのインストール
今回は以下の二つのパッケージを使用します。
いずれもpipで簡単にインストールが可能です
pip install wget boxsdk
boxからファイルを一括ダウンロードする
それでは、boxからファイルを一括ダウンロードしていきます。 以下はそのスクリプトです。
import wget from boxsdk import DevelopmentClient BOX_URL = "" # ダウンロードしたいboxのURLを設定 SAVE_DIR = "./downloads" os.makedirs(SAVE_DIR, exist_ok=True) def main() -> None: client = DevelopmentClient() shared_folder = client.get_shared_item(BOX_URL) for item in shared_folder.get_items(limit=1000): if item.type == "file": # ファイルをダウンロードするためのURLを取得。 link = item.get_download_url() # ファイルダウンロード wget.download(link, out=SAVE_DIR) if __name__ == "__main__": main()
上記のスクリプトを実行すると、tokenの入力が求められるので、先ほど取得したdeveloper tokenを入力します。
注意点としては、公式のドキュメントによると、 box上のファイルのダウンロードは、以下のようにファイルIDを指定することで可能なのですが、
file_id = '11111' # Write the Box file contents to disk with open('file.pdf', 'wb') as output_file: client.file(file_id).download_to(output_file)
これはあくまで自分のbox内にあるファイルにのみ可能なようで、他の方のboxのファイルはこの方法でダウンロードができないようでした。
そのため、get_download_url
メソッドでダウンロード可能なURLを取得し、wget
でダウンロードする方法をとっております。