Ich versuche, ein Bild mit dem Python- requests
Modul aus dem Internet herunterzuladen und zu speichern .
Hier ist der (Arbeits-) Code, den ich verwendet habe:
img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
f.write(img.read())
Hier ist der neue (nicht funktionierende) Code mit requests
:
r = requests.get(settings.STATICMAP_URL.format(**data))
if r.status_code == 200:
img = r.raw.read()
with open(path, 'w') as f:
f.write(img)
Können Sie mir helfen, welches Attribut aus der Antwort verwendet werden soll requests
?
python
urllib2
python-requests
shkschneider
quelle
quelle
Antworten:
Sie können entweder die Verwendung
response.raw
Dateiobjekt oder Iterierte über die Antwort.Wenn Sie das
response.raw
dateiähnliche Objekt verwenden, werden komprimierte Antworten standardmäßig nicht dekodiert (mit GZIP oder Deflate). Sie können die Dekomprimierung ohnehin für Sie erzwingen, indem Sie dasdecode_content
Attribut auf setzenTrue
(requests
setzt es aufFalse
, um die Dekodierung selbst zu steuern). Anschließend können Sieshutil.copyfileobj()
Python die Daten in ein Dateiobjekt streamen lassen:Verwenden Sie eine Schleife, um die Antwort zu durchlaufen. Wenn Sie so iterieren, wird sichergestellt, dass die Daten in dieser Phase dekomprimiert werden:
Dadurch werden die Daten in 128-Byte-Blöcken gelesen. Wenn Sie der Meinung sind, dass eine andere Blockgröße besser funktioniert, verwenden Sie die
Response.iter_content()
Methode mit einer benutzerdefinierten Blockgröße:Beachten Sie, dass Sie die Zieldatei im Binärmodus öffnen müssen, um sicherzustellen, dass Python nicht versucht, Zeilenumbrüche für Sie zu übersetzen. Wir haben auch festgelegt
stream=True
, dassrequests
nicht zuerst das gesamte Bild in den Speicher heruntergeladen wird.quelle
r2 = requests.post(r.url, data); print r2.content
. Die Schritte, die ich verwendet habe, sind : Aber jetzt will ich es auch wissenfilename
. Ist ihr Weg gereinigt? - Zur Zeit habe ich den Dateinamen im Header gefunden -r2.headers['content-disposition']
das gibt mir folgende Ausgabe:'attachment; filename=DELS36532G290115.csi'
Ich analysiere diese Zeichenfolge nach Dateinamen ... ist ihre Art sauberer?content-disposition
Header ist der Weg hierher; Verwenden Siecgi.parse_header()
diese Option, um sie zu analysieren und die Parameter abzurufen.params = cgi.parse_header(r2.headers['content-disposition'])[1]
dannparams['filename']
.requests.Response
selbst iterieren :for chunk in r: ...
. Anrufeiter_content()
ohne achunk_size
werden in 1-Byte-Blöcken wiederholt .response.ok
nie dokumentiert und erzeugt für jeden 1xx-, 2xx- oder 3xx-Status true, aber nur eine 200-Antwort hat einen Antworttext.Holen Sie sich ein dateiähnliches Objekt aus der Anforderung und kopieren Sie es in eine Datei. Dadurch wird auch vermieden, dass das Ganze sofort in den Speicher eingelesen wird.
quelle
r.raw.decode_content = True
vorher eingestellt werden,shutil.copyfileobj(response.raw, out_file)
weilby default, decode compressed responses (with GZIP or deflate)
, so erhalten Sie ein Zero-File-Image.Wie wäre es damit, eine schnelle Lösung.
quelle
f = open("/Users/apple/Desktop/sample.jpg", 'wb')
Was meinst du mit diesem Weg? Ich möchte Bild herunterladenif response.ok:
Ich habe das gleiche Bedürfnis, Bilder mithilfe von Anfragen herunterzuladen. Ich habe zuerst die Antwort von Martijn Pieters versucht, und es funktioniert gut. Aber als ich ein Profil für diese einfache Funktion erstellt habe, habe ich festgestellt, dass sie im Vergleich zu urllib und urllib2 so viele Funktionsaufrufe verwendet.
Ich habe dann den vom Autor des Anforderungsmoduls empfohlenen Weg ausprobiert :
Dadurch wurde die Anzahl der Funktionsaufrufe erheblich reduziert und meine Anwendung beschleunigt. Hier ist der Code meines Profilers und das Ergebnis.
Das Ergebnis für testRequest:
Und das Ergebnis für testRequest2:
quelle
chunk_size
Parameter angegeben haben , der standardmäßig 1 ist, sondern jeweilsiter_content
1 Byte über den Ergebnisstrom iteriert. Siehe die Dokumentation python-requests.org/en/latest/api/… .PIL
hier gibt es keine Verwendung ,with open(image_name, 'wb') as outfile: outfile.write(r.content)
es reicht einfach aus.PIL
ist auch nicht in der Standardbibliothek, was dies etwas weniger portabel macht.iter_content
ist langsam, weil Ihrchunk_size
zu klein ist. Wenn Sie es auf 100.000 erhöhen, wird es viel schneller.Dies ist möglicherweise einfacher als die Verwendung
requests
. Dies ist das einzige Mal, dass ich vorschlagen werde, es nicht zu verwendenrequests
HTTP zu verwenden.Zwei Liner mit
urllib
:Es gibt auch ein schönes Python-Modul namens
wget
, das ziemlich einfach zu bedienen ist. gefunden hier .Dies zeigt die Einfachheit des Designs:
Genießen.
Bearbeiten: Sie können auch einen
out
Parameter hinzufügen , um einen Pfad anzugeben.quelle
wget
ohne Probleme verwendet. Vielen Dank, dass Sie die Vorteile der Verwendung vonurllib3
urllib.request.urlretrieve("http://example.com", "file.ext")
.Das folgende Code-Snippet lädt eine Datei herunter.
Die Datei wird mit ihrem Dateinamen wie in der angegebenen URL gespeichert.
quelle
Es gibt zwei Hauptwege:
Verwenden
.content
(am einfachsten / offiziellsten) (siehe Zhenyi Zhangs Antwort ):Verwenden
.raw
(siehe Martijn Pieters Antwort ):Das Timing zeigt keinen merklichen Unterschied.
quelle
1.
Antwort (mitio.BytesIO
undImage
) war die erste, die für mich unter Python 3.6 funktioniert hat. Vergiss nichtfrom PIL import Image
(undpip install Pillow
).So einfach wie das Importieren von Bildern und Anfragen
quelle
Hier ist eine benutzerfreundlichere Antwort, die weiterhin Streaming verwendet.
Definieren Sie einfach diese Funktionen und rufen Sie auf
getImage()
. Es wird den gleichen Dateinamen wie die URL verwenden und standardmäßig in das aktuelle Verzeichnis schreiben, aber beide können geändert werden.Die
request
Eingeweide vongetImage()
basieren auf der Antwort hier und die Eingeweide vongetImageFast()
basieren auf der obigen Antwort .quelle
Ich werde eine Antwort posten, da ich nicht genug Repräsentanten habe, um einen Kommentar abzugeben, aber mit wget, wie von Blairg23 gepostet, können Sie auch einen out-Parameter für den Pfad angeben.
quelle
Dies ist die erste Antwort, die bei Google-Suchanfragen zum Herunterladen einer Binärdatei mit Anforderungen angezeigt wird. Falls Sie eine beliebige Datei mit Anforderungen herunterladen müssen, können Sie Folgendes verwenden:
quelle
.close()
. Dies ist die beste Antwort ab 2019, denke ich.So habe ich es gemacht
quelle
Sie können so etwas tun:
quelle