yiskw note

機械学習やプログラミングについて気まぐれで書きます

【Python】boxに公開されているデータを一括ダウンロードする


概要

行動認識などの動画データセットは、youtubeから動画をダウンロードするのが一般的ですが、 稀にboxなどで提供されていることがあります。

軽量なファイルであればweb上で一括ダウンロードが可能なのですが、動画などのサイズが大きいファイルがあると、 「選択した項目がダウンロードサイズの上限を超えています。」とエラーを吐かれてしまいます。

そこで今回は、python用のbox SDKを用いて、boxのストレージから一括でファイルをダウンロードする方法について、こちらにメモを残しておきます。

準備

ファイルを一括ダウンロードするにあたり、以下の準備が必要です。

  1. Boxアカウントの準備
  2. 開発者コンソールより、Boxアプリの作成
  3. Developer Tokenの取得
  4. 必要なパッケージのインストール

Boxアカウントの準備

まず以下のサイトにアクセスし、ログインします。 アカウントを持っていない場合は作成してください。

app.box.com

開発者コンソールより、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でダウンロードする方法をとっております。

Reference