Profile picture

[Python] 기간 별로 데이터 스크래핑: 월 단위로 나누기

JaehyoJJAng2024년 08월 17일

개요

데이터를 스크래핑 하다 보면 한 번에 가져올 수 있는 데이터의 양이 제한되어 있는 경우가 꽤 있다.

특히, 기간을 지정하여 데이터를 조회할 때, 최대 조회 가능한 데이터의 제한으로 인해 원하는 모든 데이터를 한 번에 가져올 수가 없는 경우가 있다.

이런 상황에서는 기간을 적절하게 나누어 여러번에 걸쳐 데이터를 수집해야 한다.

이번 게시글에서는 파이썬을 사용하여 지정된 기간을 월별로 나누어 데이터를 추출하는 방법에 대해서 기록해보려고 한다.


왜 월별로 나누는건지?

예를 들어 웹 사이트의 최대 조회 기간이 1개월이라면 1년 치의 데이터를 가져오기 위해서는 기간을 월별로 나누어 12번의 요청을 보내야 한다.

이를 자동화하여 작업을 단순화해보도록 하자.


필요 라이브러리

pip install python-dateutil
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
  • datetimetimedelta는 날짜 및 시간 계산을 위한 내장 모듈이다.
  • dateutilrelativedelta는 두 날짜 간의 상대적인 차이를 계산할 때 유용하다.

기간을 월별로 나누는 함수 구현

다음은 시작일과 종료일을 받아 월별로 기간을 나누는 함수이다.

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를 업데이트하여 다음 기간으로 넘어감.
  • 반환 값
    • 월별로 나누어진 기간의 리스트 ([("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

Loading script...