it-swarm.com.de

Zurückgegebene Zip-Datei von der URL herunterladen

Wenn ich eine URL habe, die beim Senden in einem Webbrowser ein Dialogfeld zum Speichern einer ZIP-Datei öffnet, wie würde ich dann diese Zip-Datei in Python abfangen und herunterladen?

42
user1229108

Verwenden Sie urllib2.urlopen . Der Rückgabewert ist ein dateiähnliches Objekt, das Sie read(), an zipfile usw. übergeben können.

6
senderle

Soweit ich das beurteilen kann, ist der richtige Weg, dies zu tun:

import requests, zipfile, StringIO
r = requests.get(Zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()

natürlich möchten Sie überprüfen, ob der GET mit r.ok erfolgreich war.

Bei Python 3+ müssen Sie das StringIO-Modul mit dem Modul io unterladen und BytesIO anstelle von StringIO verwenden: Here sind Versionshinweise, in denen diese Änderung erwähnt wird. 

import requests, zipfile, io
r = requests.get(Zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
117
yoavram

Mit Hilfe von diesem Blogbeitrag habe ich es gerade mit requests gearbeitet. Der Punkt der seltsamen stream-Sache ist, dass wir content nicht für große Anforderungen aufrufen müssen, was dazu führen würde, dass alle auf einmal verarbeitet werden und den Speicher verstopfen. Die Variable stream vermeidet dies, indem sie die Daten Stück für Stück durchläuft.

url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.Zip'
target_path = 'alaska.Zip'

response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
    if chunk:  # filter out keep-alive new chunks
        handle.write(chunk)
handle.close()
4

Ich habe in Python 3 gearbeitet:

import zipfile, urllib.request, shutil

url = 'http://www....myzipfile.Zip'
file_name = 'myzip.Zip'

with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
    shutil.copyfileobj(response, out_file)
    with zipfile.ZipFile(file_name) as zf:
        zf.extractall()
4
Webucator

Verwenden Sie entweder urllib2.urlopen, oder versuchen Sie es mit dem ausgezeichneten Requests -Modul und vermeiden Sie urllib2-Kopfschmerzen:

import requests
results = requests.get('url')
#pass results.content onto secondary processing...
3
aravenel

Ich kam hierher und suchte, wie man eine .bzip2-Datei speichert. Lassen Sie mich den Code für andere einfügen, die danach suchen könnten.

url = "http://api.mywebsite.com"
filename = "swateek.tar.gz"

response = requests.get(url, headers=headers, auth=('myusername', 'mypassword'), timeout=50)
if response.status_code == 200:
with open(filename, 'wb') as f:
   f.write(response.content)

Ich wollte nur die Datei so speichern, wie sie ist.

0
swateek

Vielen Dank an @yoavram für die obige Lösung mein URL-Pfad mit einem gezippten -Ordner verknüpft, und ein Fehler der BADZip-Datei .__ auftritt. (Datei ist keine Zip-Datei), und es war seltsam, wenn ich es mehrmals ausprobierte rufe die url ab und entpacke sie ganz plötzlich, also ändere ich die lösung ein wenig bisschen. Verwenden der is_zipfile Methode gemäß hier

r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
    r = requests.get(url, stream =True)
    check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
    z = zipfile.ZipFile(io.BytesIO(r.content))
    z.extractall()
0
hindamosh