615 Stimmen

Wget/curl große Datei von Google Drive herunterladen

Ich versuche, eine Datei von Google Drive in einem Skript herunterzuladen, und habe dabei ein kleines Problem. Die Dateien, die ich herunterladen möchte, sind hier.

Ich habe online intensiv nach Informationen gesucht und es schließlich geschafft, eine davon herunterzuladen. Ich habe die UIDs der Dateien bekommen und die kleinere (1,6 MB) wird ohne Probleme heruntergeladen, jedoch wird die größere Datei (3,7 GB) immer auf eine Seite umgeleitet, die mich fragt, ob ich den Download ohne Virenscan fortsetzen möchte. Kann mir jemand helfen, diese Seite zu umgehen?

So habe ich die erste Datei zum Laufen gebracht -

curl -L "https://docs.google.com/uc?export=download&id=0Bz-w5tutuZIYeDU0VDRFWG9IVUE" > phlat-1.0.tar.gz

Wenn ich dasselbe mit der anderen Datei mache,

curl -L "https://docs.google.com/uc?export=download&id=0Bz-w5tutuZIYY3h5YlMzTjhnbGM" > index4phlat.tar.gz

Bekomme ich die folgende Ausgabe - enter image description here

Ich bemerke auf der vorletzten Zeile des Links, dass ein &confirm=JwkK vorhanden ist, was eine zufällige 4-Zeichenfolge ist, aber darauf hinweist, dass es einen Weg gibt, eine Bestätigung zu meiner URL hinzuzufügen. Einer der Links, den ich besucht habe, schlug &confirm=no_antivirus vor, aber das funktioniert nicht.

6voto

O.rka Punkte 26775

Dies ist der Weg:

FILEID="eindeutige_google_drive_id"
FILENAME="output_dateiname"

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=${FILEID}' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=${FILEID}" -O ${FILENAME} && rm -rf /tmp/cookies.txt

5voto

Jadli Punkte 820

Der einfache Weg, um Dateien aus Google Drive herunterzuladen, Sie können auch Dateien auf Colab herunterladen

pip install gdown

import gdown

dann

url = 'https://drive.google.com/uc?id=0B9P1L--7Wd2vU3VUVlFnbTgtS2c'
output = 'spam.txt'
gdown.download(url, output, quiet=False)

oder

fileid='0B9P1L7Wd2vU3VUVlFnbTgtS2c'

gdown https://drive.google.com/uc?id=+fileid

Dokument https://pypi.org/project/gdown/

4voto

Ender Punkte 805

Nachdem ich mit diesem Müll herumgespielt habe, habe ich einen Weg gefunden, meine süße Datei über Chrome - Entwicklertools herunterzuladen.

  1. Öffnen Sie Ihren Google Docs-Tab, Strg+Shift+J (Einstellung --> Entwicklertools)

  2. Wechseln Sie zu den Netzwerk-Tabs

  3. Klicken Sie auf Ihrer Docs-Datei auf "Herunterladen" --> Herunterladen als CSV, xlsx,....

  4. Es zeigt Ihnen die Anfrage in der "Netzwerk" Konsole enter image description here

  5. Rechtsklick -> Kopieren -> Als Curl kopieren

  6. Ihr Curl-Befehl wird so aussehen, und fügen Sie -o hinzu, um eine exportierte Datei zu erstellen. curl 'https://docs.google.com/spreadsheets/d/1Cjsryejgn29BDiInOrGZWvg/export?format=xlsx&id=1Cjsryejgn29BDiInOrGZWvg' -H 'authority: docs.google.com' -H 'upgrade-insecure-requests: 1' -H 'user-agent: Mozilla/5.0 (X..... -o server.xlsx

Gelöst!

4voto

robotic Punkte 51

Ich konnte Nanoix's Perl-Skript nicht zum Laufen bringen oder andere Curl-Beispiele, die ich gesehen hatte, also begann ich, mich selbst mit der API in Python zu beschäftigen. Das funktionierte gut für kleine Dateien, aber bei großen Dateien stieß es an die verfügbare RAM-Grenze, also fand ich anderen Code, der das Chunking nutzt. Gist hier: https://gist.github.com/csik/c4c90987224150e4a0b2

Beachten Sie den Hinweis zum Herunterladen der client_secret JSON-Datei aus der API-Schnittstelle in Ihr lokales Verzeichnis.

Quelle

$ cat gdrive_dl.py
from pydrive.auth import GoogleAuth  
from pydrive.drive import GoogleDrive    

"""API-Aufrufe, um eine sehr große Google Drive-Datei herunterzuladen. Die Drive-API erlaubt nur das Herunterladen in den RAM
   (im Gegensatz zur Streaming-Option der Requests-Bibliothek) daher müssen die Dateien teilweise heruntergeladen und gechunkt werden. 
   Die Authentifizierung erfordert einen Google API-Schlüssel und ein lokales Herunterladen von client_secrets.json
   Vielen Dank an Radek für die Schlüsselfunktionen: http://stackoverflow.com/questions/27617258/memoryerror-how-to-download-large-file-via-google-drive-sdk-using-python
"""

def partial(total_byte_len, part_size_limit):
    s = []
    for p in range(0, total_byte_len, part_size_limit):
        last = min(total_byte_len - 1, p + part_size_limit - 1)
        s.append([p, last])
    return s

def GD_download_file(service, file_id):
  drive_file = service.files().get(fileId=file_id).execute()
  download_url = drive_file.get('downloadUrl')
  total_size = int(drive_file.get('fileSize'))
  s = partial(total_size, 100000000) # Ich lade GROßE Dateien herunter, also ist eine Chunk-Größe von 100M für mich in Ordnung
  title = drive_file.get('title')
  originalFilename = drive_file.get('originalFilename')
  filename = './' + originalFilename
  if download_url:
      with open(filename, 'wb') as file:
        print "Bytes downloaded: "
        for bytes in s:
          headers = {"Range" : 'bytes=%s-%s' % (bytes[0], bytes[1])}
          resp, content = service._http.request(download_url, headers=headers)
          if resp.status == 206 :
                file.write(content)
                file.flush()
          else:
            print 'Ein Fehler ist aufgetreten: %s' % resp
            return None
          print str(bytes[1])+"..."
      return title, filename
  else:
    return None          

gauth = GoogleAuth()
gauth.CommandLineAuth() # erfordert das Ausschneiden und Einfügen aus einem Browser

FILE_ID = 'SOMEID' # FileID ist der einfache Datei-Hash, wie z.B. 0B1NzlxZ5RpdKS0NOS0x0Ym9kR0U

drive = GoogleDrive(gauth)
service = gauth.service
#file = drive.CreateFile({'id':FILE_ID})    # Verwenden Sie dies, um Metadaten der Datei zu erhalten
GD_download_file(service, FILE_ID)

4voto

Utgarda Punkte 660

Es gibt einen plattformübergreifenden Open-Source-Client, der in Go geschrieben ist: drive. Er ist ziemlich gut und umfangreich und befindet sich auch in aktiver Entwicklung.

$ drive help pull
Name
        pull - holt entfernte Änderungen von Google Drive ab
Description
        Lädt Inhalte vom entfernten Laufwerk herunter oder ändert lokale Inhalte so ab,
        dass sie mit denen auf Ihrem Google Drive übereinstimmen

Hinweis: Sie können die Prüfsummenprüfung überspringen, indem Sie die Flagge `-ignore-checksum` übergeben

* Für Hilfe bei der Verwendung von Flaggen: `drive pull -h`

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X