Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: download files from google drive using url

I am trying to download files from google drive and all I have is the drive's URL.

I have read about google API that talks about some drive_service and MedioIO, which also requires some credentials( mainly JSON file/OAuth). But I am unable to get any idea about how it is working.

Also, tried urllib2.urlretrieve, but my case is to get files from the drive. Tried wget too but no use.

Tried PyDrive library. It has good upload functions to drive but no download options.

Any help will be appreciated. Thanks.

like image 948
rkatkam Avatar asked Jul 21 '16 18:07

rkatkam


People also ask

How do I download a ZIP file from Google Drive to Python?

Download-Large-File-From-Google-Drive-Using-PythonGet the file ID of your file on Google Drive (i.e. from the sharable link) Paste the file ID in file_id. Specify the full path of where you want to save the downloaded file. call the function download_file_from_google_drive(file_id, destination)


2 Answers

If by "drive's url" you mean the shareable link of a file on Google Drive, then the following might help:

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) 

The snipped does not use pydrive, nor the Google Drive SDK, though. It uses the requests module (which is, somehow, an alternative to urllib2).

When downloading large files from Google Drive, a single GET request is not sufficient. A second one is needed - see wget/curl large file from google drive.

like image 90
turdus-merula Avatar answered Sep 22 '22 15:09

turdus-merula


Having had similar needs many times, I made an extra simple class GoogleDriveDownloader starting on the snippet from @user115202 above. You can find the source code here.

You can also install it through pip:

pip install googledrivedownloader 

Then usage is as simple as:

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) 

This snippet will download an archive shared in Google Drive. In this case 1iytA1n2z4go3uVCwE__vIKouTKyIDjEq is the id of the sharable link got from Google Drive.

like image 23
ndrplz Avatar answered Sep 20 '22 15:09

ndrplz