Webブラウザーで送信したときに、Zipファイルを保存するためのダイアログボックスがポップアップするURLがある場合、PythonでこのZipファイルをキャッチしてダウンロードするにはどうすればよいですか?
_urllib2.urlopen
_ を使用します。戻り値はファイルに似たオブジェクトで、read()
、 zipfile
などに渡すことができます。
私が知る限り、これを行う適切な方法は次のとおりです。
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()
このブログ投稿 の助けを借りて、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()
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()
Urllib2.urlopenを使用するか、優れた Requests
モジュールを使用してurllib2の頭痛を避けることができます。
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
上記のソリューションの@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()
ここに来て、.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)
ファイルをそのまま保存したかっただけです。