개요
데이터를 스크래핑 하다 보면 한 번에 가져올 수 있는 데이터의 양이 제한되어 있는 경우가 꽤 있다.
특히, 기간을 지정하여 데이터를 조회할 때, 최대 조회 가능한 데이터의 제한으로 인해 원하는 모든 데이터를 한 번에 가져올 수가 없는 경우가 있다.
이런 상황에서는 기간을 적절하게 나누어 여러번에 걸쳐 데이터를 수집해야 한다.
이번 게시글에서는 파이썬을 사용하여 지정된 기간을 월별로 나누어 데이터를 추출하는 방법에 대해서 기록해보려고 한다.
왜 월별로 나누는건지?
예를 들어 웹 사이트의 최대 조회 기간이 1개월이라면 1년 치의 데이터를 가져오기 위해서는 기간을 월별로 나누어 12번의 요청을 보내야 한다.
이를 자동화하여 작업을 단순화해보도록 하자.
필요 라이브러리
pip install python-dateutil
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
datetime
과timedelta
는 날짜 및 시간 계산을 위한 내장 모듈이다.dateutil
과relativedelta
는 두 날짜 간의 상대적인 차이를 계산할 때 유용하다.
기간을 월별로 나누는 함수 구현
다음은 시작일과 종료일을 받아 월별로 기간을 나누는 함수이다.
def generate_monthly_ranges(start_date: str, end_date: str):
# 문자열을 datetime 형식으로 변환
start = datetime.strptime(start_date, "%Y-%m-%d")
end = datetime.strptime(end_date, "%Y-%m-%d")
# 결과를 저장할 리스트
date_ranges = []
current_start = start
while current_start < end:
# 한 달 뒤의 날짜 계산
current_end = min(current_start + relativedelta(months=1) - timedelta(days=1), end)
# 기간을 리스트에 추가
date_ranges.append((current_start.strftime("%Y-%m-%d"), current_end.strftime("%Y-%m-%d")))
# 다음 기간의 시작일 설정
current_start = current_end + timedelta(days=1)
return date_ranges
함수 설명
- 입력 매개변수
start_date
: 조회를 시작할 날짜 ("YYYY-MM-DD
" 형식의 문자열)end_date
: 조회를 종료할 날짜 ("YYYY-MM-DD
" 형식의 문자열)
- 동작 과정
- 1. 입력된 문자열 형식의 날짜를
datetime
객체로 변환함/ - 2.
current_start
를 시작일로 설정하고, 종료일(end
)까지 반복함. - 3.
relativedelta
를 사용하여 한 달 뒤의 날짜를 계산하고, 최대 종료일을 넘지 않도록min()
함수를 사용하였음. - 4. 계산된 기간을
date_ranges
리스트에 추가. - 5.
current_start
를 업데이트하여 다음 기간으로 넘어감.
- 1. 입력된 문자열 형식의 날짜를
- 반환 값
- 월별로 나누어진 기간의 리스트 (
[("YYYY-MM-DD", "YYYY-MM-DD"), ...]
)
- 월별로 나누어진 기간의 리스트 (
함수 사용 예시
# 예시 기간 설정
start_date = "2023-10-01"
end_date = "2024-10-01"
# 월별 기간 생성
date_ranges = generate_monthly_ranges(start_date, end_date)
# 결과 출력
for start, end in date_ranges:
print(f"시작일: {start}, 종료일: {end}")
출력 겱과
시작일: 2023-10-01, 종료일: 2023-10-31
시작일: 2023-11-01, 종료일: 2023-11-30
시작일: 2023-12-01, 종료일: 2023-12-31
시작일: 2024-01-01, 종료일: 2024-01-31
시작일: 2024-02-01, 종료일: 2024-02-29
시작일: 2024-03-01, 종료일: 2024-03-31
시작일: 2024-04-01, 종료일: 2024-04-30
시작일: 2024-05-01, 종료일: 2024-05-31
시작일: 2024-06-01, 종료일: 2024-06-30
시작일: 2024-07-01, 종료일: 2024-07-31
시작일: 2024-08-01, 종료일: 2024-08-31
시작일: 2024-09-01, 종료일: 2024-09-30
시작일: 2024-10-01, 종료일: 2024-10-01