웹 브라우저에 제출할 때 zip 파일을 저장하는 대화 상자를 표시하는 URL이있는 경우 Python에서이 zip 파일을 찾아 다운로드하려면 어떻게해야합니까?
웹 브라우저에 제출할 때 zip 파일을 저장하는 대화 상자를 표시하는 URL이있는 경우 Python에서이 zip 파일을 찾아 다운로드하려면 어떻게해야합니까?
답변:
대부분의 사람들 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())
내가 말할 수있는 한,이 작업을 수행하는 적절한 방법은 다음과 같습니다.
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")
z.extractall()
로z.extractall("/path/to/destination_directory")
urllib.request.urlretrieve(url, filename)
..
pd.read_table(z.open('filename'))
위해 위와 같이 사용할 수 있습니다 . 여러 파일을 포함하는 zip URL 링크가 있고 하나만로드하는 데 관심이있는 경우 유용합니다.
의 도움으로 이 블로그 게시물 , 난 그냥 작업을 있어요 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()
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.
있습니까?
urllib2.urlopen을 사용하거나 우수한 Requests
모듈을 사용하여 urllib2 두통을 피할 수 있습니다.
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
zipfile
모듈 사용 : zip = zipfile.ZipFile(results.content)
. 그럼 그냥 사용하여 파일을 구문 분석 ZipFile.namelist()
, ZipFile.open()
또는ZipFile.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)
파일을 그대로 저장하고 싶었습니다.
위의 솔루션에 대한 @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()