So verwenden Sie wget mit Python zum Herunterladen von Webseiten und Dateien

Dieser umfassende Leitfaden stellt wget vor, ein leistungsstarkes Befehlszeilentool zum Herunterladen von Dateien über HTTP, HTTPS und FTP, und vergleicht es positiv mit der requests-Bibliothek in Python.
13 min read
Illustration of wget usage with Python

In diesem Leitfaden erfahren Sie Folgendes:

  • Was wget ist.
  • Warum es besser sein kann als die requests-Bibliothek.
  • Wie einfach es ist, wget mit Python zu verwenden.
  • Vor- und Nachteile seiner Verwendung in Python-Skripten.

Legen wir also gleich los!

Was ist wget?

wget ist ein Befehlszeilenprogramm zum Herunterladen von Dateien aus dem Internet mithilfe von HTTP, HTTPS, FTP, FTPS und anderen Internetprotokollen. Es ist in den meisten Unix-ähnlichen Betriebssystemen nativ installiert, aber es ist auch für Windows verfügbar.

Warum wget und nicht ein Python-Paket wie Requests?

Sicher, wget ist ein cooles Befehlszeilentool, aber warum sollten Sie es zum Herunterladen von Dateien in Python verwenden, anstatt eine beliebte Bibliothek wie requests?

Nun, es gibt eine Reihe von zwingenden Gründen, wget gegenüber requests zu bevorzugen:

  • Unterstützt viel mehr Protokolle als requests.
  • Kann abgebrochene oder unterbrochene Downloads fortsetzen.
  • Unterstützt die Angabe einer begrenzten Download-Geschwindigkeit, sodass nicht die gesamte Netzwerkbandbreite verbraucht wird.
  • Unterstützt Dateinamen und Netzwerkadressen mit Wildcards.
  • NLS-basierte Nachrichtendateien für viele Sprachen.
  • Kann absolute Links in heruntergeladenen Dokumenten in relative Links umwandeln.
  • Unterstützt HTTP/S-Proxys.
  • Unterstützt persistente HTTP-Verbindungen.
  • Kann unbeaufsichtigte/im Hintergrund herunterladende Operationen ausführen.
  • Verwendet lokale Dateizeitstempel, um zu ermitteln, ob Dokumente beim Spiegeln erneut heruntergeladen werden müssen.
  • Kann rekursiv Dateien herunterladen, die auf einer bestimmten Webseite verlinkt sind, oder bis eine benutzerdefinierte Rekursionstiefe erreicht ist.
  • Respektiert automatisch die in robots.txt definierten Regeln zum Ausschluss von Robotern. Weitere Informationen finden Sie in unserem Leitfaden zu robots.txt für Web Scraping.

Dies sind nur einige der wget-Funktionen, die es im Vergleich zu jeder Python-HTTP-Client-Bibliothek so mächtig und besonders machen. Weitere Informationen finden Sie im offiziellen Handbuch.

Beachten Sie insbesondere, wie wget Links in HTML-Seiten folgen und Dateien herunterladen kann, auf die auf diesen Seiten verwiesen wird. Dadurch können Sie sogar ganze Websites abrufen, weshalb wget ideal für Webcrawling ist.

Kurz gesagt, wget ist eine großartige Option, wenn Sie Skripte schreiben, die Dateien und Webseiten aus dem Web herunterladen müssen. Lernen wir, wie man wget mit Python verwendet!

CLI-Befehle in Python ausführen

Gehen Sie wie folgt vor und erstellen Sie ein Python-Skript, das wget-Befehle ausführen kann.

Voraussetzungen

Stellen Sie zunächst sicher, dass Sie wget auf Ihrem Computer installiert haben. Der Einrichtungsprozess hängt von Ihrem Betriebssystem ab:

  • Unter Linux sollten Sie es bereits vorinstalliert haben. Andernfalls installieren Sie es über den Paketmanager Ihrer Distribution.
  • Installieren Sie auf einem Mac  wget mit Homebrew.
  • Laden Sie unter Windows die Binärdatei Wget für Windows herunter und speichern Sie sie in einem Ordner. Fügen Sie dann den Binärpfad wget (z. B. C:\Programme (x86)\wget) zu Ihrer PATH-Umgebungsvariablen hinzu.

Außerdem muss Python 3+ auf Ihrem Computer installiert sein. Laden Sie das Installationsprogramm zur Einrichtung herunter, klicken Sie doppelt darauf und folgen Sie den Anweisungen.

Eine Python IDE wie PyCharm Community Edition oder Visual Studio Code mit der Python-Erweiterung ist ebenfalls nützlich.

Einrichtung eines Python-Projekts

Erstellen Sie mit den folgenden Befehlen ein wget-Python-Projekt mit einer virtuellen Umgebung:

mkdir wget-python-demo

cd wget-python-demo

python -m venv env

Das oben erstellte Verzeichnis wget-python-demo steht für den Ordner Ihres Projekts.

Laden Sie es in Ihre Phyton IDE, erstellen Sie eine scraper.py-Datei und initialisieren Sie sie wie folgt:

print('Hello, World!')

Im Moment ist dies nur ein Beispielskript, das „Hallo, Welt!“ im Terminal ausgibt. Bald wird es die wget-Integrationslogik enthalten.

Stellen Sie sicher, dass das Skript funktioniert, indem Sie die Ausführen-Taste in Ihrer IDE drücken oder den folgenden Befehl eingeben::

python script.py

Im Terminal sollten Sie Folgendes sehen:

Hello, World!

Perfekt! Sie haben jetzt ein Python-Projekt eingerichtet.

Wie man wget benutzt, erfahren Sie im nächsten Abschnitt!

Schreiben Sie eine Funktion, um CLI-Befehle über das Unterprozessmodul auszuführen

Der einfachste Weg, CLI-Befehle in einem Python-Skript auszuführen, ist die Verwendung des Unterprozessmoduls.

Diese Bibliothek aus der Python-Standardbibliothek ermöglicht es Ihnen, neue Prozesse zu starten, eine Verbindung zu ihren Eingabe-/Ausgabe-/Fehler-Pipes herzustellen und ihren Rückgabecode abzurufen. Mit anderen Worten. Sie stattet Sie mit allem aus, was Sie benötigen, um Befehle im Terminal von Python aus auszuführen.

So können Sie die Methode Popen() aus dem Unterprozess verwenden, um CLI-Befehle wie wget mit Python auszuführen:

import subprocess

def execute_command(command):

"""

Execute a CLI command and return the output and error messages.

Parameters:

- command (str): The CLI command to execute.

Returns:

- output (str): The output generated by the command.

- error (str): The error message generated by the command, if any.

"""

try:

# execute the command and capture the output and error messages

process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

output, error = process.communicate()

output = output.decode("utf-8")

error = error.decode("utf-8")

# return the output and error messages

return output, error

except Exception as e:

# if an exception occurs, return the exception message as an error

return None, str(e)

Popen() führt den Befehl, den Sie als Zeichenfolge übergeben haben, in einem neuen Prozess in Ihrem Betriebssystem aus. Die Option shell=True stellt sicher, dass die Methode die in Ihrem Betriebssystem konfigurierte Standard-Shell verwendet.

Fügen Sie das obige Snippet in Ihre script.py-Datei ein. Sie können jetzt einen CLI-Befehl in Python wie im folgenden Beispiel aufrufen:

output, error = execute_command("<CLI command string>")

wenn Fehler:

print("An error occurred while running the CLI command:", error)

sonst:

print("CLI command output:", output)

Verwendung von wget mit Python: Anwendungsfälle

Dies ist die Syntax eines wget-Befehls:

wget [options] [url]

Wo:

  • [options] ist eine Liste der Optionen und Flags, die vom CLI-Tool unterstützt werden, um sein Verhalten anzupassen.
  • url ist die URL der Datei, die Sie herunterladen möchten. Dies kann ein direkter Link zu einer Datei oder eine URL einer Webseite sein, die Links zu mehreren Dateien enthält.

Hinweis: Schreiben Sie unter Windows wget.exe statt wget.

Es ist an der Zeit, wget in einigen Python-Snippets, die beliebte Anwendungsfälle behandeln, in Aktion zu sehen!

Eine Datei herunterladen

Angenommen, Sie möchten http://lumtest.com/myip.json mit wget herunterladen. Der Befehl, um das zu erreichen, wäre:

wget http://lumtest.com/myip.json

In Python würde das die folgende Codezeile werden:

output, error = execute_command("wget http://lumtest.com/myip.json")

Wenn Sie die Ausgabe drucken, sehen Sie etwas wie:

--2024-04-18 15:20:59-- http://lumtest.com/myip.json

Resolving lumtest.com (lumtest.com)... 3.94.72.89, 3.94.40.55

Connecting to lumtest.com (lumtest.com)|3.94.72.89|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 266 [application/json]

Saving to: 'myip.json.1'

myip.json.1 100%[=================================================>] 266 --.-KB/s in 0s

2024-04-18 15:20:59 (5.41 MB/s) - 'myip.json.1' saved [266/266]

Aus der Ausgabe des Befehls können Sie Folgendes sehen:

  1. Die URL wird in die IP-Adresse des Servers aufgelöst.
  2. wget stellt über eine HTTP-Request an die angegebene Ressource eine Verbindung zum Server her.
  3. Der vom Server empfangene HTTP-Antwortstatuscode ist 200.
  4. wget lädt die Datei herunter und speichert sie im aktuellen Verzeichnis.

Ihr Python-Projektverzeichnis wird jetzt eine myip.json-Datei enthalten.

Wenn Sie den Zielordner ändern möchten, in dem die herunterzuladende Datei gespeichert werden soll, verwenden Sie das Flag –directory-prefix oder -P wie folgt:

output, error = execute_command("wget --directory-prefix=./download http://lumtest.com/myip.json")

Die myip.json-Datei wird jetzt im Download-Ordner im Verzeichnis Ihres Projekts gespeichert. Beachten Sie, dass wget den Zielordner automatisch erstellt, falls er nicht existiert.

Um den Dateinamen der Download-Ressource zu ändern, verwenden Sie das Flag –output-document oder -O:

output, error = execute_command("wget --output-document=custom-name.json http://lumtest.com/myip.json")

Dieses Mal erstellt das Python-Skript wget eine Datei mit dem Namen custom-name.json statt myip.json.

Eine Webseite herunterladen

Der Befehl wget ist derselbe wie zuvor, mit dem Hauptunterschied, dass die URL diesmal auf eine Webseite verweist:

output, error = execute_command("wget https://brightdata.com/")

Das Verzeichnis Ihres Projekts enthält jetzt eine index.html-Datei mit dem HTML-Inhalt der Webseite unter https://brightdata.com/.

Laden Sie eine Datei nur herunter, wenn sie seit dem letzten Download geändert wurde.

Um Speicherplatz und Netzwerkressourcen zu sparen, sollten Sie eine Datei nicht herunterladen, wenn sie sich seit dem letzten Download nicht verändert hat. Aus diesem Grund bietet wget die Möglichkeit, Dateien mit einem Zeitstempel zu versehen.

Im Detail weist die Option –timestamping wget an, die Zeitstempel lokaler Dateien mit denen auf dem Server zu vergleichen. Wenn die lokale Datei denselben oder einen neueren Zeitstempel wie die auf dem Server hat, wird wget die Datei nicht erneut herunterladen. Andernfalls wird sie heruntergeladen.

So funktioniert der Zeitstempelmechanismus:

  1. Wenn Sie eine Datei mit der Option –timestamping oder -N herunterladen, ruft wget den Zeitstempel der Remote-Datei ab.
  2. Es überprüft den Zeitstempel der lokalen Datei (falls er existiert) und vergleicht ihn mit dem Zeitstempel der Remote-Datei.
  3. Wenn die lokale Datei nicht vorhanden ist oder ihr Zeitstempel älter ist als der auf dem Server, lädt wget die Datei herunter. Wenn die lokale Datei vorhanden ist und ihr Zeitstempel derselbe oder neuer ist als der auf dem Server, wird wget die Datei nicht herunterladen.

Das Zeitstempeln in HTTP wird implementiert, indem der Header Last-Modified überprüft wird, der vom Server nach einer HEAD-Request zurückgegeben wurde. wget untersucht auch den Header Content-Length, um die Dateigrößen zu vergleichen. Wenn sie nicht identisch sind, wird die Remote-Datei heruntergeladen, unabhängig davon, was der Header Last-Modified sagt. Beachten Sie, dass Last-Modified ein optionaler Antwort-Header ist. Falls sie nicht vorhanden ist, wird wget die Datei trotzdem herunterladen.

Verwenden Sie die Option –timestamping in Python mit der folgenden Codezeile:

output, error = execute_command("wget --timestamping https://brightdata.com")

Wenn Sie index.hml bereits heruntergeladen haben, erhalten Sie die folgende Meldung, dass die Datei nicht erneut heruntergeladen wird:

--2024-04-18 15:55:06-- https://brightdata.com

Resolving brightdata.com (brightdata.com)... 104.18.25.60, 104.18.24.60

Connecting to brightdata.com (brightdata.com)|104.18.25.60|:443... connected.

HTTP request sent, awaiting response... 304 Not Modified

File 'index.html' not modified on server. Omitting download.

Derselbe Mechanismus funktioniert auch, wenn Dateien über FTP heruntergeladen werden.

Unterbrochene Downloads abschließen

Standardmäßig versucht wget automatisch bis zu 20 Mal, eine Datei herunterzuladen, falls die Verbindung während des Vorgangs unterbrochen wird. Wenn Sie den Download einer teilweise heruntergeladenen Datei manuell fortsetzen möchten, verwenden Sie die Option –continue oder -c wie folgt:

output, error = execute_command("wget --continue http://lumtest.com/myip.json")

Download einer ganzen Seite

Rekursives Herunterladen ist eine wget-Funktion, mit der eine gesamte Website mit einem einzigen Befehl heruntergeladen werden kann.

Ausgehend von der angegebenen URL analysiert wget die HTML-Seite und folgt den anderen Dokumenten, die in den HTML-Attributen src und href oder den CSS-Attributen url() gefunden wurden. Wenn die nächste Datei ebenfalls eine Text-/HTML-Datei ist, analysiert sie sie und folgt ihren Dokumenten ebenfalls, bis sie die gewünschte Tiefe erreicht hat. Der rekursive Download folgt einem Suchalgorithmus, der Dateien mit Tiefe 1, dann Tiefe 2 usw. abruft.

Die wget-Optionen, die Sie bei der Verwendung dieses Download-Modus berücksichtigen sollten, sind:

  • –recursive oder -r: weist wget an, Dateien rekursiv herunterzuladen, was bedeutet, dass es Links auf den Webseiten folgt. Es ermöglicht Ihnen, lokale Kopien ganzer Websites zu erstellen, einschließlich aller verlinkten Ressourcen wie Bilder, Stylesheets, Skripte usw. Wenn diese Option angegeben ist, speichert wget alle heruntergeladenen Dateien in einem Ordner mit demselben Namen wie der Domainname der Zielwebsite.
  • –level=<depth> or -l=<depth>: Gibt die maximale Rekursionstiefe an, die beim Herunterladen verlinkter Seiten eingehalten werden soll. Wenn Sie beispielsweise –level=1 einstellen, lädt wget nur die Seiten herunter, die direkt von der Start-URL verlinkt sind. Es wird nicht den Links auf diesen Seiten folgen, um weitere Seiten herunterzuladen. Um das Crawlen riesiger Websites zu verhindern, ist der Standardwert für die Tiefe 5. Setzen Sie diese Option auf 0 oder auf ‘inf’ für unendliche Tiefe. Wenn Sie sicherstellen möchten, dass alle Ressourcen, die für die korrekte Anzeige einer Seite benötigt werden, unabhängig von der angegebenen Tiefe heruntergeladen werden, fügen Sie die Option -p oder –page-requisites hinzu.
  • –convert-links oder -k: Ändert die Links in den heruntergeladenen HTML-Dateien so, dass sie auf die lokal heruntergeladenen Dateien statt auf die ursprünglichen URLs verweisen. Diese Option ist nützlich, wenn Sie einen lokalen Mirror einer Website erstellen und sicherstellen möchten, dass alle Links innerhalb der heruntergeladenen Seiten offline korrekt funktionieren.

Angenommen, Sie möchten die Website von Bright Data mit einer maximalen Tiefe von 1 rekursiv herunterladen und dabei alle Links so konvertieren, dass sie auf lokale Dateien verweisen. Das ist die Python-wget -Anweisung, die Sie schreiben sollten:

output, error = execute_command("wget --recursive --level=1 --convert-links https://brightdata.com")

Hinweis: Dieser Befehl kann je nach Geschwindigkeit Ihrer Internetverbindung eine Weile dauern, haben Sie also etwas Geduld.

Der Ordner brightdata.com enthält jetzt eine lokale Kopie der Bright-Data-Website-Dateien mit einer Tiefenrekursion.

Vor- und Nachteile der Verwendung von wget mit Python

Schauen wir uns die Vor- und Nachteile der Verwendung von wget mit Python an.

 Vorteile

  • Einfache Python-Integration dank des Unterprozessmoduls.
  • Unzählige Funktionen und Optionen, darunter rekursiver Download, automatische Wiederholungsversuche, Dateistempeln und mehr.
  • Kann mit einem einzigen Befehl eine lokale Kopie einer ganzen Website erstellen.
  • FTP-Unterstützung.
  • Unterstützung für die Proxy-Integration.
  • Fähigkeit, unterbrochene Downloads wiederherzustellen.

 Nachteile

  • Die Ausgabe besteht aus heruntergeladenen Dateien und nicht aus Zeichenkettenvariablen, die Sie direkt im Python-Skript verwenden können.
  • Sie benötigen einen Parser wie Beautiful Soup, um auf bestimmte DOM-Elemente aus den heruntergeladenen HTML-Dateien zuzugreifen.

[Extra] Verwendung von wget mit einem Proxy

Die größte Herausforderung beim Herunterladen einer Datei oder einer ganzen Website mit wget besteht darin, dass Ihre Requests (Anfragen) blockiert werden können. Das liegt daran, dass wget-Requests auf den Zielservern so erscheinen, als kämen sie von einem Bot. Um sich davor zu schützen,  implementieren einige Websites Beschränkungen und Einschränkungen für ihre Seiten und Ressourcen. Diese Einschränkungen können geografische Beschränkungen, Ratenbegrenzungen oder Maßnahmen gegen Scraping umfassen.

Die Integration eines Proxy-Servers in wget ist eine praktikable Lösung, um solche Beschränkungen zu umgehen. Ein Proxy fungiert als Zwischenserver zwischen dem Computer und dem Internet. Indem wget-Traffic über einen Proxy-Server weitergeleitet wird, können Sie vermeiden, dass Ihre IP-Adresse preisgegeben wird, und die meisten Einschränkungen umgehen, die von Websites auferlegt werden.

Eine ausführlichere Anleitung finden Sie in unserem Leitfaden zur Verwendung eines Proxys mit wget.

Fazit

Durch diesen Leitfaden verstehen Sie, was wget ist, warum es besser sein kann als die requests-Bibliothek und wie man es in Python benutzt. Jetzt wissen Sie, dass wget ein leistungsstarkes Tool zum Herunterladen von Dateien und Webseiten über HTTP, HTTPS und FTP ist. Dank dem, was Sie hier gelernt haben, wissen Sie, wie man wget mit Python verwendet.

Wie Sie in diesem Leitfaden sehen, kann ein Proxy ein großartiger Verbündeter sein, wenn es darum geht, alle Anti-Bot-Maßnahmen zu umgehen, die Websites ergreifen, um Dienstprogramme wie wget am Herunterladen ihrer Inhalte zu hindern. Das Problem ist, dass es Dutzende von Anbietern online gibt und es nicht einfach ist, den besten auszuwählen. Sparen Sie Zeit und wenden Sie sich direkt an den Besten auf dem Markt, Bright Data!

Bright Data kontrolliert die besten Proxy-Server der Welt und betreut Fortune-500-Unternehmen und mehr als 20.000 Kunden. Das Angebot umfasst eine breite Palette von Proxy-Arten:

  • Rechenzentrums-Proxys – über 770.000 Rechenzentrums-IPs.
  • Privatanwender-Proxys – über 72 Millionen Privatanwender-IPs in mehr als 195 Ländern.
  • IDA-Proxys – Über 700.000 IDA-IPs.
  • Mobile Proxys – über 7 Millionen mobile IPs.

Beginnen Sie mit einer kostenlosen Testversion oder sprechen Sie mit einem unserer Datenexperten über unsere Proxy- und Scraping-Lösungen.