web-dev-qa-db-ja.com

Python:URLを使用してGoogleドライブからファイルをダウンロードする

Googleドライブからファイルをダウンロードしようとしていますが、ドライブのURLしかありません。

私は、いくつかの資格情報(主にjsonファイル/ oauth)も必要とする、いくつかのdrive_serviceとMedioIOについて話すgoogle apiについて読みました。しかし、私はそれがどのように機能するかについてのアイデアを得ることができません。

また、urllib2 urlretrieveを試しましたが、私の場合はドライブからファイルを取得します。 「wget」も試してみましたが、使いません。

Pydriveライブラリを試しました。運転には良いアップロード機能がありますが、ダウンロードオプションはありません。

任意の助けをいただければ幸いです。ありがとう。

22
rkatkam

「ドライブのURL」とは、Googleドライブ上のファイルの共有可能リンクを意味する場合、以下が役立つ可能性があります。

import requests

def download_file_from_google_drive(id, destination):
    URL = "https://docs.google.com/uc?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 = 'DESTINATION FILE ON YOUR DISK'
    download_file_from_google_drive(file_id, destination)

ただし、SnippedはpydriveもGoogle Drive SDKも使用しません。 requests モジュールを使用します(これはurllib2に代わるものです)。

Googleドライブから大きなファイルをダウンロードする場合、1回のGETリクエストでは不十分です。 2つ目は必要です- Googleドライブからのwget/curl大きなファイル を参照してください。

34
turdus-merula

同様のニーズが何度もあったので、上記の@ user115202のスニペットから開始する特別な単純なクラスGoogleDriveDownloaderを作成しました。ソースコードを見つけることができます こちら

Pipからインストールすることもできます:

pip install googledrivedownloader

次に、使用方法は次のように簡単です。

from google_drive_downloader import GoogleDriveDownloader as gdd

gdd.download_file_from_google_drive(file_id='1iytA1n2z4go3uVCwE__vIKouTKyIDjEq',
                                    dest_path='./data/mnist.Zip',
                                    unzip=True)

このスニペットは、Googleドライブで共有されているアーカイブをダウンロードします。この場合 1iytA1n2z4go3uVCwE__vIKouTKyIDjEqは、Googleドライブから取得した共有可能なリンクのIDです。

14
ndrplz

PyDriveを使用すると、関数GetContentFile()を含むファイルをダウンロードできます。関数のドキュメントを見つけることができます here

以下の例を参照してください。

# Initialize GoogleDriveFile instance with file id.
file_obj = drive.CreateFile({'id': '<your file ID here>'})
file_obj.GetContentFile('cats.png') # Download file as 'cats.png'.

このコードは、認証済みdriveオブジェクトがあることを前提としています。これに関するドキュメントは here および here にあります。

一般的な場合、これは次のように行われます。

from pydrive.auth import GoogleAuth

gauth = GoogleAuth()
# Create local webserver which automatically handles authentication.
gauth.LocalWebserverAuth()

# Create GoogleDrive instance with authenticated GoogleAuth instance.
drive = GoogleDrive(gauth)

サーバーでのサイレント認証に関する情報は here にあり、settings.yaml(例: here )ここで、認証の詳細を保存します。

2
Robin Nabel
# Importing [PyDrive][1] OAuth
from pydrive.auth import GoogleAuth

def download_tracking_file_by_id(file_id, download_dir):
    gauth = GoogleAuth(settings_file='../settings.yaml')
    # Try to load saved client credentials
    gauth.LoadCredentialsFile("../credentials.json")
    if gauth.credentials is None:
        # Authenticate if they're not there
        gauth.LocalWebserverAuth()
    Elif gauth.access_token_expired:
        # Refresh them if expired
        gauth.Refresh()
    else:
        # Initialize the saved creds
        gauth.Authorize()
    # Save the current credentials to a file
    gauth.SaveCredentialsFile("../credentials.json")

    drive = GoogleDrive(gauth)

    logger.debug("Trying to download file_id " + str(file_id))
    file6 = drive.CreateFile({'id': file_id})
    file6.GetContentFile(download_dir+'mapmob.Zip')
    zipfile.ZipFile(download_dir + 'test.Zip').extractall(UNZIP_DIR)
    tracking_data_location = download_dir + 'test.json'
    return tracking_data_location

上記の関数は、file_idが指定されたファイルを指定されたダウンロードフォルダーにダウンロードします。さて、問題は残っています。file_idを取得する方法は? URLをid =で分割して、file_idを取得します。

file_id = url.split("id=")[1]
0
Shivendra

これについても上記で説明しましたが、

   from pydrive.auth import GoogleAuth
   gauth = GoogleAuth()
   gauth.LocalWebserverAuth()
   drive = GoogleDrive(gauth)

これにより、独自のサーバーが作成され、認証の汚い作業が行われます

   file_obj = drive.CreateFile({'id': '<Put the file ID here>'})
   file_obj.GetContentFile('Demo.txt') 

これはファイルをダウンロードします

0
CAt Corperation