pip3 install -r requirements.txt
python3 -m playwright install chromium.env.example을 복사해서 환경별 파일 생성:
cp .env.example .env.local # 로컬 개발
cp .env.example .env.production # 프로덕션서버 실행 시 APP_ENV로 환경 선택 (기본값: local):
APP_ENV=production uvicorn main:app --host 0.0.0.0 --port 8000main.py — FastAPI 서버 + APScheduler (주간 스케줄러)
scraper.py — 스크래핑 코어 + CLI 진입점
models.py — Product 데이터 클래스
parsers.py — 파싱 함수 (이름/수량, 가격, 평점)
storage.py — 저장 함수 (JSON / CSV / SQL)
uvicorn main:app --host 0.0.0.0 --port 8000GET /— 스케줄러 상태 및 마지막 실행 결과POST /run— 수동으로 스크래핑 즉시 실행
스케줄: 매주 월요일 자정 (KST) 자동 실행
# 기본: products/<YYYY-MM-DD>/<카테고리>.json + SQL 저장
python3 scraper.py "https://www.costco.co.kr/Foods/RiceGrains/c/cos_10.1"
# 출력 경로 직접 지정
python3 scraper.py "https://www.costco.co.kr/Foods/RiceGrains/c/cos_10.1" --output products.csv데이터 흐름:
scrape_url()— 브라우저 실행, 전체 페이지 순회_page_url()— 페이지 URL 생성 (1페이지 → 기본 URL, N페이지 →?page=N-1)scrape_page()— 스크롤로 lazy-load 트리거 후li.product-list-item파싱
CSS 셀렉터 (costco.co.kr Angular 앱):
| 필드 | 셀렉터 | 폴백 |
|---|---|---|
| 상품 컨테이너 | li.product-list-item |
li[class*='product'] |
| 상품명 | a.lister-name .notranslate |
a.lister-name |
| 가격 | .original-price .product-price-amount |
— |
| 평점 | .star-ratings-css[aria-label] |
— |
| 이미지 | picture source[type='image/webp'] |
picture img |
Product 스키마:
name, quantity, price, rating, review_count, image_url, product_url
SQL 스키마 (products 테이블):
name, quantity, price, rating, review_count, image_url, product_url, created_at