81

我正在尝试从谷歌驱动器下载文件,而我所拥有的只是驱动器的 URL。

我已经阅读了有关 google API 的内容,其中讨论了一些drive_serviceand MedioIO,它还需要一些凭据(主要是 JSON file/OAuth)。但我无法知道它是如何工作的。

另外,试过urllib2.urlretrieve了,但我的情况是从驱动器中获取文件。也试过wget了,但没有用。

试过PyDrive图书馆。它具有良好的上传功能来驱动,但没有下载选项。

任何帮助将不胜感激。谢谢。

4

10 回答 10

100

如果“驱动器的网址”是指 Google Drive 上文件的可共享链接,那么以下内容可能会有所帮助:

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)

不过,截图不使用pydrive,也不使用 Google Drive SDK。它使用requests模块(不知何故,它是urllib2的替代品)。

从 Google Drive 下载大文件时,单个 GET 请求是不够的。需要第二个 - 请参阅google drive 中的 wget/curl 大文件

于 2016-08-30T10:39:01.153 回答
54

多次有类似的需求后,我GoogleDriveDownloader从上面@user115202 的片段开始制作了一个额外简单的类。您可以在此处找到源代码。

也可以通过 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 Drive 中共享的存档。在这种情况下1iytA1n2z4go3uVCwE__vIKouTKyIDjEq,是从 Google Drive 获得的可共享链接的 id。

于 2017-12-11T21:09:25.800 回答
49

我推荐gdown包。

pip install gdown

获取您的分享链接

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

并抓住 id - 例如。1TLNdIufzwesDbyr_nVTR7Zrx9oRHLM_N 通过按下载按钮(在链接中查找),然后在下面的 id 后面交换。

import gdown

url = 'https://drive.google.com/uc?id=0B9P1L--7Wd2vNm9zMTJWOGxobkU'
output = '20150428_collected_images.tgz'
gdown.download(url, output, quiet=False)
于 2019-12-25T09:12:36.297 回答
6

PyDrive允许您使用该功能下载文件GetContentFile()您可以在此处找到该函数的文档。

请参见下面的示例:

# 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对象,可以在此处此处找到有关此的文档。

在一般情况下,这样做是这样的:

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)

可以在此处找到有关服务器上的静默身份验证的信息,其中涉及编写一个settings.yaml(示例:here),您可以在其中保存身份验证详细信息。

于 2016-07-21T23:47:23.233 回答
6

这是一种无需第三方库和服务帐户的简单方法。

点安装google-api-coregoogle-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))


于 2020-08-24T20:49:38.637 回答
2

一般来说,来自 Google Drive 共享文件的 URL 如下所示

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

其中1HV6vf8pB-EYnjcJcH65eGZVMa2v2tcMh对应于fileID。

因此,您可以简单地创建一个函数来从 URL 中获取 fileID,就像这样 where url = https://drive.google.com/file/d/1HV6vf8pB-EYnjcJcH65eGZVMa2v2tcMh/view?usp=sharing

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

打印 x 会给

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

因此,当我们要返回第 6 个数组值时,我们使用x[5].

于 2020-06-16T13:56:32.443 回答
1
# 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?只需通过 id= 拆分 url 即可获得 file_id。

file_id = url.split("id=")[1]
于 2017-12-12T02:32:45.747 回答
1

这在上面也有描述,

   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') 

这会下载文件

于 2017-09-03T18:09:42.327 回答
0

这个例子是基于一个类似于RayB的,但是将文件保存在内存中并且稍微简单一些,你可以将它粘贴到colab中并且它可以工作。

import googleapiclient.discovery
import oauth2client.client
from google.colab import auth
auth.authenticate_user()

def download_gdrive(id):
  creds = oauth2client.client.GoogleCredentials.get_application_default()
  service = googleapiclient.discovery.build('drive', 'v3', credentials=creds)
  return service.files().get_media(fileId=id).execute()

a = download_gdrive("1F-yaQB8fdsfsdafm2l8WFjhEiYSHZrCcr")
于 2022-02-27T23:53:25.617 回答
-2

您可以安装 https://pypi.org/project/googleDriveFileDownloader/

pip install googleDriveFileDownloader

并下载文件,这里是下载的示例代码

from googleDriveFileDownloader import googleDriveFileDownloader
a = googleDriveFileDownloader()
a.downloadFile("https://drive.google.com/uc?id=1O4x8rwGJAh8gRo8sjm0kuKFf6vCEm93G&export=download")
于 2019-12-06T11:23:14.360 回答