[Automation] Cron으로 수집한 데이터 자동 저장하기

터틀넥·2025년 8월 4일
post-thumbnail

지난 시간에는

지난 글에서는 WSL 환경에서 crontab을 활용해 Python 스크립트를
정해진 시간마다 자동 실행하는 과정을 실습해봤다.

즉, 우리는 “코드를 자동으로 돌릴 수 있는 환경”을 만들었다. 하지만 여기서 끝나면 자동화의 진짜 효용은 아직 절반이다.

데이터를 자동으로 수집했다면, 이제는 그 데이터를 저장하고 쌓아갈 구조가 필요하다.

이번 글에서는 수집된 데이터를 자동으로 파일(CSV)로 저장하는 과정을 구현해보자.



🧭 이번 글의 목표

  • 자동 실행되는 Python 코드가 수집한 데이터를 .csv로 저장하는 흐름을 갖추기
  • 저장되는 파일에 날짜/시간을 반영하여 구분 가능하게 만들기
  • 크론 → Python 실행 → 자동 저장 흐름 완성
  • 저장된 결과를 실제로 확인하고, 로그까지 점검



🧪 예제 개요: 명언(Quote) 데이터 자동 저장 실습

지난 글에서는 hello.py처럼 단순한 문자열을 출력하는 Python 스크립트를 만들고, 이를 cron으로 자동 실행하는 실습을 진행했다.

이번 글에서는 지난번에 잠깐 사용했던 명언 사이트인 http://quotes.toscrape.com을 다시 활용할 것이다.

지난 글에서는 이 사이트에서 명언 한두 개를 출력해보는 수준으로 끝났다면, 이번에는 수집한 데이터를 pandas로 가공해 CSV 파일로 저장하고, 이를 cron과 연동해 정기 저장되는 구조로 발전시켜 보도록 하자.


1️⃣ 웹에서 명언(quote) 수집하기

명언을 출력해주는 웹사이트 http://quotes.toscrape.com 에서
첫 번째 페이지의 명언 데이터를 수집해보자.

# save_quotes.py
import requests
from bs4 import BeautifulSoup
import pandas as pd
from datetime import datetime

def scrape_quotes():
    url = "http://quotes.toscrape.com"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    quotes_data = []
    quotes = soup.select(".quote")
    for quote in quotes:
        text = quote.select_one(".text").get_text(strip=True)
        author = quote.select_one(".author").get_text(strip=True)
        quotes_data.append({"quote": text, "author": author})

    return quotes_data

이 함수는 명언(text)작가(author)를 추출해 리스트 형태로 반환한다.



2️⃣ 수집한 데이터를 pandas로 CSV 저장하기

수집한 데이터를 .csv로 저장하기위해 pandas.DataFrame으로 변환 후 to_csv() 함수를 사용하자.

def save_to_csv(data):
    df = pd.DataFrame(data)

    # 파일명에 날짜 정보 포함 (예: quotes_2025-08-04.csv)
    now = datetime.now().strftime("%Y-%m-%d")
    filename = f"quotes_{now}.csv"

    df.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f"[{now}] Saved {len(df)} quotes to {filename}")

✅ 파일명에 날짜가 들어가므로 매일 실행해도 덮어쓰지 않고 새로운 파일이 생성된다.


3️⃣ 파이썬 스크립트 실행 흐름: 언제 이 코드가 실행되는가?

지금까지 우리는 다음 두 개의 함수를 만들었다:

  • scrape_quotes() : 명언을 웹에서 수집

  • save_to_csv() : 수집한 데이터를 날짜 기반 CSV 파일로 저장

그렇다면 이 두 함수는 언제 실제로 실행되는 걸까?

✅ 바로 아래에 있는 이 구문 덕분이다.

if __name__ == "__main__":
    data = scrape_quotes()
    save_to_csv(data)

이 구문은 파이썬에서 매우 자주 쓰이는 방식이다.
의미를 풀이하면 다음과 같다.

save_quotes.py 파일이 다른 데서 불려온(import) 게 아니라,
터미널에서 직접 실행된 경우에만 아래 코드를 실행해라.”

4️⃣ 전체 코드 및 설명

# save_quotes.py

import requests                      # 웹 요청을 보내기 위한 라이브러리
from bs4 import BeautifulSoup       # HTML 파싱용 라이브러리
import pandas as pd                 # CSV 저장을 위한 데이터 처리 라이브러리
from datetime import datetime       # 날짜 정보를 위한 모듈

# 1. 명언 데이터 수집 함수
def scrape_quotes():
    url = "http://quotes.toscrape.com"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    quotes_data = []
    quotes = soup.select(".quote")
    for quote in quotes:
        text = quote.select_one(".text").get_text(strip=True)      # 명언 텍스트 추출
        author = quote.select_one(".author").get_text(strip=True)  # 작가 이름 추출
        quotes_data.append({"quote": text, "author": author})      # 딕셔너리 형태로 저장

    return quotes_data

# 2. CSV 저장 함수
def save_to_csv(data):
    df = pd.DataFrame(data)  # 리스트 데이터를 DataFrame으로 변환
    now = datetime.now().strftime("%Y-%m-%d")  # 날짜 포맷 예: 2025-08-04
    filename = f"/mnt/c/cron_std/quotes_{now}.csv"  # 저장 경로 및 파일명
    df.to_csv(filename, index=False, encoding='utf-8-sig')  # CSV 파일로 저장
    print(f"[{now}] Saved {len(df)} quotes to {filename}")  # 실행 로그 출력

# 3. 실제 실행 흐름
if __name__ == "__main__":
    data = scrape_quotes()     # 명언 데이터 수집
    save_to_csv(data)          # CSV로 저장



5️⃣ 크론(cron)에 연결하기 : 자동으로 실행되게 만들기

지난 글에서 cron을 사용해 Python 스크립트를 정해진 시간마다 실행하는 구조를 만들었었다.

이번에는 거기에 우리가 작성한 save_quotes.py를 연결해서 명언 데이터를 매일 자동으로 수집하고 저장하는 작업을 실제로 자동화해보자.

🧩 먼저, 저장한 Python 파일의 위치를 확인하자

예시에서는 save_quotes.py 파일이 WSL 홈 디렉토리에 있다고 가정한다.

/home/ttneck/save_quotes.py
  
# 또는 직접 확인하고 싶다면 WSL 터미널에서 아래 명령어 입력:

ls ~/

⏰ 크론 등록하기

크론은 지정한 시간마다 특정 명령어를 자동 실행해주는 유닉스 기반 스케줄러다.

우리가 만든 py파일은 매일 데이터를 가져오는 것을 가정했으나 우리는 바쁜 사람들이다. 1분마다 자동 실행하도록 등록해보자. (테스트용 설정)

crontab -e
  
# 그리고 가장 아래에 다음 줄을 추가:
  
* * * * * /usr/bin/python3 /home/ttneck/save_quotes.py >> /home/ttneck/cron.log 2>&1

✅ 잘 실행되고 있는지 확인해보자.

# 1분 정도 기다린 후, 아래 명령어로 로그 확인:
cat ~/cron.log
  
# 혹은 실제로 CSV 파일이 저장되었는지 확인:
ls /mnt/c/cron_std/

우리가 지정한 경로대로라면, C:\cron_std\quotes_2025-08-04.csv 같은 파일이 생겨야 정상이다.

* 보이는 것과 같이 파일과 로그를 확인할 수 있다.



🧠 오늘 한 것들

  1. 파이썬으로 웹 데이터 수집
    • requests로 HTML 요청
    • BeautifulSoup으로 명언과 저자 정보 파싱
    • pandas로 데이터프레임 구성 후 .csv 파일로 저장
  2. 파일명에 날짜를 붙여 매일 다른 파일 생성
    • datetime.now(), .strftime() 활용
    • 덮어쓰기 없이 날짜별 파일 저장 구조 완성
      • ex) quotes_YYYY-MM-DD.csv
  3. WSL 환경에서 파일을 윈도우 경로(C:)에 저장
    • /mnt/c/... 경로 지정 시 윈도우 드라이브에 접근 가능
    • C:\cron_std에 직접 저장하면 파일 탐색기로 확인 가능
  4. cron으로 스크립트를 자동 실행
    • crontab -e 명령어로 작업 예약
    • 테스트를 위해 * * * * *로 1분마다 실행
    • 실행 결과 로그는 >> cron.log 2>&1로 저장



✅ 마무리

오늘은 단순히 코드를 짜는 수준을 넘어 “내가 만든 파이썬 스크립트를 크론에 연결해 매일 자동으로 실행되게 만드는 과정”을 직접 따라해봤다.

단계별로 보면 이렇게 나눌 수 있다.

  • 파이썬으로 웹에서 명언 데이터 수집
  • 날짜별 .csv로 저장
  • 저장 경로를 윈도우(C드라이브)에 지정
  • cron으로 자동 실행 예약
  • 로그까지 저장해 결과 추적

스크립트 실행 → 결과 저장 → 로그 확인까지 모두 자동으로 이루어지는 구조를 만들었고, 이건 데이터 엔지니어링에서 반복되는 수집 작업의 출발점이기도 하다.

특히 WSL 환경에서 크론을 돌리는 실습은 실무에서 윈도우 PC로도 유닉스 기반 자동화를 체험할 수 있는 매우 실용적인 방식이었다.



🔜 다음 시간에는?

지금은 매일 새로운 파일을 저장하는 수준이지만, 이제부터는 조금 더 ‘실무에 가까운 자동화 흐름’을 설계해볼 차례다.

예를 들어

  • 매일 실행되기 전 기존 파일이 있는지 확인하고 중복 방지

  • 수집된 CSV 파일을 DB에 자동으로 적재하거나

  • 실행 결과를 텔레그램/이메일로 알림 받는 구조 설계

  • 혹은 cron보다 더 유연한 Airflow로 확장하는 방법까지

단순 반복 작업을 넘어서, “운영 가능한 자동화 시스템”으로 발전시켜나가는 과정을 함께 해보자.

🔧 다음 글에서는 CSV → DB 저장 자동화까지 직접 구현해볼 예정이다.

profile
데이터 엔지니어(진) 터틀넥입니다.

0개의 댓글