Ich habe ein kleines Dienstprogramm, mit dem ich eine MP3-Datei nach einem Zeitplan von einer Website herunterladen und dann eine Podcast-XML-Datei erstellen / aktualisieren kann, die ich zu iTunes hinzugefügt habe.
Die Textverarbeitung, mit der die XML-Datei erstellt / aktualisiert wird, ist in Python geschrieben. Ich verwende jedoch wget in einer 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, einen Weg zu finden, um die Datei tatsächlich in Python herunterzuladen, weshalb ich auf die Verwendung zurückgegriffen habe wget
.
Wie lade ich die Datei mit Python herunter?
wget
. Unter anderem werdenwget
(1) Zeitstempel beibehalten (2) der Dateiname wird automatisch anhand der URL ermittelt,.1
(usw.) angehängt, wenn die Datei bereits vorhanden ist (3) und es stehen viele andere Optionen zur Verfügung, von denen einige möglicherweise in Ihre Datei eingefügt wurden.wgetrc
. Wenn Sie eines davon möchten, müssen Sie es selbst in Python implementieren, aber es ist einfacher, es einfachwget
über Python aufzurufen .import urllib.request; s = urllib.request.urlopen('http://example.com/').read().decode()
Antworten:
Verwenden Sie in Python 2 urllib2, das mit der Standardbibliothek geliefert wird.
Dies ist die einfachste Art, die Bibliothek zu verwenden, abzüglich jeglicher Fehlerbehandlung. Sie können auch komplexere Aufgaben ausführen, z. B. das Ändern von Headern. Die Dokumentation finden Sie hier.
quelle
urllib2.quote
Noch eine mit
urlretrieve
:(für Python 3+ verwenden
import urllib.request
undurllib.request.urlretrieve
)Noch eine mit einem "Fortschrittsbalken"
quelle
if not os.path.isfile(file_name):
, um ein Überschreiben von Podcasts zu vermeiden! nützlich, wenn es als Cronjob mit den URLs in einer HTML-Datei ausgeführt wirdVerwenden Sie 2012 die Python-Anforderungsbibliothek
Du kannst rennen
pip install requests
, um es zu bekommen.Anfragen haben viele Vorteile gegenüber den Alternativen, da die API viel einfacher ist. Dies gilt insbesondere dann, wenn Sie eine Authentifizierung durchführen müssen. urllib und urllib2 sind in diesem Fall ziemlich unintuitiv und schmerzhaft.
30.12.2015
Die Leute haben ihre Bewunderung für den Fortschrittsbalken zum Ausdruck gebracht. Es ist cool, klar. Es gibt jetzt mehrere Standardlösungen, darunter
tqdm
:Dies ist im Wesentlichen die vor 30 Monaten beschriebene Implementierung @kvance.
quelle
r.text
Für Text- oder Unicode-Inhalte. Als Unicode zurückgegeben.r.content
: Für binären Inhalt. Wird als Byte zurückgegeben. Lesen Sie hier darüber: docs.python-requests.org/en/latest/user/quickstartDas
wb
Inopen('test.mp3','wb')
öffnet eine Datei (und löscht alle vorhandenen Dateien) im Binärmodus, sodass Sie damit Daten anstatt nur Text speichern können.quelle
file.read
eingelesen wird , übergeben Sie ein Argument an die Anzahl der zu lesenden Bytes. Siehe: gist.github.com/hughdbrown/c145b8385a2afa6570e2shutil.copyfileobj(mp3file, output)
stattdessen.Python 3
urllib.request.urlopen
urllib.request.urlretrieve
Hinweis: Laut Dokumentation
urllib.request.urlretrieve
handelt es sich um eine "Legacy-Schnittstelle" und "könnte in Zukunft veraltet sein" (danke gerrit )Python 2
urllib2.urlopen
(Danke Corey )urllib.urlretrieve
(danke PabloG )quelle
urllib.request.urlretrieve
, gelangen Sie zu genau diesem Link. Prost!urllib.request.urlretrieve
wird als "Legacy-Schnittstelle" dokumentiert und "könnte in Zukunft veraltet sein".benutze das wget Modul:
quelle
Eine verbesserte Version des PabloG-Codes für Python 2/3:
quelle
Einfache, aber
Python 2 & Python 3
kompatible Art und Weise kommt mitsix
Bibliothek:quelle
quelle
Schrieb wget Bibliothek in reinem Python nur für diesen Zweck. Es ist
urlretrieve
mit diesen Funktionen ab Version 2.0 aufgepumpt .quelle
-o
zu wechseln-O
, um Verwirrung zu vermeiden, wie es in GNU wget ist. Oder zumindest sollten beide Optionen gültig sein.wget.py
einen echten Ersatz für real machen möchtewget
. Das-o
verhält sich schon anders - es ist damit kompatibelcurl
. Würde ein Hinweis in der Dokumentation helfen, das Problem zu beheben? Oder ist es das wesentliche Merkmal, dass ein Dienstprogramm mit einem solchen Namen befehlszeilenkompatibel ist?Im Folgenden sind die am häufigsten verwendeten Aufrufe zum Herunterladen von Dateien in Python aufgeführt:
urllib.urlretrieve ('url_to_file', file_name)
urllib2.urlopen('url_to_file')
requests.get(url)
wget.download('url', file_name)
Hinweis:
urlopen
undurlretrieve
gefunden werden relativ schlecht durchzuführen mit dem Herunterladen von großen Dateien (Größe> 500 MB).requests.get
speichert die Datei im Speicher, bis der Download abgeschlossen ist.quelle
Ich stimme Corey zu, urllib2 ist vollständiger als urllib und sollte wahrscheinlich das Modul sein, das verwendet wird, wenn Sie komplexere Dinge tun möchten. Um die Antworten vollständiger zu machen, ist urllib ein einfacheres Modul, wenn Sie nur die Grundlagen wünschen:
Wird gut funktionieren. Wenn Sie sich nicht mit dem "Antwort" -Objekt befassen möchten, können Sie read () direkt aufrufen :
quelle
In Python3 können Sie urllib3 und shutil libraires verwenden. Laden Sie sie mit pip oder pip3 herunter (je nachdem, ob python3 Standard ist oder nicht)
Führen Sie dann diesen Code aus
Beachten Sie, dass Sie herunterladen,
urllib3
aberurllib
im Code verwendenquelle
Sie können das Fortschrittsfeedback auch mit urlretrieve erhalten:
quelle
Wenn Sie wget installiert haben, können Sie parallel_sync verwenden.
pip install parallel_sync
Doc: https://pythonhosted.org/parallel_sync/pages/examples.html
Das ist ziemlich mächtig. Es kann Dateien parallel herunterladen, bei einem Fehler erneut versuchen und sogar Dateien auf einen Remotecomputer herunterladen.
quelle
Wenn Geschwindigkeit für Sie wichtig ist, habe ich einen kleinen Leistungstest für die Module
urllib
undwget
und in Bezug auf durchgeführtwget
auf Ich habe einmal versucht , mit Statusleiste und einmal ohne. Ich habe drei verschiedene 500-MB-Dateien zum Testen genommen (verschiedene Dateien - um die Möglichkeit auszuschließen, dass unter der Haube etwas Caching stattfindet). Getestet auf einem Debian-Computer mit Python2.Erstens sind dies die Ergebnisse (sie sind in verschiedenen Läufen ähnlich):
Die Art und Weise, wie ich den Test durchgeführt habe, ist die Verwendung eines "Profil" -Dekorators. Dies ist der vollständige Code:
urllib
scheint der schnellste zu seinquelle
Der Vollständigkeit halber ist es auch möglich, jedes Programm zum Abrufen von Dateien mit dem
subprocess
Paket aufzurufen . Programme zum Abrufen von Dateien sind leistungsfähiger als Python-Funktionen wieurlretrieve
. Sie können beispielsweisewget
Verzeichnisse rekursiv herunterladen (-R
), FTP verarbeiten, umleiten, HTTP-Proxys verwenden, das erneute Herunterladen vorhandener Dateien vermeiden (-nc
) undaria2
Downloads mit mehreren Verbindungen durchführen, wodurch Ihre Downloads möglicherweise beschleunigt werden.In Jupyter Notebook kann man Programme auch direkt mit der folgenden
!
Syntax aufrufen :quelle
Quellcode kann sein:
quelle
Sie können PycURL für Python 2 und 3 verwenden.
quelle
Ich habe folgendes geschrieben, das in Vanille Python 2 oder Python 3 funktioniert.
Anmerkungen:
quelle
Dies mag etwas spät sein, aber ich habe den Code von pabloG gesehen und konnte nicht anders, als ein Betriebssystem ('cls') hinzuzufügen, damit es fantastisch aussieht! Hör zu :
Wenn Sie in einer anderen Umgebung als Windows ausgeführt werden, müssen Sie etwas anderes als 'cls' verwenden. In MAC OS X und Linux sollte es "klar" sein.
quelle
cls
macht nichts auf meinem OS X oder auf einem meiner Ubuntu-Server. Einige Klarstellungen könnten gut sein.clear
für Linux verwenden oder noch besser die Druckzeile ersetzen, anstatt die gesamte Befehlszeilenausgabe zu löschen.os.system()
) einen Aufruf hinzu, der einen Unterprozess startet, um den Bildschirm mit einem plattformspezifischen Befehl (cls
) zu löschen . Wie hat das irgendwelche Upvotes? Absolut wertlose "Antwort" IMHO.urlretrieve und request.get sind einfach, die Realität jedoch nicht. Ich habe Daten für einige Websites abgerufen, einschließlich Text und Bilder. Die beiden oben genannten lösen wahrscheinlich die meisten Aufgaben. Für eine universellere Lösung empfehle ich jedoch die Verwendung von urlopen. Da es in der Python 3-Standardbibliothek enthalten ist, kann Ihr Code auf jedem Computer ausgeführt werden, auf dem Python 3 ausgeführt wird, ohne das Site-Paket vorinstallieren zu müssen
Diese Antwort bietet eine Lösung für HTTP 403 Verboten beim Herunterladen von Dateien über http mit Python. Ich habe nur Anfragen und Urllib-Module ausprobiert, das andere Modul bietet möglicherweise etwas Besseres, aber dies ist dasjenige, mit dem ich die meisten Probleme gelöst habe.
quelle
Späte Antwort, aber für
python>=3.6
Sie können verwenden:Installieren
dload
mit:quelle
Ich wollte alle Dateien von einer Webseite herunterladen. Ich habe es versucht
wget
aber es ist fehlgeschlagen, also habe ich mich für die Python-Route entschieden und diesen Thread gefunden.Nachdem ich es gelesen habe, habe ich eine kleine Befehlszeilenanwendung erstellt
soupget
, die die hervorragenden Antworten von PabloG und Stan erweitert und einige nützliche Optionen hinzugefügt.Es verwendet BeatifulSoup , um alle URLs der Seite zu sammeln und dann diejenigen mit den gewünschten Erweiterungen herunterzuladen. Schließlich können mehrere Dateien gleichzeitig heruntergeladen werden.
Hier ist es:
Ein Beispiel für seine Verwendung ist:
Und ein aktuelles Beispiel, wenn Sie es in Aktion sehen möchten:
quelle