1148 Stimmen

Wie kann ich eine Datei über HTTP herunterladen?

Ich habe ein kleines Dienstprogramm, mit dem ich eine MP3-Datei nach einem bestimmten Zeitplan von einer Website herunterlade und dann eine Podcast-XML-Datei erstelle/aktualisiere, die ich zu iTunes hinzugefügt habe.

Die Textverarbeitung zur Erstellung/Aktualisierung der XML-Datei ist in Python geschrieben. Ich verwende jedoch wget innerhalb eines Windows .bat Datei, um die eigentliche MP3-Datei herunterzuladen. Ich würde es vorziehen, das gesamte Dienstprogramm in Python zu schreiben.

Ich hatte Mühe, eine Möglichkeit zu finden, die Datei in Python herunterzuladen, weshalb ich mich auf die Verwendung von wget .

Wie lade ich also die Datei mit Python herunter?

2 Stimmen

Viele der nachstehenden Antworten sind kein zufriedenstellender Ersatz für wget . Unter anderem, wget (1) bewahrt Zeitstempel (2) bestimmt automatisch den Dateinamen aus der URL und fügt ihn an .1 (usw.), wenn die Datei bereits existiert (3) hat viele andere Optionen, von denen Sie einige vielleicht in Ihrem .wgetrc . Wenn Sie etwas davon wollen, müssen Sie es selbst in Python implementieren, aber es ist einfacher, einfach die wget aus Python.

3 Stimmen

Kurze Lösung für Python 3: import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode(‌​)

46voto

Sara Santana Punkte 981

Verwenden. wget-Modul :

import wget
wget.download('url')

3 Stimmen

Das Repo scheint entfernt worden zu sein.

0 Stimmen

Projekt wurde nach github verschoben, aber dann von seinem Autor archiviert

46voto

H S Umer farooq Punkte 831
import os,requests
def download(url):
    get_response = requests.get(url,stream=True)
    file_name  = url.split("/")[-1]
    with open(file_name, 'wb') as f:
        for chunk in get_response.iter_content(chunk_size=1024):
            if chunk: # filter out keep-alive new chunks
                f.write(chunk)

download("https://example.com/example.jpg")

1 Stimmen

Danke, ersetzen Sie auch with open(file_name,... con with open('thisname'...) weil er einen Fehler auslösen kann

27voto

Stan Punkte 370

Eine verbesserte Version des PabloG-Codes für Python 2/3:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import ( division, absolute_import, print_function, unicode_literals )

import sys, os, tempfile, logging

if sys.version_info >= (3,):
    import urllib.request as urllib2
    import urllib.parse as urlparse
else:
    import urllib2
    import urlparse

def download_file(url, dest=None):
    """ 
    Download and save a file specified by url to dest directory,
    """
    u = urllib2.urlopen(url)

    scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
    filename = os.path.basename(path)
    if not filename:
        filename = 'downloaded.file'
    if dest:
        filename = os.path.join(dest, filename)

    with open(filename, 'wb') as f:
        meta = u.info()
        meta_func = meta.getheaders if hasattr(meta, 'getheaders') else meta.get_all
        meta_length = meta_func("Content-Length")
        file_size = None
        if meta_length:
            file_size = int(meta_length[0])
        print("Downloading: {0} Bytes: {1}".format(url, file_size))

        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break

            file_size_dl += len(buffer)
            f.write(buffer)

            status = "{0:16}".format(file_size_dl)
            if file_size:
                status += "   [{0:6.2f}%]".format(file_size_dl * 100 / file_size)
            status += chr(13)
            print(status, end="")
        print()

    return filename

if __name__ == "__main__":  # Only run if this file is called directly
    print("Testing with 10MB download")
    url = "http://download.thinkbroadband.com/10MB.zip"
    filename = download_file(url)
    print(filename)

0 Stimmen

Ich würde die Klammern in der ersten Zeile entfernen, da es sich nicht um ein zu altes Merkmal handelt.

23voto

Akif Punkte 4510

Einfach und doch Python 2 & Python 3 kompatibler Weg kommt mit six Bibliothek:

from six.moves import urllib
urllib.request.urlretrieve("http://www.example.com/songs/mp3.mp3", "mp3.mp3")

1 Stimmen

Dies ist der beste Weg, um die 2+3-Kompatibilität zu gewährleisten.

21voto

Jaydev Punkte 1673

Im Folgenden sind die am häufigsten verwendeten Aufrufe zum Herunterladen von Dateien in Python aufgeführt:

  1. urllib.urlretrieve ('url_to_file', file_name)

  2. urllib2.urlopen('url_to_file')

  3. requests.get(url)

  4. wget.download('url', file_name)

Nota: urlopen y urlretrieve schneiden beim Herunterladen großer Dateien (Größe > 500 MB) relativ schlecht ab. requests.get speichert die Datei im Speicher, bis der Download abgeschlossen ist.

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