지난 글에서는 WSL 환경에서 crontab을 활용해 Python 스크립트를
정해진 시간마다 자동 실행하는 과정을 실습해봤다.
즉, 우리는 “코드를 자동으로 돌릴 수 있는 환경”을 만들었다. 하지만 여기서 끝나면 자동화의 진짜 효용은 아직 절반이다.
데이터를 자동으로 수집했다면, 이제는 그 데이터를 저장하고 쌓아갈 구조가 필요하다.
이번 글에서는 수집된 데이터를 자동으로 파일(CSV)로 저장하는 과정을 구현해보자.
지난 글에서는 hello.py처럼 단순한 문자열을 출력하는 Python 스크립트를 만들고, 이를 cron으로 자동 실행하는 실습을 진행했다.
이번 글에서는 지난번에 잠깐 사용했던 명언 사이트인 http://quotes.toscrape.com을 다시 활용할 것이다.
지난 글에서는 이 사이트에서 명언 한두 개를 출력해보는 수준으로 끝났다면, 이번에는 수집한 데이터를 pandas로 가공해 CSV 파일로 저장하고, 이를 cron과 연동해 정기 저장되는 구조로 발전시켜 보도록 하자.
명언을 출력해주는 웹사이트 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)를 추출해 리스트 형태로 반환한다.
수집한 데이터를 .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}")
✅ 파일명에 날짜가 들어가므로 매일 실행해도 덮어쓰지 않고 새로운 파일이 생성된다.
지금까지 우리는 다음 두 개의 함수를 만들었다:
scrape_quotes() : 명언을 웹에서 수집
save_to_csv() : 수집한 데이터를 날짜 기반 CSV 파일로 저장
그렇다면 이 두 함수는 언제 실제로 실행되는 걸까?
if __name__ == "__main__":
data = scrape_quotes()
save_to_csv(data)
이
save_quotes.py파일이 다른 데서 불려온(import) 게 아니라,
터미널에서 직접 실행된 경우에만 아래 코드를 실행해라.”
# 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로 저장
지난 글에서 cron을 사용해 Python 스크립트를 정해진 시간마다 실행하는 구조를 만들었었다.
이번에는 거기에 우리가 작성한 save_quotes.py를 연결해서 명언 데이터를 매일 자동으로 수집하고 저장하는 작업을 실제로 자동화해보자.
예시에서는 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 같은 파일이 생겨야 정상이다.
* 보이는 것과 같이 파일과 로그를 확인할 수 있다.
requests로 HTML 요청BeautifulSoup으로 명언과 저자 정보 파싱pandas로 데이터프레임 구성 후 .csv 파일로 저장datetime.now(), .strftime() 활용/mnt/c/... 경로 지정 시 윈도우 드라이브에 접근 가능C:\cron_std에 직접 저장하면 파일 탐색기로 확인 가능crontab -e 명령어로 작업 예약* * * * *로 1분마다 실행>> cron.log 2>&1로 저장오늘은 단순히 코드를 짜는 수준을 넘어 “내가 만든 파이썬 스크립트를 크론에 연결해 매일 자동으로 실행되게 만드는 과정”을 직접 따라해봤다.
단계별로 보면 이렇게 나눌 수 있다.
스크립트 실행 → 결과 저장 → 로그 확인까지 모두 자동으로 이루어지는 구조를 만들었고, 이건 데이터 엔지니어링에서 반복되는 수집 작업의 출발점이기도 하다.
특히 WSL 환경에서 크론을 돌리는 실습은 실무에서 윈도우 PC로도 유닉스 기반 자동화를 체험할 수 있는 매우 실용적인 방식이었다.
지금은 매일 새로운 파일을 저장하는 수준이지만, 이제부터는 조금 더 ‘실무에 가까운 자동화 흐름’을 설계해볼 차례다.
예를 들어
매일 실행되기 전 기존 파일이 있는지 확인하고 중복 방지
수집된 CSV 파일을 DB에 자동으로 적재하거나
실행 결과를 텔레그램/이메일로 알림 받는 구조 설계
혹은 cron보다 더 유연한 Airflow로 확장하는 방법까지
단순 반복 작업을 넘어서, “운영 가능한 자동화 시스템”으로 발전시켜나가는 과정을 함께 해보자.
🔧 다음 글에서는 CSV → DB 저장 자동화까지 직접 구현해볼 예정이다.