일일 데이터 수집 자동화: 매일 가져오기 예약하기

요청을 파일에 추가 기록하는 작은 스크립트에 넣고 cron으로 하루에 한 번 실행하세요. 금과 USD/IDR을 매일 가져오면 하루 요청 2건, 한 달에 약 62건입니다. 일별 값에는 00:00 UTC 타임스탬프가 붙으므로 UTC 자정 이후에 실행하세요.

API로 수집 일정 잡기

금 요청과 환율 요청에는 같은 Narwhal API 키를 사용하세요. 스크립트는 각 요청을 Authorization: Bearer YOUR_KEY 헤더와 함께 https://api.narwhalapi.com에 보내고, 반환된 값을 daily.csv에 추가합니다. 이 파일에는 조회 시각과 USD 금 가격, USD/IDR 환율이 함께 남습니다.

  1. 키를 환경 파일에 넣기 무료 키를 받아 ~/.narwhal.env에 export NARWHAL_API_KEY=...를 넣으세요. 본인만 읽을 수 있도록 파일 모드를 600으로 설정합니다. 예약된 명령은 Python을 시작하기 전에 이 파일을 불러옵니다.
  2. 일일 수집 스크립트 저장하기 /home/me/daily_pull.py로 저장하세요. daily.csv가 새 파일이면 열 이름을 쓰고, 요청이 성공한 뒤 run_at_utc, xau_usd, usd_idr 행을 추가합니다.
    Python, 금과 USD/IDR을 CSV에 추가
    #!/usr/bin/env python3
    """Append today's gold price and USD/IDR rate to daily.csv. Run it once a day."""
    
    import csv, os, pathlib
    from datetime import datetime, timezone
    import requests
    
    API = "https://api.narwhalapi.com/v1"
    H = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}
    gold = requests.get(f"{API}/commodities/spot/XAU/USD", headers=H, timeout=10)
    fx = requests.get(
        f"{API}/fx/rates/USD", params={"currencies": "IDR"}, headers=H, timeout=10
    )
    gold.raise_for_status()
    # a failed run exits non-zero, so cron mail or your monitor sees it
    fx.raise_for_status()
    
    path = pathlib.Path("daily.csv")
    new = not path.exists()
    with path.open("a", newline="") as f:
        w = csv.writer(f)
        if new:
            w.writerow(["run_at_utc", "xau_usd", "usd_idr"])
        w.writerow(
            [
                datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
                gold.json()["price"],
                fx.json()["rates"][0]["rate"],
            ]
        )
  3. 일일 cron 항목 추가하기 UTC 서버에서는 이 crontab 항목으로 UTC 자정 직후에 수집을 실행합니다. 키는 환경 파일에서 읽고 스크립트 출력과 오류는 /home/me/daily_pull.log로 보냅니다.
    UTC 서버의 일일 cron 항목
    15 1 * * * . $HOME/.narwhal.env && /usr/bin/python3 /home/me/daily_pull.py >> /home/me/daily_pull.log 2>&1

각 요청의 타임아웃은 10초입니다. 스크립트는 응답의 price 필드에서 금 가격을, rates의 rate 필드에서 USD/IDR을 읽어 두 값을 같은 행에 씁니다. 이후 실행에서는 파일에 이어서 추가하며, 열 헤더는 파일이 새로 만들어질 때만 씁니다.

crontab에는 환경 파일의 경로를 넣고, 키는 NARWHAL_API_KEY에 그대로 둡니다. Narwhal은 데이터 API 전반에서 계정 하나, API 키 하나, 크레딧 잔액 하나를 사용하므로 예약된 금과 환율 요청은 그 잔액에서 차감됩니다. 응답에는 남은 요청 빈도 허용량을 나타내는 X-RateLimit-Remaining이 포함됩니다.

run_at_utc 열에는 스크립트가 행을 기록한 시각이 담깁니다. 이를 가져온 시각으로 읽으세요. 일별 값에는 00:00 UTC 타임스탬프가 붙으므로 UTC 자정 이후에 파일 추가를 예약하면 일일 작업이 데이터와 같은 시간 기준을 유지합니다.

코드 없이 플로 예약하기

일일 플로는 n8n Schedule Trigger, Make “Schedule”, Zapier “Schedule by Zapier”로 시작할 수 있습니다. 결과 저장에는 Google Sheets 행 추가를 사용하세요. 스크립트의 CSV 파일 대신 스프레드시트에 값을 남기고 싶을 때 쓸 수 있는 저장 위치입니다.

스케줄 트리거가 매일 플로우를 시작하고, 행 추가가 그 조회 결과를 저장합니다. 일별 값에는 00:00 UTC 타임스탬프가 붙으므로 타이밍을 UTC에 맞추세요. 예약된 플로우는 스크립트와 같은 일일 타이밍을 따르며, 스케줄러와 저장은 플로우 안에서 처리됩니다.

스크립트를 예약 실행할 때는 Windows 작업 스케줄러, macOS launchd, 클라우드 스케줄러도 선택할 수 있습니다. 매일 하는 작업은 여전히 금 요청과 USD/IDR 요청입니다. 스크립트를 돌릴 환경에 맞는 스케줄러를 쓰거나, 서버가 없다면 예약 플로를 사용하세요.

상황별 계산 방법

상황적합한 방법이유
항상 켜 둔 서버 또는 노트북cron그 컴퓨터에서 일일 스크립트 실행하기
서버 없음예약 실행하는 n8n, Make, Zapier일일 플로를 시작해 결과를 Google Sheets에 추가하기
데이터가 시간이 아니라 이벤트로 바뀔 때웹훅이벤트 기반 방식으로 데이터 받기

cron은 어느 시간대로 동작하나요?

cron은 서버의 시간대를 따릅니다. date로 서버 시각을 확인하고, 데이터와 맞추려면 UTC를 사용하세요. 이 crontab 항목은 UTC 서버를 전제로 하며, 자정 직후라는 실행 시점도 그 시간대에 따라 달라집니다.

FX 일별 환율에는 00:00 UTC 타임스탬프가 붙습니다. 이 타임스탬프와 스크립트의 run_at_utc 열은 서로 다른 시각을 나타냅니다. 일별 환율에는 데이터 타임스탬프가 있고, CSV에는 가져온 시각이 기록됩니다. 상품과 FX 가격은 실시간이므로 각 행에는 스크립트를 실행한 순간의 가격이 담깁니다.

일일 실행이 실패하면 어떻게 하나요?

요청이 실패하면 스크립트는 0이 아닌 코드로 종료하고 아무것도 추가하지 않습니다. 두 요청이 모두 성공한 뒤에야 daily.csv를 열어 행을 추가합니다. 따라서 요청이 실패한 실행은 파일에 행을 남기지 않습니다.

cron 메일이나 모니터로 0이 아닌 종료 코드를 감지할 수 있습니다. 알림을 추가하거나 실패 후 스크립트를 다시 실행하세요. 원자재 가격 알림은 관련된 알림 튜토리얼입니다. cron 항목은 출력과 오류도 명령에 적힌 로그 파일로 보냅니다.

요청 제한 오류에서는 Retry-After가 포함된 429 rate_limit_exceeded와, 크레딧을 추가할 때까지 기다려야 하는 402 insufficient_credits를 구분하세요. 예약 수집에서의 처리는 캐싱과 429 처리를 참고하세요. 오류 응답은 application/problem+json이며 status, code, detail, request_id를 담고 있습니다.

계산 예시: 한 달 동안 매일 수집

매일 수집할 때마다 금 요청과 USD/IDR 요청을 세고, 그 달의 일수를 곱하세요. 하루 2회 요청에 31일이면 스크립트는 62회 호출하며, 1,000회당 $2 기준으로 약 $0.12입니다.

계산결과
금 요청 + USD/IDR 요청하루 2회 요청
2회 요청 × 31일62회 요청
62 × $2 ÷ 1,000약 $0.12

2026년 10월 24일, 조회 시각이 2026-10-24T12:17:15Z인 행에서 금은 3996.00 USD, USD/IDR은 18107.8입니다. CSV에서는 조회 시각이 먼저 오고, 그 뒤에 헤더에 정한 순서대로 금 가격과 환율이 이어집니다.

2026년 10월 24일 CSV 행
run_at_utc,xau_usd,usd_idr
2026-10-24T12:17:15Z,3996.00,18107.8

에 게시되었습니다.

다음 단계