서울대학교 식단 관리 서비스 식샤의 웹 크롤러입니다.
- Python 3.12
- UV (Python package manager)
GitHub Flow + Issue based branch 방식을 사용합니다.
- GitHub Flow는 여기 참고
- 개발이 필요한 사항은 우선 issue에 올리고, 해당 issue 번호로 branch를 만듭니다.
- 예시 브랜치) feat/14-crawling-debugging
- 개별 브랜치에서 dev로 PR -> approve 받기 -> squash merge -> dev 정상 동작 확인 -> dev에서 prod로 pr -> merge commit -> prod 정상 동작 확인
- auto delete head branch 옵션을 꺼두었습니다. 개발이 완료된 개별 브랜치는 꼭 직접 삭제해주세요.
- Google Python Style Guide
- Ruff - An extremely fast Python linter and formatter
# Check and fix code styles using ruff
make lint
# or uv run ruff check .# Format all codes using ruff
uv run ruff format .가상환경을 활성화하고 필요한 패키지를 설치합니다.
# Install uv if not already installed
# 별도로 uv 설치
pipx install uv
# pip install uv
# Install dependencies and activate virtual environment
uv sync
source .venv/bin/activate # On Windows: .venv\Scripts\activatepyproject.toml 파일의 패키지 목록을 변경한 경우, 아래 명령을 통해 uv.lock 파일을 최신화합니다.
uv lock식당과 메뉴들에 대한 정보는 정기적으로 (새벽 5시, dev 환경의 경우 매주 월요일만 진행) 크롤링 후 RDS siksha DB 에 반영됩니다.
이후 크롤링 결과는 슬랙의 #siksha-noti (prod), #siksha-noti-staging (dev) 채널로 전송됩니다.
로컬에서 크롤러가 잘 동작하는지 확인하고 싶다면, 아래와 같이 실행합니다.
python3 handler.py --restaurant {식당이름(일부)} --date 20250916
--restaurant(-r) 인자는 필수
--date(-d) 인자는 옵션. 연월일(20221106) 형식으로 date를 넣으면 그 날 식단만 나오고, 안쓰면 긁은거 다 나옴.
- 주의) 크롤링 코드는 동일, 단순히 필터링해주는 방식임. 남용하면 서버에 부하줄 수 있음.
- 주의) 예외처리 되어있지 않음. argument 잘못 줄 경우 에러 발생 가능성
로컬에서 빌드가 잘 되는지 테스트하고 싶다면, 아래와 같이 실행합니다. (GitHub Workflow 참고)
docker build -t {이미지이름} --build-arg {KEY}={VALUE} - dev, prod 브랜치에 push시 깃헙 액션을 통해 ECR에 이미지 푸시됩니다.
- ECR에 이미지 태그 변화를 aws lambda에서 감지하여 waffle-world 레포의 이미지 버전이 업데이트
- Kubernetes 크론잡이 정해진 스케줄에 따라 식당 크롤링을 실행합니다.