반응형
질문
나는 파이썬의 requests
모듈을 사용하여 웹에서 이미지를 다운로드하고 저장하려고 시도하고 있습니다.
다음은 사용한 (작동하는) 코드입니다:
img = urllib2.urlopen(settings.STATICMAP_URL.format(**data))
with open(path, 'w') as f:
f.write(img.read())
requests
를 사용한 새로운 (작동하지 않는) 코드는 다음과 같습니다:
r = requests.get(settings.STATICMAP_URL.format(**data))
if r.status_code == 200:
img = r.raw.read()
with open(path, 'w') as f:
f.write(img)
requests
에서 응답으로부터 사용할 속성에 대해 도와주실 수 있나요?
답변
다음과 같이 response.raw
파일 객체를 사용하거나 응답을 반복할 수 있습니다.
response.raw
파일 유사 객체를 사용하면 기본적으로 압축된 응답(GZIP 또는 deflate)을 디코딩하지 않습니다. 그렇지만 decode_content
속성을 True
로 설정하여 강제로 압축을 해제할 수 있습니다(requests
는 디코딩을 스스로 제어하기 위해 이를 False
로 설정합니다). 그런 다음 shutil.copyfileobj()
를 사용하여 Python이 데이터를 파일 객체로 스트림 처리하도록 할 수 있습니다:
import requests
import shutil
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
r.raw.decode_content = True
shutil.copyfileobj(r.raw, f)
응답을 반복하려면 루프를 사용하십시오. 이렇게 반복하면 이 시점에서 데이터가 압축 해제됩니다:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r:
f.write(chunk)
이렇게 하면 데이터를 128바이트 청크로 읽습니다. 다른 청크 크기가 더 잘 작동한다고 생각되면 Response.iter_content()
메서드를 사용하여 사용자 정의 청크 크기로 지정할 수 있습니다:
r = requests.get(settings.STATICMAP_URL.format(**data), stream=True)
if r.status_code == 200:
with open(path, 'wb') as f:
for chunk in r.iter_content(1024):
f.write(chunk)
파이썬이 개행 문자를 변환하지 않도록 대상 파일을 이진 모드로 열어야 함에 유의하십시오. 또한, 전체 이미지를 먼저 메모리에 다운로드하지 않도록 stream=True
로 설정합니다.
반응형
댓글