프로그래밍 언어/Python

파이썬 requests을 사용하여 이미지를 다운로드하는 방법

Rateye 2021. 12. 16. 09:38
728x90
반응형
질문 : 요청을 사용하여 이미지를 다운로드하는 방법

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 반복 할 수 있습니다.

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)

파이썬이 줄 바꿈을 자동으로 번역하지 않도록하려면 바이너리 모드에서 대상 파일을 열어야합니다. 또한 requests 이 전체 이미지를 먼저 메모리에 다운로드하지 않도록 stream=True

출처 : https://stackoverflow.com/questions/13137817/how-to-download-image-using-requests
728x90
반응형