GitHub Action을 활용한 데이터 수집 자동화 프로젝트

프로젝트 개요

매일 업데이트 되는 데이터를 제공하는 API를 사용하여 정보를 모니터링하거나, csv파일 형태로 저장하여 분석하기 위해서는 매일 직접 API 요청 결과를 확인해야 한다는 번거로움이 있다. 이를 해결하기 위한 방안으로 GitHub Action을 사용할 수 있다. GitHub Actions는 GitHub의 CI/CD 도구로, 저장소의 워크플로우를 자동화하는 강력한 기능을 제공한다. 이 프로젝트는 GitHub Actions를 사용해 자동으로 데이터가 업데이트되도록하고, 당일의 정보를 확인하거나 업데이트 된 데이터를 분석 등에 바로 사용할 수 있도록 하고자 하였다.

프로젝트 목표

이 프로젝트의 목표는 다음과 같다:

  1. 주기적인 데이터 수집 자동화 매일 혹은 주별 등 특정 주기에 따라 데이터를 자동으로 수집하고, 이를 분석에 사용할 수 있도록 레포지토리에 최신 데이터를 저장한다.
  2. API 호출을 통한 데이터 수집 공공 데이터 포털 API를 통해 최신 데이터를 호출하고, 이를 저장소에 자동으로 업데이트한다.
  3. GitHub Actions 워크플로우를 이용한 자동화 위 과정을 GitHub Actions를 사용하여 구축한다.

공공데이터포털 API를 사용한 데이터 수집

공공데이터포털은 정부, 공공기관, 지방자치단체 등에서 생성된 다양한 데이터를 누구나 무료로 접근하고 활용할 수 있도록 제공하는 플랫폼이다. 사용자가 편리하게 데이터를 활용할 수 있도록 API 형태로 데이터를 제공한다.

def request_price_api(date, code):
    url = 'http://www.kamis.or.kr/service/price/xml.do?action=dailyPriceByCategoryList'
    p_cert_key = 'PRICE_API_KEY'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64)'
                             'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132'
                             'Safari/537.36'}

    params = f'&{quote_plus("p_cert_key")}={p_cert_key}&' + urlencode({
        quote_plus("p_cert_id"): "3749",
        quote_plus("p_returntype"): "json",
        quote_plus("p_product_cls_code"): "01",
        quote_plus("p_item_category_code"): f"{code}",
        quote_plus("p_regday"): date,
        quote_plus("p_convert_kg_yn"): 'N',
    })


    result = requests.get(url + params, headers=headers)

    js = json.loads(result.content)
    each_data = pd.DataFrame(js['data']['item'])
    return each_data

GitHub Action 워크플로우 설정

1. yaml 파일 작성

name: Update Price Data

on:
  schedule:
    - cron: '00 16 * * *'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Repository
      uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.x

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install ruff pytest
        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi

    - name: Run Python Script
      run: python update_price.py
      env:
        MY_GITHUB_TOKEN: $
        PRICE_API_KEY: $

    - name: Commit and push changes
      run: |
        git config user.email "jyihaan4@naver.com"
        git config user.name "Jung Jaeyoung"
    
        git add ./output/price/*.csv
        git clean -xdf
        git commit -m "Update Data - $(TZ='Asia/Seoul' date +'%Y-%m-%d')"
        git push  

| 구분 | 기능 | |———-|————————————————————————| | Name | - 워크플로우 이름 설정
- GitHub Actions 탭에서 워크플로우 목록에 표시 | | On | - 워크플로우를 실행할 트리거 정의
- push, pull_request 등 다양한 이벤트에 대해 워크플로우 실행 | | Jobs | - 워크플로우에서 실행되는 작업 정의
- 각 작업은 병렬로 실행되며, 서로 다른 머신에서 실행 가능 | | Runs-on | - 작업을 실행할 가상환경 설정 | | Steps | - 작업 내에서 실행되는 개별 단계 정의
- 각 단계는 순서대로 실행 | | Uses | - 외부 GitHub Actions을 가져와 사용 가능
- 저장소를 체크아웃하거나 Python 환경을 설정하는 데 사용 |
| With | - 외부 GitHub Actions에 인자를 전달할 때 사용 | | If | - 조건부로 단계를 실행 | | Env | - 작업의 환경 변수 설정 | | secretes | - GitHub Secrets에 저장된 민감한 정보 사용 |

2. GitHub 설정

‘Settings > Actions > General’에서 작업에 대한 권한을 할당하여야 한다.

image

‘Settings > Secrets and variables > Actions’에서 필요한 Secret 변수를 등록해야 한다.

image

결과

다음과 같이 issue 에 자동으로 등록된다.

image

다음과 같이 데이터를 자동으로 commit 하였다.

image

GitHub에 commit된 csv파일에서 raw 버튼을 클릭하고, 이 url을 복사하여 pd.read_csv()하면 바로 데이터 분석에 사용할 수 있다.