programing

URL에서 반환된 Zip 파일 다운로드

powerit 2023. 7. 17. 21:29
반응형

URL에서 반환된 Zip 파일 다운로드

웹 브라우저에서 제출할 때 zip 파일을 저장하기 위해 대화 상자가 나타나는 URL이 있으면 파이썬에서 이 zip 파일을 어떻게 캡처하고 다운로드할 수 있습니까?

제가 알기로는, 이를 위한 적절한 방법은 다음과 같습니다.

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

물론 당신은 GET가 성공적이었는지 확인하고 싶을 것입니다.r.ok.

python 3+의 경우 문자열을 하위로 지정합니다.IO 모듈이 포함된 IO 모듈 및 바이트 사용문자열 대신 IOIO: 다음은 이 변경 사항에 대한 릴리스 정보입니다.

import requests, zipfile, io
r = requests.get(zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall("/path/to/destination_directory")

대부분의 사람들은 사용을 권장합니다.requests만약 그것이 가능하다면, 그리고.requests 설명서에서는 url에서 원시 데이터를 다운로드하고 저장할 때 이를 권장합니다.

import requests 

def download_url(url, save_path, chunk_size=128):
    r = requests.get(url, stream=True)
    with open(save_path, 'wb') as fd:
        for chunk in r.iter_content(chunk_size=chunk_size):
            fd.write(chunk)

zip 파일 다운로드저장에 대한 답변이 있기 때문에, zip 파일 읽기에 대한 자세한 내용은 언급하지 않았습니다.가능성을 보려면 아래의 많은 답변 중 하나를 참조하십시오.

어떤 이유로 액세스할 수 없는 경우requests사용할 수 있습니다.urllib.request대신.위와 같이 견고하지 않을 수 있습니다.

import urllib.request

def download_url(url, save_path):
    with urllib.request.urlopen(url) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())

마지막으로, 만약 당신이 여전히 파이썬 2를 사용하고 있다면, 당신은 사용할 수 있습니다.urllib2.urlopen.

from contextlib import closing

def download_url(url, save_path):
    with closing(urllib2.urlopen(url)) as dl_file:
        with open(save_path, 'wb') as out_file:
            out_file.write(dl_file.read())

블로그 게시물의 도움으로, 저는 단지 그것으로 작동할 수 있습니다.requests이상한 점은stream문제는 우리가 전화할 필요가 없다는 것입니다.content대량의 요청이 있을 경우 한 번에 모두 처리해야 하므로 메모리가 막힙니다.stream에서는 데이터를 한 번에 하나의 청크씩 반복하여 이 문제를 방지합니다.

url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.zip'

response = requests.get(url, stream=True)
with open('alaska.zip', "wb") as f:
    for chunk in response.iter_content(chunk_size=512):
        if chunk:  # filter out keep-alive new chunks
            f.write(chunk)

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

.zip 파일을 디스크의 위치에 저장하는 초경량 솔루션(Python 3.9 사용):

import requests

url = r'https://linktofile'
output = r'C:\pathtofolder\downloaded_file.zip'

r = requests.get(url)
with open(output, 'wb') as f:
    f.write(r.content)

.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)

저는 그냥 파일을 그대로 저장하고 싶었습니다.

urllib2.urlopen을 사용하거나 우수한 모듈을 사용하여 urllib2 두통을 피할 수 있습니다.

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

위 솔루션에 대한 @yoavram 덕분에 제 url 경로가 zip 폴더에 연결되어 BADZip 파일(파일은 zip 파일이 아님)의 오류가 발생하고, 여러 번 시도하다가 갑자기 url을 검색하고 압축을 풀면 이상해서 솔루션을 조금 수정합니다.여기에 따라 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()

사용하다requests, zipfile and io비단뱀 꾸러미

특수 바이트IO 기능은 압축 해제된 파일을 드라이브에 저장하는 대신 메모리에 보관하는 데 사용됩니다.

import requests
from zipfile import ZipFile
from io import BytesIO

r = requests.get(zip_file_url)
z = ZipFile(BytesIO(r.content))    
file = z.extract(a_file_to_extract, path_to_save)
with open(file) as f:
    print(f.read())

언급URL : https://stackoverflow.com/questions/9419162/download-returned-zip-file-from-url

반응형