Python: bestanden downloaden van Google Drive met url

Ik probeer bestanden te downloaden van Google Drive en ik heb alleen de URL van de drive.

Ik heb gelezen over google API die spreekt over een aantal drive_serviceen MedioIO, waarvoor ook enkele inloggegevens vereist zijn (voornamelijk JSON file/OAuth) . Maar ik krijg geen idee hoe het werkt.

Ook urllib2.urlretrievegeprobeerd, maar mijn zaak is om bestanden van de schijf te halen. Heb wgetook geprobeerd, maar geen zin.

Geprobeerd PyDrivebibliotheek. Het heeft goede uploadfuncties om te rijden, maar geen downloadopties.

Alle hulp wordt op prijs gesteld.
Bedankt.


Antwoord 1, autoriteit 100%

Als u met ‘url van drive’ de deelbare linkvan een bestand op Google Drive bedoelt, kan het volgende helpen:

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)

De geknipte versie gebruikt echter geen pydrive, noch de Google Drive SDK. Het gebruikt de module requests(wat op de een of andere manier een alternatief is voor urllib2) .

Bij het downloaden van grote bestanden van Google Drive is een enkel GET-verzoek niet voldoende. Een tweede is nodig – zie wget/curl groot bestand van Google Drive.


Antwoord 2, autoriteit 55%

Omdat ik vaak soortgelijke behoeften had, heb ik een extra eenvoudige klasse GoogleDriveDownloadergemaakt, beginnend met het fragment van @user115202 hierboven. Je kunt de broncode hiervinden.

Je kunt het ook installeren via pip:

pip install googledrivedownloader

Dan is het gebruik zo simpel als:

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)

Met dit fragment wordt een archief gedownload dat wordt gedeeld in Google Drive. In dit geval is 1iytA1n2z4go3uVCwE__vIKouTKyIDjEqde id van de deelbare link die is verkregen van Google Drive.


Antwoord 3, autoriteit 49%

Ik raad het gdown-pakket aan.

pip install gdown

Neem je deellink

https://drive.google.com/file /d/0B9P1L–7Wd2vNm9zMTJWOGxobkU/view?usp=sharing

en pak de id – bijv. 1TLNdIufzwesDbyr_nVTR7Zrx9oRHLM_N door op de downloadknop te drukken (kijk naar de link), en wissel het in na de onderstaande id.

import gdown
url = 'https://drive.google.com/uc?id=0B9P1L--7Wd2vNm9zMTJWOGxobkU'
output = '20150428_collected_images.tgz'
gdown.download(url, output, quiet=False)

Antwoord 4, autoriteit 6%

Met

PyDrivekunt u een bestand downloaden met de functie GetContentFile(). U kunt de documentatie van de functie hiervinden.

Zie voorbeeld hieronder:

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

Deze code gaat ervan uit dat je een geauthenticeerd drive-object hebt, de documenten hierover zijn te vinden hieren hier.

In het algemeen wordt dit als volgt gedaan:

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)

Informatie over stille authenticatie op een server is te vinden hieren omvat het schrijven van een settings.yaml(voorbeeld: hier) waarin u de authenticatiegegevens opslaat.


Antwoord 5, autoriteit 5%

Hier is een eenvoudige manier om dit te doen zonder externe bibliotheken en een serviceaccount.

pip install google-api-coreen google-api-python-client

from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
from google.oauth2 import service_account
import io
credz = {} #put json credentials her from service account or the like
# More info: https://cloud.google.com/docs/authentication
credentials = service_account.Credentials.from_service_account_info(credz)
drive_service = build('drive', 'v3', credentials=credentials)
file_id = '0BwwA4oUTeiV1UVNwOHItT0xfa2M'
request = drive_service.files().get_media(fileId=file_id)
#fh = io.BytesIO() # this can be used to keep in memory
fh = io.FileIO('file.tar.gz', 'wb') # this can be used to write to disk
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%." % int(status.progress() * 100))

Antwoord 6, autoriteit 2%

Over het algemeen ziet een URL van een gedeeld bestand van Google Drive er als volgt uit

https://drive.google.com/file/d/1HV6vf8pB-EYnjcJcH65eGZVMa2v2tcMh/view?usp=sharing

waar 1HV6vf8pB-EYnjcJcH65eGZVMa2v2tcMhovereenkomt met bestandsID.

Daarom kunt u eenvoudig een functie maken om de bestandsID uit de URL te halen, zoals deze waar url = https://drive.google.com/file/d/1HV6vf8pB-EYnjcJcH65eGZVMa2v2tcMh/view?usp=sharing,

def url_to_id(url):
    x = url.split("/")
    return x[5]

Afdrukken met x geeft

['https:', '', 'drive.google.com', 'file', 'd', '1HV6vf8pB-EYnjcJcH65eGZVMa2v2tcMh', 'view?usp=sharing']

En dus, omdat we de 6e array-waarde willen retourneren, gebruiken we x[5].


Antwoord 7

Dit is ook hierboven beschreven,

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

Dit creëert zijn eigen server en doet ook het vuile werk van authenticatie

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

Hiermee wordt het bestand gedownload


Antwoord 8

# 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

De bovenstaande functie downloadt het bestand met de bestands-id naar een opgegeven downloadmap. Nu blijft de vraag, hoe de file_id te krijgen? Splits eenvoudig de url door id= om de file_id te krijgen.

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

Antwoord 9

U kunt https://pypi.org/project/googleDriveFileDownloader/

pip install googleDriveFileDownloader

En download het bestand, hier is de voorbeeldcode om te downloaden

from googleDriveFileDownloader import googleDriveFileDownloader
a = googleDriveFileDownloader()
a.downloadFile("https://drive.google.com/uc?id=1O4x8rwGJAh8gRo8sjm0kuKFf6vCEm93G&export=download")

Other episodes