web-dev-qa-db-fra.com

Python: télécharger des fichiers à partir de Google Drive en utilisant l'URL

J'essaie de télécharger des fichiers à partir de Google Drive et tout ce que j'ai, c'est l'URL du lecteur.

J'ai lu quelque chose sur Google Api qui parle de drive_service et de MedioIO, qui nécessite également des informations d'identification (principalement json fichier/oauth). Mais je suis incapable d’avoir une idée de son fonctionnement. 

En outre, essayé urllret2 urlretrieve, mais mon cas est d'obtenir des fichiers à partir du lecteur. Essayé 'wget' aussi mais pas d'utilisation.

Essayé bibliothèque pydrive. Il possède de bonnes fonctions de téléchargement mais pas d’option de téléchargement.

Toute aide sera appréciée, merci.

13
rkatkam

Si vous entendez par "URL de l'unité" le lien partageable d'un fichier sur Google Drive, voici ce qui pourrait vous aider:

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 __== "__main__":
    file_id = 'TAKE ID FROM SHAREABLE LINK'
    destination = 'DESTINATION FILE ON YOUR DISK'
    download_file_from_google_drive(file_id, destination)

Le snippé n'utilise cependant pas pydrive, ni le SDK Google Drive. Il utilise le module request (qui est en quelque sorte une alternative à urllib2).

Lors du téléchargement de fichiers volumineux à partir de Google Drive, une seule requête GET ne suffit pas. Un second est nécessaire - voir wget/curl un fichier volumineux à partir de google drive .

19
turdus-merula

Ayant eu des besoins similaires à plusieurs reprises, j'ai créé une classe extra simple GoogleDriveDownloader à partir du fragment extrait de @ user115202 ci-dessus. Vous pouvez trouver le code source ici .

Vous pouvez également l'installer via pip:

pip install googledrivedownloader

Ensuite, l'utilisation est aussi simple que:

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)

Cet extrait téléchargera une archive partagée dans Google Drive. Dans ce cas, 1iytA1n2z4go3uVCwE__vIKouTKyIDjEq est l'id du lien que vous pouvez partager fourni par Google Drive.

8
ndrplz

PyDrive vous permet de télécharger un fichier avec la fonction GetContentFile(). Vous pouvez trouver la documentation de la fonction ici .

Voir exemple ci-dessous:

# 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'.

Ce code suppose que vous avez un objet drive authentifié. Les documents correspondants peuvent être trouvés ici et ici .

Dans le cas général, cela se fait comme suit:

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)

Vous trouverez des informations sur l'authentification silencieuse sur un serveur ici et implique l'écriture d'un settings.yaml (exemple: ici ) dans lequel vous enregistrez les détails de l'authentification.

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

La fonction ci-dessus télécharge le fichier en fonction du file_id dans un dossier de téléchargement spécifié. Maintenant la question reste, comment obtenir le file_id? Il suffit de scinder l’url par id = pour obtenir le file_id.

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

Cela a également été décrit ci-dessus,

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

Cela crée son propre serveur aussi faire le sale boulot de l'authentification

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

Cela télécharge le fichier

0
CAt Corperation