Data science/크롤링
Error 처리 (1)
gokimkh
2024. 9. 23. 17:44
import time
import requests
# 일시적인 오류를 나타내는 상태 코드를 지정한다.
TEMPORARY_ERROR_CODES = (408, 505, 502, 503, 504)
def main():
response = fetch('https://httpbin.org/status/200,404,503')
if 200 <= response.status_code < 300: print('Success')
else: print('Error')
def fetch(url):
"""
지정한 URL에 요청한 뒤 response 객체를 반환한다.
일시적인 오류가 발생하면 최대 3번 재시도한다.
"""
max_retries = 3
retries = 0
while True:
try:
print('Retrieving {0}...'.format(url))
response = requests.get(url)
print('Status: {0}'.format(response.status_code))
if response.status_code not in TEMPORARY_ERROR_CODES:
return response # 일시적이 오류가 아니라면 반환
except requests.exceptions.RequestException as ex:
# 네트워크 레벨 오류의 경우 재시도
print('Exception: {0}'.format(ex))
retries += 1
if retries >= max_retries:
# 재시도 횟수 상한을 넘으면 예외 발생
raise Exception('Max retries exceeded')
# 지수 함수적으로 재시도 간격을 증가시킨다.
wait = 2 ** (retries - 1)
print('Waiting {0} seconds...'.format(wait))
time.sleep(wait)
if __name__ == '__main__':
main()