Skip to content

Latest commit

 

History

History
80 lines (59 loc) · 2.21 KB

File metadata and controls

80 lines (59 loc) · 2.21 KB

CLAUDE.md

설치

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 8000

파일 구조

main.py       — FastAPI 서버 + APScheduler (주간 스케줄러)
scraper.py    — 스크래핑 코어 + CLI 진입점
models.py     — Product 데이터 클래스
parsers.py    — 파싱 함수 (이름/수량, 가격, 평점)
storage.py    — 저장 함수 (JSON / CSV / SQL)

API 서버 실행

uvicorn main:app --host 0.0.0.0 --port 8000
  • GET / — 스케줄러 상태 및 마지막 실행 결과
  • POST /run — 수동으로 스크래핑 즉시 실행

스케줄: 매주 월요일 자정 (KST) 자동 실행

CLI 단독 실행

# 기본: 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

스크래퍼 구조

데이터 흐름:

  1. scrape_url() — 브라우저 실행, 전체 페이지 순회
  2. _page_url() — 페이지 URL 생성 (1페이지 → 기본 URL, N페이지 → ?page=N-1)
  3. 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