본문 바로가기
Python/Python FAQ

Python requests를 사용하여 이미지를 다운로드하는 방법은 다음과 같습니다., How to download image using requests

by 베타코드 2023. 10. 17.
반응형

질문


나는 파이썬의 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로 설정합니다.

반응형

댓글