DriveのURLからデータを直接ダウンロード(+ Google Colaboratory)


2021/7/12追記
* gdownを用いてより簡単にダウンロードする手順を追記しました。

初めに

以下この記事の流れです。
1. Google Driveの共有リンクから直接ダウンロードを可能にする
2. pythonまたはwget,curl(CLI上)で先ほどのURLを用いてデータをダウンロード
3. Google Coloaboratoryでの実行する際の注意点

Google Driveの共有リンクで直接ダウンロード

Google Driveでファイル共有リンクを作成すると以下のようなページに飛び手動でダウンロードする手間がある。

そこでURLをクリックして直接ダウンロードを行えるようにURLを変換する。URL変換ツールなどが存在するが、URLを以下のように書き換えるだけでURLから直接ダウンロードが可能になる。

file/d->uc?id=oruc?export=download&id=
/view?usp=sharing->

https://drive.google.com/file/d/<file_id>/view?usp=sharing
↓
https://drive.google.com/uc?id=<file_id>
or
https://drive.google.com/uc?export=download&id=<file_id>

Python or Shellでダウンロード

先ほど変換したURLを指定しurlretrieveや、wget,curlでダウンロードをするコード

Python

import urllib.request
import sys
url = "https://drive.google.com/uc?export=download&id=<file_id>"
file_name = "file_name"
urllib.request.urlretrieve(url, file_name)

Shell

wget "https://drive.google.com/uc?export=download&id=<FILE_ID>" -O <FILE_NAME>
or
curl "https://drive.google.com/uc?export=download&id=<FILE_ID>" -O <FILE_NAME>

大きいファイルの場合

以下のようにファイルサイズが大きすぎる場合ウィルススキャンが行われないため、ダウンロードをする際に確認がはいってしまい、先ほどのコードを実行すると確認ページ自体のhtmlファイルがダウンロードされてしまう。

それを避けるためにconfirm用のcodeを取得する必要がある。以下のコードで取得できる。

curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=<FILE_ID>" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"  
curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=<FILE_ID>" -o <FILE_NAME>

最も簡単な方法

gdown(OSS)を用いる。
gdownでは認証は用いられていないので、URLを共有状態にしてからダウンロードする必要がある。codeを取得するスクリプトを書く必要がないので楽。

!gdown https://drive.google.com/uc?id=<file_id>

Google Coloboratory上での実行

先ほどのコードをセルで実行するだけだが、以下のように行頭に!を付け加えるだけでは変数が保存されない。なので、セルの頭に%%shellを記述することでshell scriptのように実行できる。

先ほどのコードの頭に%%shellを追加する

unzipなど

最後に

google driveの容量に制限がある方はcolab上で完結できる点や、githubには大量のデータを置くことができないのでGoogleColaboratoryのノートブックファイルなど共有する際にあらかじめ記述して置くことで、cloneしてセルを実行するだけで済むという利点はあるかなぁと思いました。

参考&引用

curlやwgetで公開済みGoogle Driveデータをダウンロードする
PythonでWeb上のファイルをダウンロードする
gdown