[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 요청에 대해 재시도 로직이 적용됩니다.
위의 두 가지 방법 중에서 상황에 맞게 선택하여 거부된 파일을 다운로드할 수 있습니다. 재시도 횟수와 간격을 조절하거나, 다른 예외 처리 로직을 추가할 수도 있습니다.