[python] Requests 라이브러리를 이용해 거부된 파일 다운로드를 재시도하는 방법은?

거부된 파일을 다운로드할 때, Requests 라이브러리를 사용하여 HTTP 요청을 보내면 종종 거부 응답을 받을 수 있습니다. 이는 서버에서 파일에 접근 제한이 있는 경우나 인증이 필요한 경우 발생할 수 있습니다.

이러한 경우에 거부된 파일을 다운로드하기 위해서는 요청을 재시도해야 합니다. Requests 라이브러리는 요청을 재시도하는 기능을 내장하고 있지 않기 때문에, 몇 가지 방법을 사용하여 이를 해결할 수 있습니다.

1. 예외 처리를 통한 재시도

import requests
import time

url = 'http://example.com/file.zip'
max_retries = 3
retry_delay = 5

def download_file_with_retry(url):
    retries = 0
    while retries < max_retries:
        try:
            response = requests.get(url)
            response.raise_for_status() # 만약 응답이 에러 상태 코드를 반환하면 예외 발생
            with open('file.zip', 'wb') as file:
                file.write(response.content)
            print('파일 다운로드 완료')
            break
        except requests.HTTPError as err:
            print(f'다운로드 에러: {err}')
            retries += 1
            if retries == max_retries:
                print('파일 다운로드를 재시도하지 않음')
            else:
                print(f'{retry_delay}초 후 다시 시도')
                time.sleep(retry_delay)

download_file_with_retry(url)

위의 코드에서는 예외 처리를 통해 거부 응답에 대한 처리를 수행합니다. 요청이 거부되면 HTTPError 예외가 발생하고, 이를 캐치하여 재시도 로직을 구현합니다. 최대 재시도 횟수와 재시도 간격을 설정할 수 있습니다.

2. 라이브러리 확장을 통한 재시도

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

url = 'http://example.com/file.zip'
max_retries = 3
retry_delay = 5

def download_file_with_retry(url):
    session = requests.Session()
    retry_strategy = Retry(total=max_retries, backoff_factor=retry_delay)
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount('http://', adapter)
    session.mount('https://', adapter)

    response = session.get(url)
    response.raise_for_status() # 만약 응답이 에러 상태 코드를 반환하면 예외 발생

    with open('file.zip', 'wb') as file:
        file.write(response.content)
    print('파일 다운로드 완료')

download_file_with_retry(url)

위의 코드에서는 requests 라이브러리의 기능을 확장하여 재시도를 구현합니다. Retry 클래스를 사용하여 재시도 로직을 설정하고, HTTPAdapter를 생성하여 이를 세션에 마운트합니다. 이렇게 하면 모든 HTTP 요청에 대해 재시도 로직이 적용됩니다.

위의 두 가지 방법 중에서 상황에 맞게 선택하여 거부된 파일을 다운로드할 수 있습니다. 재시도 횟수와 간격을 조절하거나, 다른 예외 처리 로직을 추가할 수도 있습니다.