454 Stimmen

Herunterladen von Dateien aus dem Internet in Python 3

Ich erstelle ein Programm, das eine .jar-Datei (Java) von einem Webserver herunterlädt, indem es die URL liest, die in der .jad-Datei des gleichen Spiels/der gleichen Anwendung angegeben ist. Ich verwende Python 3.2.1

Es ist mir gelungen, die URL der JAR-Datei aus der JAD-Datei zu extrahieren (jede JAD-Datei enthält die URL der JAR-Datei), aber wie Sie sich vielleicht vorstellen können, ist der extrahierte Wert ein type()-String.

Hier ist die entsprechende Funktion:

def downloadFile(URL=None):
    import httplib2
    h = httplib2.Http(".cache")
    resp, content = h.request(URL, "GET")
    return content

downloadFile(URL_from_file)

Allerdings erhalte ich immer eine Fehlermeldung, die besagt, dass der Typ in der obigen Funktion Bytes und nicht String sein muss. Ich habe versucht, URL.encode('utf-8') und auch bytes(URL,encoding='utf-8') zu verwenden, aber ich erhalte immer den gleichen oder einen ähnlichen Fehler.

Also im Grunde meine Frage ist, wie man eine Datei von einem Server herunterladen, wenn die URL in einem String-Typ gespeichert ist?

823voto

Oleh Prypin Punkte 31246

Wenn Sie den Inhalt einer Webseite in eine Variable übertragen wollen, brauchen Sie nur read die Reaktion von urllib.request.urlopen :

import urllib.request
...
url = 'http://example.com/'
response = urllib.request.urlopen(url)
data = response.read()      # a `bytes` object
text = data.decode('utf-8') # a `str`; this step can't be used if data is binary

Der einfachste Weg, eine Datei herunterzuladen und zu speichern, ist die Verwendung der urllib.request.urlretrieve Funktion:

import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
urllib.request.urlretrieve(url, file_name)

import urllib.request
...
# Download the file from `url`, save it in a temporary directory and get the
# path to it (e.g. '/tmp/tmpb48zma.txt') in the `file_name` variable:
file_name, headers = urllib.request.urlretrieve(url)

Aber bedenken Sie, dass urlretrieve wird als Erbe und könnte veraltet werden (ich weiß allerdings nicht, warum).

Die meisten richtig Eine Möglichkeit, dies zu tun, wäre die Verwendung der urllib.request.urlopen Funktion, um ein dateiähnliches Objekt zurückzugeben, das eine HTTP-Antwort darstellt, und es in eine echte Datei zu kopieren, indem man shutil.copyfileobj .

import urllib.request
import shutil
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)

Wenn Ihnen das zu kompliziert erscheint, können Sie es auch einfacher haben und den gesamten Download in einer bytes Objekt und schreiben es dann in eine Datei. Dies funktioniert jedoch nur bei kleinen Dateien.

import urllib.request
...
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
    data = response.read() # a `bytes` object
    out_file.write(data)

Es ist möglich, Folgendes zu extrahieren .gz (und vielleicht auch andere Formate) komprimierte Daten im laufenden Betrieb zu speichern, aber ein solcher Vorgang erfordert wahrscheinlich, dass der HTTP-Server den wahlfreien Zugriff auf die Datei unterstützt.

import urllib.request
import gzip
...
# Read the first 64 bytes of the file inside the .gz archive located at `url`
url = 'http://example.com/something.gz'
with urllib.request.urlopen(url) as response:
    with gzip.GzipFile(fileobj=response) as uncompressed:
        file_header = uncompressed.read(64) # a `bytes` object
        # Or do anything shown above using `uncompressed` instead of `response`.

202voto

Ali Faki Punkte 3750

Ich benutze requests Paket, wenn ich etwas im Zusammenhang mit HTTP-Anfragen benötige, da seine API sehr einfach zu bedienen ist:

installieren Sie zunächst requests

$ pip install requests

dann den Code:

from requests import get  # to make GET request

def download(url, file_name):
    # open in binary mode
    with open(file_name, "wb") as file:
        # get request
        response = get(url)
        # write to file
        file.write(response.content)

26voto

Ranvijay Kumar Punkte 341

Ich hoffe, ich habe die Frage richtig verstanden, die ist: wie man eine Datei von einem Server herunterladen, wenn die URL in einem String-Typ gespeichert ist?

Ich lade Dateien herunter und speichere sie lokal mit dem unten stehenden Code:

import requests

url = 'https://www.python.org/static/img/python-logo.png'
fileName = 'D:\Python\dwnldPythonLogo.png'
req = requests.get(url)
file = open(fileName, 'wb')
for chunk in req.iter_content(100000):
    file.write(chunk)
file.close()

20voto

Lasith Niroshan Punkte 860

Sie können verwenden wget welches ein beliebtes Tool zum Herunterladen von Shells ist. https://pypi.python.org/pypi/wget Dies ist die einfachste Methode, da die Zieldatei nicht geöffnet werden muss. Hier ist ein Beispiel.

import wget
url = 'https://i1.wp.com/python3.codes/wp-content/uploads/2015/06/Python3-powered.png?fit=650%2C350'  
wget.download(url, '/Users/scott/Downloads/cat4.jpg')

19voto

Yang Yu Punkte 171

Hier können wir die Legacy-Schnittstelle von urllib in Python3 verwenden:

Die folgenden Funktionen und Klassen sind aus dem Python 2 Modul urllib (im Gegensatz zu urllib2) portiert. Sie könnten irgendwann in der Zukunft veraltet sein.

Beispiel (2 Zeilen Code) :

import urllib.request

url = 'https://www.python.org/static/img/python-logo.png'
urllib.request.urlretrieve(url, "logo.png")

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