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


84

웹 브라우저에 제출할 때 zip 파일을 저장하는 대화 상자를 표시하는 URL이있는 경우 Python에서이 zip 파일을 찾아 다운로드하려면 어떻게해야합니까?


1
나는 바이너리 파일을 다운로드 하고 chram으로 작동하는 이 페이지의 디스크쓰는 섹션을 시도 했습니다.
Zeinab Abbasimazar

답변:


32

대부분의 사람들 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())

마지막으로 Python 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())

샘플 스 니펫도 추가해 주시겠습니까? 그렇게하시면 정말 친절 할 것입니다
Sarvagya Dubey

203

내가 말할 수있는 한,이 작업을 수행하는 적절한 방법은 다음과 같습니다.

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 모듈로 StringIO 모듈을 하위로 지정하고 StringIO 대신 BytesIO를 사용합니다. 다음 은이 변경 사항을 언급하는 릴리스 노트입니다.

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

이 답변에 감사드립니다. 요청으로 zip 파일을 얻는 문제 를 해결하는 데 사용했습니다 .
gr1zzly be4r

yoavram, 귀하의 코드에서 웹 페이지의 URL을 어디에 입력합니까?
newGIS

25
다른 위치에 다운로드 한 파일을 저장하려는 경우, 교체 z.extractall()z.extractall("/path/to/destination_directory")
user799188

1
URL에서 파일을 저장하려면 다음을 수행 할 수 있습니다 urllib.request.urlretrieve(url, filename)..
yoavram

3
60 분이 너무 오래 걸리는 점을 다른 사람들이 연결하도록 돕기 pd.read_table(z.open('filename'))위해 위와 같이 사용할 수 있습니다 . 여러 파일을 포함하는 zip URL 링크가 있고 하나만로드하는 데 관심이있는 경우 유용합니다.
Frikster 2018

12

의 도움으로 이 블로그 게시물 , 난 그냥 작업을 있어요 requests. 이상한 stream점은 content큰 요청 을 호출 할 필요가 없기 때문에 한 번에 모두 처리해야하므로 메모리가 막히게됩니다. 는 stream한 번에 한 청크 데이터를 반복하여이를 방지합니다.

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

2
답변은 대부분의 콘텐츠에 대한 링크에 의존해서는 안됩니다. 링크가 끊어 지거나 다른 쪽의 콘텐츠가 더 이상 질문에 답하지 않도록 변경 될 수 있습니다. 링크가 가리키는 정보에 대한 요약이나 설명을 포함하도록 답변을 수정하십시오.
mypetlion

7

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

여보세요. 이 오류를 어떻게 피할 수 urllib.error.HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.있습니까?
빅터 M Herasme 페레즈

@VictorHerasmePerez, HTTP 302 응답 상태 코드는 페이지가 이동되었음을 의미합니다. : 당신 직면하고 여기에 해결 된 문제라고 생각 stackoverflow.com/questions/32569934/...
Webucator

5

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

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

1
하지만 zip에서 results.content를 어떻게 구문 분석합니까?
0atman

zipfile모듈 사용 : zip = zipfile.ZipFile(results.content). 그럼 그냥 사용하여 파일을 구문 분석 ZipFile.namelist(), ZipFile.open()또는ZipFile.extractall()
aravenel

5

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

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


3

위의 솔루션에 대한 @yoavram 덕분에 내 URL 경로가 압축 폴더에 연결되고 BADZipfile (파일은 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.