Google ColabでGoogle driveの公開ファイルを直接ダウンロードする方法


1.はじめに

 Google Colab で Google drive の公開ファイル (例えば、fastText日本語版の学習済みモデルとか) を使う場合は、PCに一旦ダウンロードしてから Google drive経由で使うのが一般的だと思います。

 普通はこの方法で問題ないわけですが、場合によっては わざわざ別途手動でダウンロードせずに、Google Colab を先頭からポチポチするだけで動くコードにしたいと思ったりするわけです。

 今回は、そのための良い方法をWebで見つけましたので、備忘録として残します。

2.サンプルコード

 サンプル例は、fastText日本語版学習済みモデル です。URLをクリックすると、まずこの画面が現れます。

 この画面で、赤枠のボタンを押すと、ダウンロード画面になります。

 そうしたら、このダウンロード画面のURLを控えておきます。後は、以下のコードで、直接ダウンロード出来ます。

# Google drive からfastText日本語モデル(vector_neologd.zip)をダウンロードする
import requests

def download_file_from_google_drive(id, destination):

       # ダウンロード画面のURL
       URL = "https://drive.google.com/uc?id=0ByFQ96A4DgSPUm9wVWRLdm5qbmc&export=download" 

       session = requests.Session()

       response = session.get(URL, params = { 'id' : id }, stream = True)
       token = get_confirm_token(response)

       if token:
           params = { 'id' : id, 'confirm' : token }
           response = session.get(URL, params = params, stream = True)

       save_response_content(response, destination)    

def get_confirm_token(response):
       for key, value in response.cookies.items():
           if key.startswith('download_warning'):
               return value

       return None

def save_response_content(response, destination):
       CHUNK_SIZE = 32768

       with open(destination, "wb") as f:
           for chunk in response.iter_content(CHUNK_SIZE):
               if chunk: # filter out keep-alive new chunks
                   f.write(chunk)

if __name__ == "__main__":
       file_id = 'TAKE ID FROM SHAREABLE LINK' 
       destination = './data/vector_neologd.zip'  # 保存先パスの指定
       download_file_from_google_drive(file_id, destination)

enjoy !

(参考)
Python: download files from google drive using url

<追記 2021.5.29>

 少し前から、Colab にこのためのライブラリー gdown が組み込まれて簡単になったので、追記します。
例えば、
表示リンク: https://drive.google.com/file/d/1vcxH6JOtwh_-FoZ8SNXYlHF9qCi3YoDH/view
ダウンロードリンク: https://drive.google.com/u/1/uc?id=1vcxH6JOtwh_-FoZ8SNXYlHF9qCi3YoDH&export=download 
のときは、
1vcxH6JOtwh_-FoZ8SNXYlHF9qCi3YoDHidです。このとき、ダウンロードするファイルが、food_101.zip であれば、下記のコードでダウンロードできます。

import gdown
gdown.download('https://drive.google.com/uc?id=1vcxH6JOtwh_-FoZ8SNXYlHF9qCi3YoDH', 'food_101.zip', quiet=False)
! unzip food_101.zip

 これだけです。超簡単になりました! colab はだんだんと使いやすくなっていますね。