web-dev-qa-db-ja.com

返されたZipファイルをURLからダウンロードする

Webブラウザーで送信したときに、Zipファイルを保存するためのダイアログボックスがポップアップするURLがある場合、PythonでこのZipファイルをキャッチしてダウンロードするにはどうすればよいですか?

52
user1229108

_urllib2.urlopen_ を使用します。戻り値はファイルに似たオブジェクトで、read()zipfile などに渡すことができます。

7
senderle

私が知る限り、これを行う適切な方法は次のとおりです。

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

もちろん、r.okでGETが成功したことを確認する必要があります。

python 3+)の場合、StringIOモジュールを io モジュールでサブスクライブし、StringIOの代わりにBytesIOを使用します。 Here はこれに言及するリリースノート変化する。

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

このブログ投稿 の助けを借りて、requestsだけで動作するようになりました。奇妙なstreamのポイントは、一度にすべてを処理してメモリを詰まらせる必要がある大きなリクエストでcontentを呼び出す必要がないことです。 streamは、一度に1チャンクずつデータを反復処理することでこれを回避します。

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()
5

Python 3:

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

Urllib2.urlopenを使用するか、優れた Requests モジュールを使用してurllib2の頭痛を避けることができます。

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

上記のソリューションの@yoavramのおかげで、私のURLパスはzipされたフォルダにリンクされ、BADZipfileのエラーが発生します(ファイルはZipファイルではありません) 、それがURLを取得して何度も解凍し、突然解凍したのは奇妙だったので、ソリューションを少し修正します。 here に従ってis_zipfileメソッドを使用する

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()
1
hindamosh

ここに来て、.bzip2ファイルを保存する方法を探しました。これを探しに来るかもしれない他の人にコードを貼り付けさせてください。

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)

ファイルをそのまま保存したかっただけです。

0
swateek